Repository navigation
Expand file tree
/
Copy pathindex.md
More file actions
78 lines (51 loc) · 4.01 KB
/
Copy pathindex.md
File metadata and controls
78 lines (51 loc) · 4.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
---
title: 左シフト演算子 (<<)
slug: Web/JavaScript/Reference/Operators/Left_shift
l10n:
sourceCommit: fad67be4431d8e6c2a89ac880735233aa76c41d4
---
**左シフト演算子 (`<<`)** は、 1 つ目のオペランドを指定されたビット数だけ左にずらしたバイナリー表現を持つ、数値または長整数を返します。左にずらしてあふれたビットは破棄され、右から 0 のビットが入ります。
{{InteractiveExample("JavaScript デモ: 左シフト演算子 (<<)", "shorter")}}
```js interactive-example
const a = 5; // 00000000000000000000000000000101
const b = 2; // 00000000000000000000000000000010
console.log(a << b); // 00000000000000000000000000010100
// 予想される結果: 20
```
## 構文
```js-nolint
x << y
```
## 解説
`<<` 演算子は、数値と[長整数](/ja/docs/Web/JavaScript/Reference/Global_Objects/BigInt)の 2 種類のオペランドに対してオーバーロードされています。数値の場合、この演算子は 32 ビット整数を返します。 長整数の場合、演算子は長整数を返します。最初の両オペランドを数値型に変換し、それらの型を検査します。両オペランドが長整数になった場合、長整数の左シフトを実行します。そうでない場合、両オペランドを [32 ビット整数](/ja/docs/Web/JavaScript/Reference/Global_Objects/Number#固定長数値への変換)に変換し、数値の左シフトを実行します。一方のオペランドが長整数になり、もう一方が数値になった場合、 {{jsxref("TypeError")}} が発生します。
この演算子は、左オペランドのビット表現を [2 の補数](https://ja.wikipedia.org/wiki/2の補数)で演算します。例えば `9 << 2` は 36 になります。
```plain
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 ビット整数に変換されます。
```plain
Before: 11100110111110100000000000000110000000000001
After: 10100000000000000110000000000001
```
右オペランドは符号なし 32 ビット整数に変換され、その後モジュロ 32 が取られます。したがって、実際のシフト量は常に 0 以上 31 以下の正の整数とみなされます。例えば、`100 << 32` は `100 << 0` と同じ結果 (`100`) になります。これは 32 モジュロ 32 が 0 となるためです。
> [!WARNING]
> 整数に切り詰めるために `<< 0` を使用する例を見かけるかもしれません。任意の数値 `x` を `0` ビット左シフトすると、`x` が 32 ビット整数に変換され、さらに -2147483648 から 2147483647 の範囲外の数の先行ビットが除去された結果が得られます。代わりに[`Math.trunc()`](/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/trunc#ビット単位の_no-op_を使った数値の切り捨て)を使用してください。
長整数では切り捨ては発生しません。概念的には、正の長整数は先頭に無限の `0` ビットを持ち、負の長整数は先頭に無限の `1` ビットを持つと解釈します。
## 例
### 左シフト演算子の使用
```js
9 << 3; // 72
// 9 * (2 ** 3) = 9 * (8) = 72
9n << 3n; // 72n
```
## 仕様書
{{Specifications}}
## ブラウザーの互換性
{{Compat}}
## 関連情報
- [ビット演算子 (JavaScript ガイド)](/ja/docs/Web/JavaScript/Guide/Expressions_and_operators#ビット演算子)
- [左シフト代入演算子](/ja/docs/Web/JavaScript/Reference/Operators/Left_shift_assignment)