左移 (<<)

**左移 (<<)** 运算符返回一个数字或 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 << 32100 << 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 表格仅在浏览器中加载

另请参阅