[leetcode] Sum of Two Integers--用位運算實現加法運算

問題:

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example:
Given a = 1 and b = 2, return 3.

分析:

這裏要求我們不能用加法、減法等運算符來實現加法運算。這裏應該使用位運算來實現加法運算,實際上,這也是計算機CPU內部實現加法運算的方案。
x XOR y真值表:
x y output
0 0 0
0 1 1
1 0 1
1 1 0

x AND y真值表:
x y output
0 0 0
0 1 0
1 0 0
1 1 1
我們可以基於以上的真值表用&和^運算來實現加法,每一位的^運算得到每一位上的不加進位的和,用&運算得到每一位的進位。

根據上面的分析,我們可以加x,y的每一位逐一進行XOR和AND運算,然後得到最後的結果。但如果要得到每一位,還要用到AND運算。
比方說00001010,
要取倒數第二位的值(1),其值爲:00001010&00000010
要取倒數第三位的值(0),其值爲:00001010&00000100
要取倒數第四位的值(1),其值爲:00001010&00001000

而且這樣還沒用真正得到每一位上的值,還要進行操作。

首先,我們通過對x和y進行&位運算,得出每一位上的進位。然後對x和y進行^位運算,得出沒有加進位的和。最後將所得的和當做新的x,所得的進位往左移一位(第零位的進位輸入爲0)當做新的y,繼續做上面的步驟,直到進位爲0,此時x中保存的就是我們要求的x和y的和了。

代碼:

class Solution {
public:
    int getSum(int a, int b) {
        int sum = a;
        int icarry = b;
        while(icarry!=0)
        {
             int tmp = sum;
             sum = tmp ^ icarry;
             icarry = (tmp&icarry)<<1;

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