問題:
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;
}
};