两整数之和
题目描述
不使用运算符 + 和 -,计算两个整数 a 和 b 的和。
题目示例
输入:a = 1, b = 2 输出:3
解法(位运算)
核心思路
- 异或
^运算本质是【无进位加法】。 - 按位与
&操作能够得到【进位】的对应位置,但还需要左移 1 才是需要进位的位置。 - 然后一直循环,直到【进位】变成 0 为止。
代码实现
class Solution {
public:
int getSum(int a, int b) {
// 解法:位运算 (^ 异或:无进位相加)
while (b) {
int x = a ^ b;
int y = (a & b) << 1;
a = x;
b = y; // 得到进位的对应位置,再左移 1 才是需要进位的位置
// 只进行一次 a & b 不一定保证新的 a 和 b 没有需要进位的位置,
// 所以需要将这个步骤进行循环。a & b 为 0 则说明没有进位的位置了
}
return a ^ b;
}
};
流程解析

只出现一次的数字 II
题目描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
题目示例
输入:[2,2,3,2] 输出:3
解法(比特位计数)
核心思路
设要找的数为 ret。由于整个数组中,需要找的元素只出现了【一次】,其余的数都出现【三次】,因此我们可以根据所有数的【某一个比特位】的总和 % 3 的结果,快速定位到 ret 上的【一个比特位上】的值是 0 还是 1。这样我们通过 ret 的每一个比特位上的值,就可以将 ret 还原出来。




