35. 两个整数之和
题目描述
要求在不使用 + 和 - 运算符的情况下,计算两个整数的和。
解题思路
这道题的核心在于理解计算机底层是如何做加法的。我们可以将加法拆解为两部分:
- 无进位加法:异或运算
^本质上就是按位相加但不处理进位。比如1 ^ 1 = 0(相当于 1+1=2,二进制 10,本位是 0),1 ^ 0 = 1。 - 进位计算:按位与
&能找出哪些位产生了进位,但进位需要向左移动一位才能加到正确的位置上,即(a & b) << 1。
接下来只需要不断重复这两个步骤,直到进位变为 0,此时 a 中的值即为最终结果。
C++ 实现
class Solution {
public:
int getSum(int a, int b) {
// 当进位不为 0 时,继续循环
while (b) {
int x = a ^ b; // 无进位和
int y = (a & b) << 1; // 进位值
a = x;
b = y;
}
return a;
}
};
流程解析
注意这里不需要在循环外再执行一次异或,因为当 b 为 0 时,说明没有进位了,a 已经包含了所有位的和。

36. 只出现一次的数字 II
题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
解题思路
既然其他数字都出现了三次,那么对于任意一个比特位来说,如果该位上的 1 的总数能被 3 整除,说明目标数字在该位上是 0;否则,目标数字在该位上是 1。
我们可以遍历 32 个比特位,统计数组中所有数字在第 i 位上 1 出现的次数,然后对 3 取模。将结果拼接到答案变量 ret 的对应位置上即可。
C++ 实现
class {
:
{
ret = ;
( i = ; i < ; i++) {
sum = ;
( x : nums) {
sum += ((x >> i) & );
}
ret |= ((sum % ) << i);
}
ret;
}
};




