跳转至

65. 不用加减乘除做加法

原题链接

题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。

示例:

1
2
输入: a = 1, b = 1
输出: 2

提示:

  • \(a\)\(b\) 均可能是 负数\(0\)
  • 结果不会溢出 \(32\) 位整数

思想

(全加器、位运算)   \(O(\log n)\)

参考十进制加法:

  1. 各位相加不进位运算,得到sum
  2. 做进位运算,得到carry
  3. sumcarry相加。

同样二进制加法也是如此。

  1. 两数做异或运算 ^,得到不进位的二进制和;
  2. 两数做与运算 &,然后左移一位,得到进位的运算结果;
  3. 不进位二进制和进位运算结果 相加。即重复\(1\)\(2\)操作,直到进位为 \(0\) 退出。

以上便是 全加器 的操作流程。

全加器示意图:

全加器


代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
class Solution {
public:
    int add(int a, int b) {
        while (b != 0) {
            int sum = a ^ b;
            int carry = (unsigned int)(a & b) << 1;
            // C++ 不支持负数移位,unsigned int 转化成无符号数。

            a = sum, b = carry;
        }
        return a;
    }
};
回到页面顶部