位运算直接操作内存中的二进制位,常用于底层开发、性能优化和算法设计。本文通过代码示例讲解核心技巧,带你快速掌握位运算的实用操作。
移位操作:快速乘除
-
左移(
<<
):等价于乘以2的幂8 << 1 // 二进制:1000 → 10000 (16)
-
右移(
>>
):等价于除以2的幂(向下取整)8 >> 1 // 二进制:1000 → 0100 (4)
逻辑操作:按位计算
-
按位或(
|
):将指定位置18 | 7 // 1000 | 0111 = 1111 (15)
-
按位与(
&
):提取或清零特定位8 & 7 // 1000 & 0111 = 0000 (0)
-
按位取反(
~
):翻转所有位(包括符号位)~8 // 00001000 → 1111. 0111 (-9)
实战技巧:精准控制二进制位
1)单位置1
目标:将第n
位设为1(最低位为第0位)
操作:num | (1 << n)
8 | (1<<2) // 1000 → 1100 (12)
2)多位连续置1
目标:将连续k
位设为1(从第n
位开始)
操作:num | ((2^k - 1) << n)
8 | (3<<1) // 1000 | 0110 → 1110 (14)
3)单位置0
目标:将第n
位清零
操作:num & ~(1 << n)
7 & ~(1<<2) // 0111 & 1011 → 0011 (3)
4)多位连续置0
目标:将连续k
位清零(从第n
位开始)
操作:num & ~((2^k - 1) << n)
7 & ~(3<<1) // 0111 & 1001 → 0001 (1)
5)覆盖指定比特段
目标:将连续k
位替换为新值(从第n
位开始)
步骤:
-
目标位清零:
num &= ~(2^k - 1 << n)
-
写入新值:
num |= (value << n)
如第1-3位替换为
101
:num &= ~(7 << 1)
num |= (5 << 1)
// 13(1101) → 清除第1-3位 → 1001 → 写入101 → 1011 (11)
num &= ~(7 << 1); // 清除第1-3位
num |= (5 << 1); // 101左移1位→0101
位运算的优先级低于加减法,建议用括号明确计算顺序,例如
(a << 1) + 1
。