直接先贴代码
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,意思就是没有进位了。