371. 两整数之和
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:
输入: a = -2, b = 3
输出: 1
解题思路
-
a ^ b
可以得到两数相加不进位的加法结果 -
(a & b) << 1
可以得到两数相加产生的进位
将不进位的加法结果与进位相加,即可得到两数相加的实际结果。需要注意的是:不进位加法结果与进位相加有可能再次造成进位,所以需要迭代处理,直到不再产生新的进位为止。
根据如上思路,可以比较容易地得到递归的解法:
递归
int getSum(int a, int b) {
if(!(a&b))return a^b;
return getSum(a^b,(a&b)<<1);
}
迭代
int getSum(int a, int b) {
while (b) {
auto carry = ((unsigned int)(a & b)) << 1;
a ^= b;
b = carry;
}
return a;
}