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

直接先貼代碼

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,意思就是沒有進位了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章