位运算是“在哪用、怎么用得准”的问题,本质是直接操作整数二进制位,具速度快、内存省、逻辑清晰优势;常用于快速判断(如a&1判奇偶)和开关控制(如flags&(1

位运算不是“用不用”的问题,而是“在哪用、怎么用得准”的问题。它本质是直接操作整数的二进制位,速度快、内存省、逻辑清晰——但前提是理解每个运算符在位层面的真实效果。
快速判断与开关控制
这是最贴近日常开发的用法,尤其适合状态管理:
-
判断奇偶:用
a & 1替代a % 2 == 0,避免除法开销;结果为 1 是奇数,0 是偶数 -
检查某一位是否开启:比如判断第 3 位(从 0 开始计)是否为 1,写成
flags & (1 ;非零即为真 -
开启某一位:用
flags |= (1 把第 5 位设为 1,其余位不变 -
关闭某一位:用
flags &= ~(1 清零第 2 位,~确保只翻转目标位
权限与多状态打包存储
一个字节(8 位)就能表示 8 种独立开关,比用 8 个布尔变量省 7 字节:
- 定义常量:
READ = 1 (值为 1)、WRITE = 1 (值为 2)、EXEC = 1 (值为 4) - 组合权限:
perm = READ | WRITE得到 3(二进制011) - 验证权限:
if (perm & WRITE)成立说明有写权限 - 增删权限:
perm |= EXEC加执行;perm &= ~WRITE去写权限
高效数据压缩与协议解析
硬件通信、传感器报文、图像格式中,字段常挤在同一个字节或字里:
- 假设一个字节
0x25(二进制0010 0101),约定 D0=在线、D2=报警、D5=低电 - 提取报警位:
(status & (1 或更稳妥地((status >> 2) & 1) == 1 - 把温度(10 位)、湿度(6 位)塞进一个 16 位整数:
(temp - 再解出来:
temp = data >> 6,humidity = data & 0x3F(0x3F是 6 个 1)
算法技巧与底层优化
某些经典解法依赖位运算的数学性质:
-
交换两数不靠临时变量:三次异或
a ^= b; b ^= a; a ^= b; -
取绝对值(无分支):利用符号位右移,
int i = n >> 31; (n ^ i) - i -
找最右侧的 1:
n & -n,例如 12(1100)→ 得 4(0100) -
清掉最右侧的 1:
n & (n - 1),常用于统计 1 的个数或判断是否为 2 的幂










