面试中有人问我这个问题。我没有回答,但实际上我不知道它是如何工作的。
int add(int x, int y)
{
while (y != 0)
{
int carry = x & y;
x = x ^ y;
y = carry << 1;
}
return x;
}
我不是在问为什么会产生正确的答案...首先,为什么算法最终会停止?对我来说不是那么明显。
为了使其停止,
carry
必须成为0
。有人不能简单地解释吗? 最佳答案
line 1 : int carry = x & y;
line 2 : x = x ^ y;
line 3 : y = carry << 1;
如果x = 1; y = 2;
每个数字的二进制数:
0 = 00
1 = 01
2 = 10
3 = 11
对于第1行代码,
&(按位与)
如果两个操作数中都存在二进制AND运算符,则将一位复制到结果中
x是1 => 01
y是2 => 10
结果进位=> 00(0)
对于第2行代码,
^(按位XOR)
二进制XOR运算符将复制该位(如果在一个操作数中但不是在两个操作数中都置1)。
x是1 => 01
y是2 => 10
结果x为=> 11(3)
对于第3行代码,
可变进位需要向左移动1位,
因此,现在进位为0 => 00,并向左移1位表示进位现在为0。结果y为(0)。而while循环停止,因为y现在为0。
x的最终结果是3。
希望这会帮助你。