直接先貼代碼
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,意思就是沒有進位了。