LintCode之A+B問題

A+B問題
描述:給出兩個整數 aa 和 bb , 求他們的和。

算法思路

在十進制的加法中,例如 6+7,個位爲3,十位爲110,所以6+7 = 110 + 3 ,我們在二進制加法中也可以利用這種思想
即:先算每一位相加不進位,然後再算進位,進位需要乘以該位代表的倍數,在二進制裏就相當是左移一位

重要工具:

  • 利用抑或運算符計算出相加不進位的值 (抑或運算又稱"不進位加法")

  • 利用與運算符計算出進位的位置

  • 利用左移運算符將其進位

    •  a ^ b 可求出二進制不進位加法得到的值
      
    •  a & b 可求出二進制加法需要進位的位置
      
    •  向前進一位 --- 將需要進位的位置左移一位
      
    •  將不進位加法得到的值與進的位相加 有可能又會引起進位
      
    •  重複上述步驟 --- 遞歸 直到沒有進位 即b = 0 ,則a爲最終結果
      

舉例

 * 以3+5爲例:
 *      3的二進制0011
 *      5的二進制0101
 *
 * 3^5 = 0110  6
 * 3&5 = 0001  1
 * 1 << 1 = 0010 2
 *
 * 則轉換爲6+2,重複上述步驟
 *      6的二進制0110
 *      2的二進制0001
 * 6^2 = 0111  8
 * 6&2 = 0000  0
 *
 * 進位爲0,運算結束,結果爲8

代碼

    public static int getSum(int a, int b) {
        if(b == 0) {
            return a;
        }
        int c = a ^ b;
        b = (a & b) << 1;
        return getSum(c,b);
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章