按位加法代码的直观解释

时间:2018-01-13 08:34:36

标签: bit-manipulation

我理解按位添加,我理解按位操作,但我很难理解为什么这段代码有效地添加了两个整数。

def Add(x, y):

    while (y != 0):

        carry = x & y
        x = x ^ y
        y = carry << 1

    return x

是否有人可以提供一个直观的解释,说明为什么这有效?我最初可以遵循最右边的逻辑。 I..e,有意义的是,进位项应该是最右边的x和y之间的结果和操作。然后,我们使用左移使得在最右边的第一次迭代计算的进位现在应用于第二次迭代的第二个最右位。在这一点上,我开始变得非常困惑(即,因为迭代&gt; 1上的新“y”是先前进位操作的结果,等等)。

如果深入了解这一点的人可以将其分解,我会很感激。

1 个答案:

答案 0 :(得分:0)

要了解它的工作原理,您必须记住如何添加两个数字。让我们举一个例子,如果我们在位表示中添加9和5,我们有:

carry    1
    9  1001
  + 5  0101
-----------
   14  1110

我们可以分解为两个步骤:

  • 首先我们只添加不带进位的数字
  • 将结果添加到结果

按位操作,这是:

  9  1001
^ 5  0101
---------
 12  1100

进位是&操作得到的,左移<<。 我们在这里:

  9  1001
& 5  0101
---------
     0001

0001 << 1 = 0010

指令

 carry = x & y
 x = x ^ y
 y = carry << 1

只会在没有进位的情况下添加xy。因此,我们将结果替换为x,并将y替换为y等于0