java位运算高效核心在于精准使用场景:用替代2的幂次乘除,&判断奇偶或掩码,^交换变量或翻转位,brian kernighan算法或integer.bitcount统计1的个数。

Java 中位运算符的高效计算,核心不在“写得快”,而在于“想得准”——它不靠减少代码行数,而是通过直接操作二进制位,避开算术运算的中间步骤,从而在底层实现零开销或近零开销的逻辑。真正高效的位运算,是用对了场景、选对了算符、避开了常见陷阱。
用位移替代 2 的幂次乘除
左移()和右移(>>)是乘除法中最直接的等价操作:
- x 等价于 x × 2ⁿ(n ≥ 0),如
7 → 56,比 <code>7 * 8更明确表达“倍增意图” -
x >> n 实现向下取整除法:如
-10 >> 1= -5(⌊−10/2⌋),注意这和-10 / 2 == -5在负数时结果一致,但-7 >> 1 == -4,而-7 / 2 == -3——行为不同,需按语义选 - 避免用 >>> 做算术除法:它不保持数值符号,
-8 >>> 2得到的是正数 1073741822,不是 -2
用按位与快速判断和提取
& 是最轻量的掩码工具,高频用于状态检查和位段隔离:
- 判断奇偶:
(n & 1) == 1比n % 2 == 1更安全(兼容负数)、更快(单指令) - 清零低 k 位:
n & ~((1 ,例如清零低 3 位 → <code>n & ~7,常用于内存对齐 - 提取第 4~7 位(从 0 开始编号):
(n >>> 3) & 0xF,用无符号右移避免负数符号扩展干扰
用异或实现无临时变量交换与状态翻转
^ 的自反性(a ^ a == 0)和恒等性(a ^ 0 == a)带来简洁逻辑:
- 交换两个整数:
a ^= b; b ^= a; a ^= b;——适合寄存器受限环境,但现代 JVM 优化下可读性优先 - 翻转特定位:
flags ^= (1 ,比先判断再用 <code>|或& ~更原子、更紧凑 - 简单校验或加密:如字节流异或固定密钥,解密时再异或一次即可还原
用 Brian Kernighan 算法统计 1 的个数
比循环 32 次更聪明:每次 n & (n - 1) 消掉最右边一个 1,执行次数即为 1 的个数:
- 对
n = 12(1100₂):第一次 → 1100 & 1011 = 1000;第二次 → 1000 & 0111 = 0000;共 2 次 - 实际开发中推荐直接调用
Integer.bitCount(n),它底层已用硬件指令或查表优化,支持负数补码计数
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











