bigint位移操作符(、>>>)语法同number,但始终按无符号大整数处理且不丢弃高位;>>>与>>行为完全相同,因bigint无符号位概念;操作数必须均为bigint类型,否则抛typeerror。

BigInt 的位移操作符(、<code>>>、>>>)在语法上与 Number 类型一致,但行为有关键区别:它们始终按 无符号大整数 处理,并且不丢弃高位——因为 BigInt 本身没有固定位宽,位移结果精度完全保留。
支持的位移操作符及基本行为
BigInt 支持三种位移操作符,但注意:>>>(无符号右移)在 BigInt 中 与 >> 行为完全相同。这是因为 BigInt 没有“符号位”的概念——它用任意长度二进制补码表示,但设计上所有 BigInt 值都被视为非负数参与位运算(负 BigInt 会先转为其绝对值的二进制位,再按补码逻辑处理,实际效果等价于对 |n| 运算后加符号标记;而位移时符号不参与位移动,只影响最终解释)。
a :左移 <code>b位,等价于a * 2n ** b(结果为 BigInt)-
a >> b:有符号右移,对非负 BigInt 等同于 floor(a / 2n ** b) -
a >>> b:在 BigInt 中与>>完全等效,规范明确要求忽略符号扩展差异
必须使用 BigInt 字面量或 n 后缀
位移操作符左右操作数都必须是 BigInt 类型,混用 Number 会抛出 TypeError:
- ✅ 正确:
100n 、<code>0b1010n >> 1n、10n ** 3n - ❌ 报错:
100 (左操作数不是 BigInt)、<code>100n (右操作数不是 BigInt) - ⚠️ 注意:
100n 也报错——右操作数必须显式为 <code>0n,不能是数字 0
典型实用场景
位移在 BigInt 中主要用于高效幂运算、掩码提取、二进制协议解析等高精度整数场景:
-
快速乘除 2 的幂:如
value 比 <code>value * 1024n更直观体现“字节偏移”语义 -
构造大掩码:例如生成 64 位全 1 掩码:
(1n → <code>0xffffffffffffffffn -
解析二进制数据块:从一个 128 位哈希值中提取低 32 位:
hash & ((1n -
实现位图(Bitset):用 BigInt 当底层存储,
bitset | (1n 设置第 index 位
注意事项与陷阱
看似简单,但几个细节容易导致意外:
- 右移位数若为负数(如
a >> -1n),行为未定义,引擎可能抛错或静默截断,应确保右操作数 ≥ 0n - 位移位数极大时(如
1n ),虽不会溢出,但会显著影响性能和内存,需评估合理性 - 负 BigInt(如
-5n)参与位移时,JavaScript 规范要求先取其二进制补码等效正数再运算,结果仍带负号;例如-4n >> 1n得-2n,符合数学直觉,但底层不基于符号位移动 - 不要用位移替代普通算术——除非你明确需要位级语义。例如
x * 2n**y和x 数学等价,但后者更强调二进制结构










