直接先贴代码

public class Test {
    public static void main(String[] args) {
        int a=22;
        int b=-29;
        while(b!=0){
            int Temp=a^b;
            b=(a&b)<<1; //有进位的值
            a=Temp;  //无进位的值
        }
        System.out.println("a+b="+a);
    }
}


下面我来叙述道理是什么,

首先我们看一下十进制的计算。

7+9=16;

7+9的个位为6 个位相加产生进位为1,我们用进位乘10 在加上个位值6.


那么我们如何计算2进制的呢,

如计算7+5

7用二进制表示为0111,而5表示为0101,

  0111

+ 0101

这时候我们的需要把进位算出来,只有1+1的情况下才有进位,所以我们就可以用&逻辑与的运算符。(0111)&(0101)=0101

所以进位的值为0101,

二进制对应值    8 4 2 1

二进制          0 1 0 1 

所以我们只需要先算有进位的那些位的相加和为 4*2+1*2,用移位操作符为 (0101)<<1 =4*2+1*2.

到此我们已经计算完了可以产生进位的那些位相加的和。

然后我们计算没有产生进位的那些位的和。我们知道对应位为0,则加为0,对应位一个为1一个为0,得结果为1.我们就可以用异或运算,相同为0,不同为1。这样我们就把产生进位的那些全屏蔽为0了。

(0101)^(0111)=0010.这时候对应的十进制位2,


我们可以看出这两部分相加,((0111)&(0101))<<1 + (0101)^(0111)=(4*2+1*2)+2=12.计算结果正确。但是我们不让用加怎么办呢?


我们就继续循环采用上述算法,直到进位值左移为0,意思就是没有进位了。