题目
371. 两整数之和
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:
输入: a = -2, b = 3
输出: 1
思路
不用+、-,那就用位运算的符号来进行加法运算。
异或运算已经很接近加法运算了:
如下
0011
0101 ^
————
0110
相同为0,相异为1。
上面的结果是,加法得到的不考虑进位的中间结果A。但是加法的最终结果是需要考虑进位的。加法用异或运算,这个很容易想到,只是要想怎么进位?
我们将加法的最终结果分为:非进位的加法中间结果A,进位数B。什么进位数呢?先将两个数进行相与,得到如下:
0011
0101 &
————
0001
只是位置不对,进位数应该再往左移一位,所以是0010。
综上,将A和B又进行加法运算,即可得到最终结果。由此看来,这个用位运算符号进行加法运算需要递归下去算A和B的和。直到进位数为0,说明加法运算结束啦,可以直接返回结果A了。
class Solution {
public int getSum(int a, int b) {
return b == 0 ? a : getSum(a ^ b,(a & b) << 1);
}
}