LeeCode371 位運算之 “與”運算 + “異或”運算

題目:

不使用運算符 + 和 - ​​​​​​​,計算兩整數 ​​​​​​​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的時候就需要進位,這個位置自然就是進位的位置。
    那麼“與”運算很好的契合
  2. 找到進位位置之後,我們需要將這裏的“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;
    }

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