位移运算符通过二进制位移高效实现2的整数次幂乘除:左移<<等价于乘2ⁿ,右移>>等价于除2ⁿ并向下取整,>>>将负数转无符号再右移;但仅适用于整数、有溢出和类型转换限制,且可读性低。

位移运算符能高效实现2的整数次幂的乘除,本质是二进制位的左移或右移,比普通乘除法更快,但仅适用于特定场景。
左移(<<)实现快速乘2的幂
左移n位等价于乘以2ⁿ,因为二进制数每左移1位,数值翻倍。
- 5 << 1 → 5 × 2¹ = 10(二进制 101 → 1010)
- 3 << 3 → 3 × 2³ = 24(二进制 11 → 11000)
- 注意:对负数也适用,但结果遵循补码规则,如 -4 << 2 = -16
- 溢出时会截断高位,JavaScript中按32位带符号整数处理(即使Number是浮点,位运算仍转为32位整数)
右移(>>)实现快速除以2的幂(向下取整)
有符号右移(>>)等价于除以2ⁿ并向下取整,适合非负整数;负数会保留符号位。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 12 >> 2 → 12 ÷ 2² = 3(二进制 1100 → 11)
- 15 >> 1 → 15 ÷ 2 = 7(向下取整,不是四舍五入)
- -10 >> 1 → -5(符号位扩展,保持负号)
- 若需对负数做“向零取整”,可用 Math.trunc(-10 / 2),但失去位运算优势
无符号右移(>>>)处理负数的特殊情况
无符号右移把操作数视为32位无符号整数,高位补0,结果总是非负。可用于将负数转为大正数再移位,但语义已改变。
立即学习“Java免费学习笔记(深入)”;
- -1 >>> 0 → 4294967295(即 2³²−1)
- -8 >>> 2 → 1073741822(先转无符号,再右移2位)
- 一般不用于常规除法,除非明确需要无符号语义(如哈希、位掩码计算)
使用注意事项和限制
位移只适用于乘/除以2的整数次幂,且结果是整数。不能替代任意乘除,也不能保证数学精度(尤其涉及浮点或大数时)。
- 位运算自动将操作数转为32位有符号整数,1.5 << 1 → 2(先取整再移位)
- 2 ** 30 << 2 可能溢出,结果非预期(如 1073741824 << 2 = 0)
- 可读性较低,团队协作中建议加注释说明意图,例如:// x * 8 等价于 x << 3
- 现代JS引擎优化已很强,性能差异在多数场景可忽略,优先选清晰代码,而非盲目用位运算

















