不使用运算符 ​​+​​ 和 ​​-​​ ​​​​​​​,计算两整数 ​​​​​​​​a​​ 、​​b​​ ​​​​​​​之和。

不能用+,-那就只有位运算了。

位运算中的加法

我们先来观察下位运算中的两数加法,其实来来回回就只有下面这四种:

0 + 0 = 0

0 + 1 = 1

1 + 0 = 1

1 + 1 = 0(进位 1)

异或:一个重要特性是无进位加法。

a = 5 = 0101

b = 4 = 0100

a ^ b 如下:

0 1 0 1

0 1 0 0

-------

0 0 0 1

与:找到进位的数,再左移一位。

那么问题就容易了,总结一下:

a + b 的问题拆分为 (a 和 b 的无进位结果) + (a 和 b 的进位结果)

无进位加法使用异或运算计算得出

进位结果使用与运算和移位运算计算得出

循环此过程,直到进位为 0



class Solution {
public int getSum(int a, int b) {
if (a == 0) {
return b;
}
if (b == 0) {
return a;
}
// (a & b)<<1 计算的是进位
// a ^ b 计算的是不带进位的加法
return getSum((a&b)<<1, a^b);
}
}