左シフト演算子 (<<)
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since 2015年7月.
左シフト演算子 (<<
) は、 1 つ目のオペランドを指定されたビット数だけ左にずらしたバイナリー表現を持つ、数値または長整数を返します。左にずらしてあふれたビットは破棄され、右から 0 のビットが入ります。
試してみましょう
const a = 5; // 00000000000000000000000000000101
const b = 2; // 00000000000000000000000000000010
console.log(a << b); // 00000000000000000000000000010100
// 予想される結果: 20
構文
x << y
解説
<<
演算子は、数値と長整数の 2 種類のオペランドに対してオーバーロードされています。数値の場合、この演算子は 32 ビット整数を返します。 長整数の場合、演算子は長整数を返します。最初の両オペランドを数値型に変換し、それらの型を検査します。両オペランドが長整数になった場合、長整数の左シフトを実行します。そうでない場合、両オペランドを 32 ビット整数に変換し、数値の左シフトを実行します。一方のオペランドが長整数になり、もう一方が数値になった場合、 TypeError
が発生します。
この演算子は、左オペランドのビット表現を 2 の補数で演算します。例えば 9 << 2
は 36 になります。
9 (10 進数): 00000000000000000000000000001001 (2 進数) -------------------------------- 9 << 2 (10 進数): 00000000000000000000000000100100 (2 進数) = 36 (10 進数)
任意の数 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 となるためです。
警告:
整数に切り詰めるために << 0
を使用する例を見かけるかもしれません。任意の数値 x
を 0
ビット左シフトすると、x
が 32 ビット整数に変換され、さらに -2147483648 から 2147483647 の範囲外の数の先行ビットが除去された結果が得られます。代わりにMath.trunc()
を使用してください。
長整数では切り捨ては発生しません。概念的には、正の長整数は先頭に無限の 0
ビットを持ち、負の長整数は先頭に無限の 1
ビットを持つと解釈します。
例
左シフト演算子の使用
9 << 3; // 72
// 9 * (2 ** 3) = 9 * (8) = 72
9n << 3n; // 72n
仕様書
Specification |
---|
ECMAScript® 2026 Language Specification # sec-left-shift-operator |
ブラウザーの互換性
Loading…