leetcode 371.两整数之和
题目描述
不使用运算符 + 和 - ,计算两整数 a 、b 之和。
示例 1:
输入: a = 1, b = 2
输出: 3
示例 2:
输入: a = -2, b = 3
输出: 1
解题思路
对于这个题目,不能使用运算符,很容易就会想到位运算的解法,至于怎么解,来分析一波,设a、b、c都表示只有一位的二进制数,计算a+b=c,那么结果如下表所示:
a | b | c |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
观察上面的表格,可以得出,如果不考虑进位操作的话,两个二进制相加的结果就是异或操作。所以对于加法运算相当于异或运算+进位。进位的结果是由两个数相与,并左移得到的。
在写代码的过程中需要注意,如果左移的数的最高位是符号位,有的编译器会报错
runtime error: left shift of negative value -2147483648 (solution.cpp)
所以在计算进位结果的时候,需要把两个数相与的结果强制转换为 unsigned int
类型。
class Solution {
public:
int getSum(int a, int b) {
while(b){
int carry = (unsigned int)(a&b)<< 1;
a = a^b;
b = carry;
}
return a;
}
};
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步