LeetCode 劍指 Offer 65. 不用加減乘除做加法

IT奶牛發表於2020-11-22

原題連結
思路:不讓使用一般加減運算子號當然是想到位運算。

  1. int 型別數在計算機中是使用補碼存放,負數正數的加減規則一樣,在計算的時候把有符號數看做無符號數計算,不然會報負值左移錯誤。
  2. 兩個二進位制數異或運算得到每一位進位以後剩下的,例如:二進位制1與1異或,結果是二進位制10,剩下的0。這一步結果是 ax。
  3. 兩個二進位制數與運算得到結果,表示這一位是否產生進位,如果產生進位,進位對應的是更高一位,對齊的操作是讓二進位制數左移一位。這一步結果是 bx。
  4. 然後再把 ax 和 bx 相加,重複操作2、操作3。
  5. 結束的標誌是不在有任何進位產生,即bx的值為0

給出程式碼:

class Solution {
public:
    int add(int a, int b) {
        while( b != 0){
            int ax = a^b;
            int bx = unsigned (a & b) << 1;
            a = ax;
            b = bx;
        }
        return a;
    }
};

相關文章