位运算在算法题中往往能带来意想不到的效率提升,尤其是处理状态标记和数值关系时。今天我们来聊聊两个经典场景:如何判断字符串中的字符是否唯一,以及如何快速找出数组中缺失的数字。
热身练习:基础位运算回顾
在深入之前,先快速过几个考察位运算基本技巧的题目,找找手感。
191. 位 1 的个数
统计整数二进制表示中 1 的个数。核心思路是利用 n & (n - 1) 每次消除最低位的 1。
class Solution {
public:
int hammingWeight(int n) {
int count = 0;
while(n) {
n &= (n - 1);
count++;
}
return count;
}
};
338. 比特位计数
计算从 0 到 n 每个数的二进制中 1 的个数。直接复用上面的逻辑即可。
class Solution {
public:
vector<int> countBits(int n) {
vector<int> ans(n + 1, 0);
for(int i = 0; i <= n; i++) {
int count = 0;
int num = i;
while(num) {
num &= (num - 1);
count++;
}
ans[i] = count;
}
return ans;
}
};
461. 汉明距离
计算两个整数二进制位不同的位置数量。先异或再统计 1 的个数。
class Solution {
:
{
count = ;
ret = x ^ y;
(ret) {
ret &= (ret - );
count++;
}
count;
}
};


