位运算实战:两整数之和与只出现一次的数字
371. 两整数之和
题目描述:
给定两个整数 a 和 b,不使用运算符 + 和 -,计算两整数之和。
核心思路
位运算的核心在于模拟加法过程:
- 异或 (
^):相当于无进位加法。例如1 ^ 1 = 0,1 ^ 0 = 1。 - 按位与 (
&) 左移 (<<):计算进位。只有当两位都为 1 时才产生进位,且进位需要向左移动一位。
我们需要不断重复这两个步骤,直到进位为 0,此时剩下的值即为最终结果。注意处理负数时,进位部分应视为无符号整数以避免溢出问题。
C++ 代码实现
class Solution {
public:
int getSum(int a, int b) {
while (b != 0) {
// 计算无进位和
int sum = a ^ b;
// 计算进位,需转为 unsigned int 防止符号位干扰
unsigned int carry = (unsigned int)(a & b) << 1;
a = sum;
b = carry;
}
return a;
}
};

137. 只出现一次的数字 II
题目描述: 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现三次。找出那个只出现了一次的元素。
核心思路
既然其他数字都出现了三次,那么对于任意一个二进制位,所有数字在该位上的 1 的个数之和必然是 3 的倍数加上目标数字在该位的值(0 或 1)。 因此,我们可以遍历 32 个二进制位,统计每一位上 1 出现的总次数,然后对 3 取模。如果余数为 1,说明目标数字在该位上是 1,否则为 0。
这种方法不需要额外的哈希表空间,时间复杂度为 O(32 * N),空间复杂度为 O(1)。



