1. 程式人生 > >計算a+b的值但不能用+等運算符號,letCode的中一道題,

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

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的中一道題,