計算a+b的值但不能用+等運算符號,letCode的中一道題,

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

相關文章
相關標籤/搜索