371. Sum of Two Integers
题目描述
不用+和-计算两个数的和。
思路
本来想着就摁加,遍历然后++这样,但是考虑负数的话就不行了,遍历–。
官方解答
不能使用加减法来求加法。 我们只能朝着位运算的角度来思考了。
由于异或是相同则位0,不同则位1,因此我们可以把异或看成是一种不进位的加减法。
由于与是全部位1则位1,否则位0,因此我们可以求与之后左移一位来表示进位。
代码
class Solution {
public:
int getSum(int a, int b) {
if(a==0) return b;
if(b==0) return a;
while(b!=0)
{
// 当a & b的结果是负数时,左移就会造成符号位的溢出,所以此处需要转换为unsigned int来避免可能出现的左移越界行为。
auto carry = ((unsigned int ) (a & b))<<1;//需要移位之前就进行类型转换
// 计算无进位的结果
a = a^b;
//将存在进位的位置置1
b =carry;
}
return a;
}
};