2017-01-09 153 views
1

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

// 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整数位的数量。

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

+0

@djxak你能告诉我应该看哪篇文章的哪一部分?看起来不相关。 –

+0

@djxak你说的是绝对的,完整的和完全的垃圾。这是一个关于'BigDecimal'中Karatsuba乘法的Java问题。它与Javascipt或全局错误处理完全没有任何关系。 – EJP

+0

是不是上面的评论回答这个问题?左移是乘以2. – djxak

回答

0

Arithmetic shift

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