位运算核心技巧与实战解析
位运算是算法面试中的高频考点,掌握其底层逻辑能显著提升解题效率。本文将系统梳理位运算的基础操作与进阶技巧,并结合经典算法题进行实战演练。
1. 位运算复习与补充
在 C 语言阶段我们已经接触过移位操作符(<<、>>)、按位与(&)、按位或(|)、按位异或(^)以及按位取反(~)。为了巩固基础,我们先回顾这些操作符的核心逻辑。
基础位运算逻辑
<<和>>:分别实现二进制位的左移和右移。&:按位与,对应位置均为 1 时结果为 1,否则为 0。|:按位或,对应位置均为 0 时结果为 0,否则为 1。^:按位异或,对应位置不同为 1,相同为 0。~:按位取反,0 变 1,1 变 0。简单记忆口诀:& 有 0 则 0,| 有 1 则 1,^ 相同为 0 相异为 1。
常用位操作技巧
1. 判定二进制第 x 位是 0 还是 1
判断数字 n 的二进制第 x 位是否为 1,可以通过右移 x 位后与 1 进行按位与运算:
(n >> x) & 1
若结果为 1 表示该位为 1,否则为 0。
2. 将第 x 位修改为 1
利用按位或的特性,只要某一位与 1 进行或运算,结果必为 1:
n |= (1 << x)
3. 将第 x 位修改为 0
利用按位与的特性,某一位与 0 进行与运算,结果必为 0。需先构造一个掩码,将第 x 位变为 0,其余位为 1:
n &= ~(1 << x)
4. 提取最右侧的 1
利用补码特性,n & -n 可以提取出二进制表示中最右侧的 1。例如 n = 6 (110),-n = ...010,两者按位与得到 2 (010)。
5. 去掉最右侧的 1
n & (n - 1) 可以将最右侧的 1 变为 0。这是统计二进制中 1 的个数的关键技巧。
6. 位图思想
当需要存储大量数据的存在性(0 或 1)时,使用整型数组占用空间较大。位图利用每个二进制位代表一个状态,一个 32 位整数可表示 32 个元素的存在情况,大幅节省内存。
7. 异或运算律
a ^ 0 = aa ^ a = 0a ^ b ^ c = a ^ (b ^ c)(满足结合律)
2. 位运算算法题实战
2.1 位 1 的个数
题目:计算给定正整数二进制表示中 1 的个数。
思路:利用 n & (n - 1) 每次消除最右侧的 1,循环直到 n 为 0,统计次数即可。


