計算a+b的值但不能用+等運算符號,letCode的中一道題,
阿新 • • 發佈:2018-03-09
a+b直接先貼代碼
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,意思就是沒有進位了。
計算a+b的值但不能用+等運算符號,letCode的中一道題,