位移运算符可高效实现2的整数次幂乘除:<<等价乘2ⁿ,>>对非负数等价floor(÷2ⁿ),>>>更适合非负数除法;但仅适用于整数、有32位溢出限制、不支持非2幂运算,且现代引擎优化下优先用常规运算。

位移运算符在 JavaScript 中可以高效实现 2 的整数次幂的乘除法,但需注意适用条件和潜在陷阱。
位移运算符如何对应乘除法
左移(<<)等价于乘以 2 的幂次,右移(>>)等价于带符号整数除以 2 的幂次并向下取整:
-
num << 1≡num * 2 -
num << 3≡num * 8(即 ×2³) -
num >> 2≡Math.floor(num / 4)(仅对非负数等价于 ÷4)
只适用于整数且必须是 2 的幂次
位移本质操作的是 32 位有符号整数补码,因此:
- 浮点数会先被 截断为整数(如
5.9 >> 0→5) -
1000 << 10是合法的(= 1000 × 1024),但1000 << 20可能因溢出变负(32 位限制) - 不能用于
* 3、/ 5等非 2 幂运算 —— 没有直接位移等价写法
无符号右移(>>>)更适合非负数除法
普通右移 >> 会保留符号位,负数结果易出错;>>> 强制按无符号处理,更符合多数“除以 2 的幂”的直觉:
立即学习“Java免费学习笔记(深入)”;
-
-8 >> 1→-4(正确,但依赖符号扩展) -
-8 >>> 1→2147483644(32 位无符号解释,通常不是你想要的) - 所以建议:仅对已知 非负整数 使用
>>>做除法,例如1000 >>> 3→125(= 1000 ÷ 8)
实际使用建议与注意事项
现代 JS 引擎已对 * 2、/ 4 等简单运算做了深度优化,手动位移几乎不提升性能,反而降低可读性。仅在以下情况考虑使用:
- 底层算法(如哈希、位图、网络协议解析)中需显式控制二进制位
- 嵌入式或性能极端敏感场景(如 WebGL 着色器逻辑、高频循环中的整数缩放)
- 配合掩码(
&)做快速取模:n & 7≡n % 8(当n ≥ 0) - 务必用
Math.trunc()或| 0显式整数转换,避免隐式转换引发意外


















