面试中有人问我这个问题。我没有回答,但实际上我不知道它是如何工作的。

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。

希望这会帮助你。

10-07 23:41