位运算
位运算(Bit Manipulation)是计算机底层最快速的操作之一,在某些算法中能够提供 O(1) 的巧妙解法。
常用算子
| 算子 | 名称 | 功能 |
|---|---|---|
& | 按位与 | 均为 1 则为 1 |
| ` | ` | 按位或 |
^ | 异或 | 相同为 0,不同为 1 |
~ | 取反 | 01 互换 |
<< | 左移 | 相当于乘以 2 |
>> | 右移 | 相当于除以 2 |
经典算法技巧
1. 异或运算的特殊性质
x ^ 0 = xx ^ x = 0x ^ y = y ^ x(交换律)
实例:只出现一次的数字 (LeetCode 136) 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。
- 解法:对所有元素进行异或。成对的元素异或为 0,最后剩下的就是那一个唯一的数字。
2. 位运算技巧总结
// 判断奇偶
(n & 1) == 0; // 偶数
(n & 1) == 1; // 奇数
// 二进制中 1 的个数 (Hamming Weight)
int count = 0;
while (n != 0) {
n &= (n - 1); // 清除最低位的 1
count++;
}
// 判断 n 是否为 2 的幂
(n > 0) && ((n & (n - 1)) == 0);
// 获取最低位的 1 (lowbit)
int lowbit = n & (-n);
3. 位运算的应用场景
- 状态压缩 (如 N 皇后、TSP、子集枚枚)。
- 子集生成 (如使用一个整数的 1 代表某位被选中)。
练习
- LeetCode 136/137/260:只出现一次的数字系列
- LeetCode 191:位 1 的个数
- LeetCode 231:2 的幂
- LeetCode 338:比特位计数 (位运算 + DP)
- LeetCode 52:N 皇后 II (位运算加速极其高效)