左移 (<<)

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

左移 (<<) 运算符返回一个数字或 BigInt,其二进制表示是第一个操作数向左移动指定位数的结果。向左移出的多余位将被丢弃,并从右侧移入零位。

试一试

const a = 5; // 00000000000000000000000000000101
const b = 2; // 00000000000000000000000000000010

console.log(a << b); // 00000000000000000000000000010100
// Expected output: 20

语法

js
x << y

描述

<< 运算符对两种类型的操作数进行了重载:number 和 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 之间(包括 0 和 31)的正整数。例如,100 << 32100 << 0 相同(并产生 100),因为 32 模 32 是 0。

警告:你可能会看到有人使用 << 0 将数字截断为整数。将任何数字 x 向左移 0 位,返回 x 转换为 32 位整数的结果,这还会移除超出 -2147483648 到 2147483647 范围的数字的开头位。请改用 Math.trunc()

对于 BigInt,没有截断。从概念上讲,将正 BigInt 理解为具有无限数量的前导 0 位,将负 BigInt 理解为具有无限数量的前导 1 位。

示例

使用左移

js
9 << 3; // 72

// 9 * (2 ** 3) = 9 * (8) = 72

9n << 3n; // 72n

规范

规范
ECMAScript® 2026 语言规范
# sec-left-shift-operator

浏览器兼容性

另见