直接先贴代码
java
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); } }
下面我来叙述道理是什么,算法
首先咱们看一下十进制的计算。ide
7+9=16;spa
7+9的个位为6 个位相加产生进位为1,咱们用进位乘10 在加上个位值6.it
那么咱们如何计算2进制的呢,class
如计算7+5循环
7用二进制表示为0111,而5表示为0101,二进制
0111static
+ 0101di
这时候咱们的须要把进位算出来,只有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,意思就是没有进位了。