Java非算术加法器

Java非算术加法器,java,algorithm,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 &

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

}
publicstaticintadd(intx,inty){
//迭代直到没有进位
而(y!=0)
{
//携带
整数进位=x&y;
//总数
x=x^y;

y=carry让我们尝试使用两个小整数x=5,其中二进制等价物为101,y=1,其中二进制等价物为001

现在,为什么我要谈论二进制,或者更具体地说,要处理位?因为XOR是一种位操作

因此,如果在x和y之间运行XOR运算,结果如下:

x=x^y=101^001=100(小数点:4)

看,只是两个数字之间的异或运算并不能得到和。(5和1的和应该是6,而不是4)我们使用进位,来得到精确的和。实际上,算法是以某种方式设计的,所以它能给出正确的答案

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

既然

进位=x&y=101&001=1(小数点1)


根据你的程序,y=carry,尝试使用1和3,并将其绘制在一张纸上。你会看得更清楚。基本上,如果为这两个值设置了任何位,它们将导致“冒泡”向上一位。通过执行异或并将进位向上移位,您只需实现位加法。在十进制加法中,如果您将66+55相加,您将有一个从“一”列到“十”列的进位;同样,当您添加“十”列时。