左移 (<<)
**左移 (<<
)** 运算符返回一个数字或 BigInt,其二进制表示形式是第一个操作数向左移动指定的位数。向左移出的多余位被丢弃,从右边移入零位。
试一试
语法
js
x << y
描述
<<
运算符对两种类型的操作数进行了重载:数字和 BigInt。对于数字,该运算符返回一个 32 位整数。对于 BigInt,该运算符返回一个 BigInt。它首先 将两个操作数强制转换为数值 并测试它们的类型。如果两个操作数都成为 BigInt,则执行 BigInt 左移;否则,将两个操作数都转换为 32 位整数 并执行数字左移。如果一个操作数成为 BigInt 但另一个操作数成为数字,则会抛出 TypeError
。
该运算符对 补码 中的左操作数的位表示形式进行操作。例如,9 << 2
产生 36
9 (base 10): 00000000000000000000000000001001 (base 2) -------------------------------- 9 << 2 (base 10): 00000000000000000000000000100100 (base 2) = 36 (base 10)
将一个 32 位整数 x
向左移动 y
位,得到 x * 2 ** y
。例如,9 << 3
等价于 9 * (2 ** 3) = 9 * (8) = 72
。
如果左操作数是一个超过 32 位的数字,它的最高有效位将被丢弃。例如,以下超过 32 位的整数将被转换为 32 位整数
Before: 11100110111110100000000000000110000000000001 After: 10100000000000000110000000000001
右操作数将被转换为无符号 32 位整数,然后取模 32,因此实际的移位偏移量将始终是一个介于 0 和 31(含)之间的正整数。例如,100 << 32
与 100 << 0
相同(并产生 100
),因为 32 模 32 为 0。
对于 BigInt,没有截断。从概念上讲,将正 BigInt 理解为具有无限数量的前导 0
位,将负 BigInt 理解为具有无限数量的前导 1
位。
将任何数字 x
向左移动 0
位,返回将 x
转换为 32 位整数的结果。不要使用 << 0
来截断数字为整数;请改用 Math.trunc()
。
示例
使用左移
js
9 << 3; // 72
// 9 * (2 ** 3) = 9 * (8) = 72
9n << 3n; // 72n
规范
规范 |
---|
ECMAScript 语言规范 # sec-left-shift-operator |
浏览器兼容性
BCD 表格仅在浏览器中加载