我找到了一些代码,使用XOR和AND添加两个数字而不使用任何算术运算符。
我知道x ^ y等于总和,而x& y等于进位。但是我不明白为什么必须左移?我对左按位移位的了解与乘以2相同。为什么进位乘以2?
public static int add(int x, int y) {
// Iterate till there is no carry
while (y != 0)
{
// carry
int carry = x & y;
// Sum
x = x ^ y;
y = carry << 1;
}
return x;
}
任何指导意见。
答案 0 :(得分:4)
让我们尝试两个小整数x = 5,二进制当量为101,y = 1,二进制当量为001。
现在,为什么我在谈论二进制或更具体,想要处理位?因为XOR是一个有点明智的操作。
因此,如果在x和y之间运行XOR运算,结果如下:
x = x ^ y = 101 ^ 001 = 100(十进制:4)
看,只是两个数字之间的异或操作不能给我们总和。 (5和1之和应为6,而不是4)我们使用进位,得到精确的总和。实际上,算法是以某种方式设计的,因此它为我们提供了正确的答案。
现在,让我们看看,如何使用此算法中的carry,给出正确答案。
从那以后,
carry = x&amp; y = 101&amp; 001 = 1(十进制1)
根据您的计划,y = carry&lt;&lt; 1;
因此,y现在将变为= 001&lt;&lt; 1 = 010(十进制:2)
循环将继续运行,直到y变为零。
如果再次运行循环(因为y = 2而不是零)
x = x ^ y = 100 ^ 010 = 110(十进制:6)
carry = x&amp; y = 100&amp; 010 = 0(十进制0)
现在,x和y的新值之间的XOR是6,它恰好是5和1的总和。看看进位,它的值现在是0。
我们的y现在也会变为0,因为右移0也会给我们0.因为y现在为零,循环将不再运行,我们通过返回x获得总和!