371. 两整数之和
思路:a ^ b可以得到两数相加不进位的加法结果 (a & b) << 1可以得到两数相加产生的进位。While循环条件为:进位标志位是否为空
题目:不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:
输入: a = -2, b = 3
输出: 1
解题思路:
a ^ b可以得到两数相加不进位的加法结果
(a & b) << 1可以得到两数相加产生的进位
将不进位的加法结果与进位相加,即可得到两数相加的实际结果。需要注意的是:不进位加法结果与进位相加有可能再次造成进位,所以需要迭代处理,直到不再产生新的进位为止。
需要特别注意的是unsigned int的用法。
当a & b的结果是负数时,左移就会造成符号位的溢出,所以此处需要转换为unsigned int来避免可能出现的左移越界行为。
另外,使用long long代替unsigned int也是可以的。
class Solution {
public:
int getSum(int a, int b) {
while(b)
{
//来获得进位标志位
auto carry = ((unsigned int)(a & b) << 1);
//获得相加不进位产生的结果
a ^= b;
b = carry;
}
return a;
}
};