Java BigDecimal中的Karatsuba乘法实现

时间:2017-01-09 07:09:13

标签: java bit-manipulation bitwise-operators karatsuba

最近我试图为大数量实现Karatsuba乘法。然后我尝试将我的实现与Java BigInteger实现进行比较。我无法遵循这行代码:

// result = p1 * 2^(32*2*half) + (p3 - p1 - p2) * 2^(32*half) + p2
BigInteger result = p1.shiftLeft(32*half).add(p3.subtract(p1).subtract(p2)).shiftLeft(32*half).add(p2);

根据Karatsuba算法,result = (p1 * 10 ^ (2*half) ) + ( (p3 -p1 - p2) * 10 ^ (half)) + (p2)

由于实现使用了int [],我相信32是Java整数中的位数。

但我不明白涉及将位移到左侧的部分。你能帮助我了解这里发生了什么吗?

1 个答案:

答案 0 :(得分:0)

Arithmetic shift

算术移位可用作以2的幂执行有符号整数的乘法或除法的有效方法。在有符号或无符号二进制数上向左移n位会产生乘以2^n的效果。在2的补码二进制数上向右移n位会产生除以2^n的效果,但它总是向下舍入(向负无穷大)。