位移运算符可高效实现2的整数次幂乘除,但仅适用于整数、因子为2ⁿ、性能敏感且团队熟悉语义的场景;右移>>向下取整,>>>不适用于负数除法,浮点数等需避免直接位移。

JavaScript 中可以用位移运算符( 左移、>> 有符号右移、>>> 无符号右移)快速实现 2 的整数次幂的乘除法,但需注意适用条件和边界问题——它不是万能替代,只在特定场景下高效且安全。
左移
左移 n 位等价于乘以 2n(对非负整数有效):
5 → <code>10(5 × 2¹)3 → <code>24(3 × 2³)- 原理:二进制位整体左移,低位补 0,相当于数值扩大 2n 倍
- ⚠️ 注意:操作数会被自动转为 32 位有符号整数(ToInt32),超范围会溢出;负数也可用,但语义是基于补码的位操作,结果可能不符合直觉(如
-3 是 <code>-6,仍成立)
右移 >> 和 >>> 实现除以 2 的幂(向下取整)
右移 n 位等价于除以 2n 并向下取整(即 Math.floor(a / Math.pow(2, n))):
-
10 >> 1→5(10 ÷ 2) -
7 >> 2→1(7 ÷ 4 = 1.75 → 向下取整为 1) -
-7 >> 2→-2(有符号右移保留符号位,-7 ÷ 4 = -1.75 → 向下取整为 -2) -
-7 >>> 2→1073741822(无符号右移把负数当大正数处理,一般不用来模拟除法) - ✅ 推荐用
>>处理整数除法,但要明确接受「向零还是向下」——它总是向下取整(对负数比Math.trunc()更激进)
什么情况下适合用位移代替 * 和 /
仅当同时满足以下条件时,位移才是更优选择:
- 运算对象是整数(或可安全转为整数),且你关心的是整数结果
- 乘/除的因子明确是 2 的整数次幂(如 ×2、×4、×8、÷16 等)
- 代码处于性能敏感路径(如 WebGL 计算、大量像素处理、游戏循环),且已确认 V8 或其它引擎未对
* 2这类简单表达式做同等优化(现代引擎通常已优化,差异极小) - 团队熟悉位运算语义,不牺牲可读性——例如
index 比 <code>index * 32更难一眼理解
实际使用建议与避坑
位移不是“炫技工具”,而是有明确边界的底层技巧:
- 别对浮点数、
null、undefined或字符串直接位移(会先 ToInt32,导致意外结果,如"3.9" → <code>6) - 避免混合使用:比如
x 等价于 <code>x ,但易被误读为 <code>(x ,务必加括号 - 除法场景优先考虑是否真需要向下取整——如果要四舍五入或截断小数,位移反而引入错误,老实用
Math.round()或Math.trunc() - 现代 JS 引擎对
x * 2、x / 4等常量幂运算常做内联优化,性能差距往往可忽略,可读性和可维护性更重要
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











