常见位运算总结
前置知识:常用位运算技巧
在深入具体题目之前,先回顾几个高频使用的位运算技巧,它们往往是解题的关键。
1. 清除最右侧的 1
n & (n - 1) 可以将整数 n 二进制表示中最右侧的 1 变为 0。这个操作常用于统计二进制中 1 的个数(汉明重量)。
class Solution {
public:
int hammingWeight(int n) {
int count = 0;
while (n) {
n &= (n - 1);
count++;
}
return count;
}
};
2. 异或运算的性质
- 任何数与自身异或结果为
0(a ^ a = 0)。 - 任何数与
0异或结果为其本身 (a ^ 0 = a)。 - 异或满足交换律和结合律。
利用这些性质,可以解决'只出现一次的数字'类问题。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int result = 0;
for (int num : nums) {
result ^= num;
}
return result;
}
};
033 判断字符是否唯一
题目描述: 实现一个算法,确定一个字符串的所有字符是否全都不同。这里假设字符串只包含小写字母。
解法思路:位图思想
由于题目限制只包含小写字母,总共只有 26 个字符。我们可以用一个整数的二进制位来代表一个字符是否存在。一个 int 类型有 32 位,足以覆盖所有小写字母。
- 如果某一位是
0,表示该字符未出现过。 - 如果某一位是
1,表示该字符已出现过。
此外,利用鸽巢原理,如果字符串长度超过 26,必然存在重复字符,可直接返回 。


