java位运算符通过左移(、>>>)可快速实现对2的幂次的乘除,本质是二进制移位等价于乘或除以2的整数次方;左移用于乘2的幂,右移>>用于非负数向下取整除法,对负数也保持向下取整,>>>为无符号右移,不适用于常规除法;任意整数乘法需拆解为位移与加法组合;现代jvm优化下手动位运算通常不必要,仅在极端性能场景使用;需注意溢出、负数语义差异及类型提升问题。

Java 中的位运算符可以通过左移()和右移(<code>>>、>>>)实现对 2 的幂次的快速乘除,本质是利用二进制数移位等价于乘或除以 2 的整数次方。
左移
将一个整数左移 n 位,等价于乘以 2n(前提是不溢出)。例如:
5 → <code>10(5 × 2¹)6 → <code>48(6 × 2³ = 6 × 8)-4 → <code>-16(负数同样适用,符号位参与运算但逻辑一致)
注意:仅适用于正整数乘法时结果直观;负数左移仍符合数学定义(补码下等价于乘),但需留意溢出风险(如 Integer.MAX_VALUE 会溢出为负数)。
右移 >> 和 >>> 实现快速除以 2 的幂
对非负整数,使用带符号右移 >> 即可完成向下取整的整除:
-
12 >> 1→6(12 ÷ 2) -
17 >> 2→4(17 ÷ 4 = 4.25 → 向下取整为 4)
对于负数,>> 是算术右移(保留符号位),结果仍是向下取整(更小的数):
-
-17 >> 2→-5(-17 ÷ 4 = -4.25 → 向下取整为 -5)
若需要无符号右移(即把高位全补 0),用 >>>,适用于处理位模式而非数值语义的场景(如哈希计算),但一般不用来“除法”。
不能直接用于任意数的乘除
位移只对 2 的幂次有效。想算 x * 10,不能直接位移,但可拆解为位移加法:
x * 10 == x * (8 + 2) == (xx * 7 == x * (4 + 2 + 1) == (x
现代 JVM 和 CPU 优化很强,这类手动优化通常没必要,反而降低可读性;仅在极端性能敏感且确定操作数特征时(如固定常量、嵌入式环境)才考虑。
注意事项与边界情况
使用位移做乘除时需警惕:
- 溢出:左移可能使 int 超出 [-2³¹, 2³¹−1],结果错误;建议用 long 或检查范围
-
负数除法语义:Java 整数除法向零取整(
-17 / 4 == -4),而>>向下取整(-17 >> 2 == -5),二者行为不同 - 类型安全:位运算在 byte/short 上会先提升为 int,结果也是 int,需显式强转
例如:byte b = 10; b = (byte)(b —— 忘记强转会编译失败。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











