You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中BigInteger与1.6快速乘除的最优方法及位运算技巧探究

用整数运算+位运算优化BigInteger与1.6的乘除

核心思路

1.6可精确表示为分数 8/5,我们可以把浮点运算转化为纯整数运算,结合位运算(移位替代乘/除2的幂)规避BigDecimal的开销,大幅提升大数字的运算速度。


乘法实现(替代BigDecimal.multiply)

原代码通过BigDecimal乘1.6后截断小数,等价于对BigInteger执行 (x * 8) / 5(向零取整)。利用左移3位替代乘8(8=2³),效率更高:

import java.math.BigInteger;
import java.math.RoundingMode;

public static BigInteger multiplyBy1Point6(BigInteger bigInt) {
    // 左移3位等价于乘以8,再除以5,向零取整(和原代码toBigInteger()行为一致)
    return bigInt.shiftLeft(3)
                 .divide(BigInteger.valueOf(5), RoundingMode.DOWN);
}

除法实现(替代BigDecimal.divide)

原代码除以1.6并使用RoundingMode.FLOOR(向下取整),等价于对BigInteger执行 (x * 5) / 8(向下取整)。BigInteger的shiftRight是算术移位,对正负整数都符合向下取整规则,可直接替代除以8:

import java.math.BigInteger;

public static BigInteger divideBy1Point6(BigInteger bigInt) {
    // 先乘5,再右移3位等价于除以8,自动符合向下取整规则
    return bigInt.multiply(BigInteger.valueOf(5))
                 .shiftRight(3);
    // 若需显式指定取整模式,也可写成:
    // return bigInt.multiply(BigInteger.valueOf(5))
    //              .divide(BigInteger.valueOf(8), RoundingMode.FLOOR);
}

性能优势说明

  • 避免了BigInteger转BigDecimal的额外开销,尤其是1000-10000字节级的超大数字,转换成本极高。
  • 位运算(移位)是硬件原生支持的高效操作,比普通整数乘除法更快。
  • 纯整数运算无需处理浮点精度的隐式逻辑,减少了BigDecimal的缩放、舍入等额外计算步骤。

内容的提问来源于stack exchange,提问作者TTho Einthausend

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:30:52