跳到主要内容

剑指Offer 65 不用加减乘除做加法

1. 题目概览

点此直达题目

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

示例:

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

  提示:

  • a, b 均可能是负数或 0
  • 结果不会溢出 32 位整数

2. 解题思路

2.1 方法一:位运算模拟全加器

与、或、非、异或真值表:

AB&|~A^
000010
010111
100101
111100

1位二进制加法情况:

AB进位A+B
00000
01001
10001
11100

2位二进制加法情况:

AB进位A+B
000000000
000100001
001000010
001100011
010100010
011000011
011110000
101010000
101110001
111110010

我们发现,A+B=A^B,进位=A&B<<1,且最终的和为A^B+(A&B<<1)

由于不允许出现四则运算符号,我们的公式中的+号难以实现。但我们注意到,如果进位为0,那么A^B就是最终答案。因此,A&B << 1 这个进位就成了下一次加法的参数,如果他刚好进位为0,我们就得到了最终答案。

class Solution {
public int add(int a, int b) {
int sum = a;
int next = b;
// a + 0 = a,此时结束即可
while(next != 0) {
// & 获取进位
int c = (sum & next) << 1;
// ^ 可以将两个数相加,但会丢失进位
sum = sum ^ next;
// 由于丢失了进位,所以要加上,但不能使用+号,所以进行下一轮加法
next = c;
}
return sum;
}
}