我理解按位添加,我理解按位操作,但我很难理解为什么这段代码有效地添加了两个整数。
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”是先前进位操作的结果,等等)。
如果深入了解这一点的人可以将其分解,我会很感激。
答案 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
只会在没有进位的情况下添加x
和y
。因此,我们将结果替换为x
,并将y
替换为y
等于0
。