1,题目要求
Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.
Example 1:
Input: a = 1, b = 2
Output: 3
Example 2:
Input: a = -2, b = 3
Output: 1
计算两个整数a和b的总和,但不允许使用运算符+和 - 。
2,题目思路
对于这道题,要求不使用运算符+和-实现a和b的加和。
一般来说,当我们取实现两个数字相加时,可以通过位运算的策略来去实现。
先我们可以分析人们是如何做十进制的加法的,比如是如何得出5+17=22这个结果的。实际上,我们可以分成三步的:
- 第一步只做各位相加不进位,此时相加的结果是12(个位数5和7相加不要进位是2,十位数0和1相加结果是1);
- 第二步做进位,5+7中有进位,进位的值是10;
- 第三步把前面两个结果加起来,12+10的结果是22,刚好5+17=22。
而对于二进制,我们也可以使用同样的方法:
- 首先,我们对a和b进行^位运算(异或),得出没有加进位的和sum。
- 然后,我们通过对a和b进行&位运算,得出每一位上的进位carry。
- 最后,因为是进位,所以我们需要将进位左移一位,然后再作为加数进行相加,令b = carry<<1,a = sum。直到b为0。
需要注意的是,我们需要将进位限制在32位,否则,对于a = 1,b = -1的情况,在LeetCode的测试会发生左移溢出错误。
3,代码实现
static auto speedup = [](){
ios::sync_with_stdio(false);
cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
int getSum(int a, int b) {
int sum = a;
while(b!=0){
sum = a^b;
int carry = a&b;
a = sum;
b = ((carry & 0xffffffff)<<1);
}
return sum;
}
};