位运算因指令级执行、单周期完成,在高频场景中比常规运算更轻量稳定;奇偶判断用 & 1 替代 % 2,避免负数误判与除法开销;正整数除以 2 的幂用 >> 替代 /;状态管理用 & | 批量操作标志位;n & (n−1) 可判断 2 的幂或清零最低位 1。

位运算能直接操作二进制位,指令级执行,通常一个 CPU 周期就能完成。在高频计算场景(如循环内判断、协议解析、状态管理)中,它比常规算术或逻辑运算更轻量、更稳定、更少出错。
奇偶判断:用 & 1 替代 % 2
循环中频繁判断索引或计数器是否为奇数时,num % 2 == 1 存在两个隐患:一是负数结果为 -1,导致误判;二是取模涉及除法指令,开销大。
- 正确写法:
(num & 1) == 1—— 只保留最低位,0 表示偶数,1 表示奇数 - 兼容所有整数,包括负数(-3 & 1 = 1)
- 实测 Chrome 中执行 10 亿次,比取模快约 2.7 倍
正整数除以 2 的幂:用 >> 替代 /
分页计算、数组折半、指数衰减等场景常需 n / 2、n / 4、n / 8 等操作。除法是多周期指令,而右移是单周期位操作。
-
n >> 1等价于n / 2(仅限非负整数) -
n >> 3等价于n / 8,n 等价于n * 16 - 注意:右移对负数会补符号位,若需无符号行为,Java 用
>>>,C/C++ 需转为无符号类型
状态标志管理:用 & 和 | 批量读写
代替多个布尔变量或枚举状态,在内存敏感或高并发更新的场景下优势明显(如设备就绪、权限校验、网络包标记)。
- 定义标志:
final int READ = 1, WRITE = 2, EXEC = 4; - 设多个状态:
int flags = READ | WRITE; - 检测是否含某权限:
(flags & READ) != 0 - 清除某位:
flags &= ~WRITE;
快速幂次判断与清零:用 n & (n−1)
判断一个正整数是否为 2 的幂,或快速清零最低位的 1,这类操作在哈希扩容、位图扫描、算法剪枝中高频出现。
- 是 2 的幂?
n > 0 && (n & (n - 1)) == 0(如 8 → 1000,7 → 0111,与结果为 0) - 清零最低位的 1:
n & (n - 1)(如 12(1100)→ 8(1000)) - 提取最低位的 1:
n & (-n)(利用补码特性)










