題目:
不使用運算符 + 和 - ,計算兩整數 a 、b 之和。
示例 1:
輸入: a = 1, b = 2
輸出: 3
示例 2:
輸入: a = -2, b = 3
輸出: 1
這裏需要運用的位運算就是 & 和 ^
舉例說明
a = 5 = 0101
b = 4 = 0100
^運算的計算法則是“相同爲0,不同爲1”
res1 = a ^ b = 0001 本來應該是9,但是與運算結果是1;
這裏就是所謂的無進位運算 因爲9 = 1001 是在原來的第三位進了“1”到第四位,相當於與運算的結果沒有進行進位操作。
如何進位呢:
我們需要先找到進位的位置所在
&運算的計算法則是“同爲1,則爲1,否則爲0”
- 進位的位置,很好理解,就是對應位都是1的時候就需要進位,這個位置自然就是進位的位置。
那麼“與”運算很好的契合 - 找到進位位置之後,我們需要將這裏的“1”往左移動一位,也就是進位操作了
res2 = (a & b) << 1 = 1000 先進行“與”運算,將結果只保留需要進位的前一個數字, 再左移1位(進位操作)
這個時候再將兩個結果進行“無進位加法”— ^運算,就會得到結果了
res = res1 ^ res2
算法可能會運行多次,因爲可能需要多次進位操作
那麼算法的終止條件呢,先分析一下不需要進位時的加法
如果不需要進位的時候 執行一下“&”運算:
0000 &
0001
結果爲:
0000
說明只要不再需要進位的時候,兩個數的與操作結果必爲0;
所以就可以寫出代碼了
public int getSum(int a, int b) {
int res = a ^ b;
int carry = (a & b) << 1;
while(carry != 0)
{
int temp = (res & carry) << 1;
res ^= carry;
carry = temp;
}
return res;
}