35. 两个整数之和
题目描述
不使用运算符 + 和 -,计算两整数 a、b 之和。
解题思路
这道题的核心在于理解计算机底层是如何做加法的。我们可以将加法拆解为两部分:
- 无进位相加:使用异或运算
^。例如1 ^ 1 = 0,1 ^ 0 = 1,这正好对应二进制加法中不考虑进位的结果。 - 进位计算:使用按位与
&后左移一位<< 1。只有当两个位都是 1 时才会产生进位,且进位需要加到更高一位上。
我们需要不断重复这两个步骤,直到没有进位为止(即进位值为 0)。
C++ 代码实现
class Solution {
public:
int getSum(int a, int b) {
// 当进位不为 0 时继续循环
while (b != 0) {
// 无进位和
int sumWithoutCarry = a ^ b;
// 计算进位并左移
int carry = (unsigned int)(a & b) << 1;
a = sumWithoutCarry;
b = carry;
}
return a;
}
};
注意:在 C++ 中,对有符号整数进行左移操作可能会触发未定义行为,因此建议将
a & b的结果强制转换为unsigned int后再移位,以确保逻辑安全。





