2014-09-26 89 views
4

我发现一些代码使用XOR和AND添加两个数字而不使用任何算术运算符。Java非算术加法器

我知道x^y等于总和,并且x等于进位。但我不明白为什么运动必须左移?我对左边的按位移的了解与乘以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; 

} 

任何指导赞赏。

+3

用1和3尝试并在一张纸上绘制。你会更清楚地看到它。基本上,如果有两个值都设置了位,它们将导致“冒泡”一位。通过执行XOR并移动进位,您只需按位添加即可。 – px1mp 2014-09-26 14:13:15

+5

在十进制数中,如果你加了66 + 55,那么你将有一列进位到十列的进位;同样,当你添加十列。 – duffymo 2014-09-26 14:14:09

回答

4

让我们试着用两个小整数x = 5,其等效二进制数是101和y = 1,其二进制数为001

现在,为什么我讲的二元或者更具体地说,要处理的位?因为XOR是一个明智的操作。

因此,如果运行x和y之间异或运算,其结果是以下:

X = X^Y = 101^001 = 100(十进制:4)

看到的,只是异或运算两个数字之间不给我们的总和。 (5和1的总和应该是6,而不是4)我们使用carry来得到确切的总和。实际上,该算法是以某种方式设计的,因此它给了我们正确的答案。

现在,让我们看看,如何使用这个算法中的进位,给我们正确的答案。

由于,

进位= X & Y = 101 & 001 = 1(十进制1)

根据你的程序,Y =携带< < 1;

所以,Y现在将成为= 001 < < 1 = 010(十进制:2)

循环将继续运行,直到ý变为零。

如果再次运行循环(因为Y = 2,而不是零)

X = X^Y = 100^010 = 110(十进制:6)

进位= X & Y = 100 & 010 = 0(十进制0)

现在,x和y的新值之间的XOR是6,其为5完全相同的总和和1.看进位,它的值现在为0。

我们现在也会变成0,因为右移0也会给我们0.由于y现在为零,循环将不再运行,我们通过返回x来获得我们的总和!