【发布时间】:2013-06-27 11:34:31
【问题描述】:
public int add(int a, int b){
while (b != 0){
int carry = (a & b) ;
a = a ^ b;
b = carry << 1;
}
return a;
}
这是使用按位运算计算两个整数之和的代码。
如果我手动/以编程方式计算,我发现它适用于每个整数。
但我无法弄清楚a 和carry 的中间值之间的任何关系。
为什么进位乘以 2 分配给b?
PS:我在这里找到了一个答案 Bitwise Multiply and Add in Java 但这是用于乘法而不是用于加法。
【问题讨论】:
-
你知道按位加法吗?
-
一个数字的进位被添加到下一个数字,当然。这个算法只是执行“你从学校知道的加法”,但有点混淆而不是仔细地逐个数字地进行 - 它先进行加法而不先进位(异或),然后分别添加龋齿(再次以相同的方式)直到不再有进位(因此它添加了通过添加进位生成的进位,然后是该添加生成的进位,依此类推)。这必须终止,因为进位只会“向左” - 所以每次迭代后至少有一个位是“固定的”。
-
@smsnheck 是的,我有,你的意思是什么?
-
@harold 非常感谢..实际上我发现很难相信下一位结转二进制文件是如何工作的,因为它从一开始就没有一点一点发生..
-
@Sunny 我想解释一下它是如何工作的,并想知道你的水平。所以对我来说解释起来会更容易(而不是写你已经知道的东西)。
标签: java bit-manipulation bitwise-operators