左移 (<<)

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

瀏覽器相容性

另見