算法实战:位运算解决整数求和与缺失数字问题
35. 两个整数之和
题目描述
不使用 + 或 - 运算符,计算两个整数的和。

示例
输入:a = 1, b = 2 输出:3
核心思路:位运算解法
这道题的核心在于理解计算机底层是如何做加法的。我们可以把加法拆解为两部分:无进位相加和进位。
- 无进位和:使用异或运算
^。比如1 ^ 2得到3,这相当于不考虑进位的二进制加法。 - 进位值:使用按位与
&并左移一位<< 1。只有当两个位都是 1 时才会产生进位,且进位要加到更高一位上。 - 循环处理:将无进位和作为新的 a,进位值作为新的 b,重复上述过程,直到进位为 0,此时 a 就是最终结果。
代码实现
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++ 中,对有符号整数进行位移操作可能涉及未定义行为,这里为了安全起见,计算进位时建议先转为无符号类型再移位,或者确保逻辑符合补码规则。上面的逻辑在 LeetCode 环境下是安全的,但实际工程中需注意溢出边界。
流程解析







