Java非算术加法器

时间:2014-09-26 14:07:24

标签: java algorithm

我找到了一些代码,使用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;

}

任何指导意见。

1 个答案:

答案 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获得总和!