Core JavaScript 1.5 Guide:Operators:Bitwise Operators
出典: MDC
目次 |
[編集] ビット演算子
ビット演算子ではそのオペランドを 10 進数や 16 進数や 8 進数ではなく、32 ビットの集合(0 と 1)として扱います。例えば、10 進数の 9 の 2 進表現は 1001 です。ビット演算子はこのように 2 進表現にした上で演算を行いますが、標準の JavaScript の数値を返します。
次の表で JavaScript のビット演算子について説明します。
| 演算子 | 使用法 | 説明 |
|---|---|---|
| ビットごとの AND | a & b |
オペランドの対応するビットがともに 1 である各ビットについて 1 を返す。 |
| ビットごとの OR | a | b |
オペランドの対応するビットがどちらかまたはともに 1 である各ビットについて 1 を返す。 |
| ビットごとの XOR | a ^ b |
オペランドの対応するビットがどちらか一方のみ 1 である各ビットについて 1 を返す。 |
| ビットごとの NOT | ~ a |
オペランドの各ビットを反転する。 |
| 左シフト | a << b |
2 進表現の a を b ビット分だけ左にシフトする。右から 0 を詰める。 |
| 符号を維持した右シフト | a >> b |
2 進表現の a を b ビット分だけ右にシフトする。溢れたビットは破棄する。 |
| 0 埋め右シフト | a >>> b |
2 進表現の a を b ビット分だけ右にシフトする。溢れたビットは破棄し、左から 0 を詰める。 |
表 3.5:ビット演算子
[編集] ビットごとの論理演算子
概念的にビットごとの論理演算子は以下のように機能します。
- オペランドは 32 ビット整数に変換され、ビット列(0 と 1)として表現される。
- 第 1 のオペランドの各ビットは第 2 のオペランドの対応するビットと対にされる。第 1 ビットと第 1 ビット、第 2 ビットと第 2 ビット、というように対にされる。
- 演算子は各ビットのペアに適用され、結果はビットごとに組み立てられる。
例えば、9 の 2 進表現は 1001 で、15 の 2 進表現は 1111 です。ここで、ビット演算子がこれらの値に対して適用されたときの結果は以下のようになります。
- 15 & 9 の結果は 9 (1111 & 1001 = 1001)
- 15 | 9 の結果は 15 (1111 | 1001 = 1111)
- 15 ^ 9 の結果は 6 (1111 ^ 1001 = 0110)
[編集] ビットシフト演算子
ビットシフト演算子は 2 つのオペランドをとります。第 1 のオペランドはシフトされる数を指定し、第 2 のオペランドは、第 1 のオペランドをシフトさせるビット数を指定します。シフト演算の方向は使用する演算子によって決まります。
シフト演算子はそのオペランドを 32 ビット整数に変換し、左のオペランドと同じ型の結果を返します。
シフト演算子は次の表のとおりです。
| 演算子 | 説明 | 例 |
|---|---|---|
| << (左シフト) |
第 1 オペランドを指定したビット数分だけ左にシフトする。左に溢れたビットは破棄される。0 のビットを右から詰める。 | 9<<2 の結果は 36 となる。1001 を 2 ビット左にシフトすると 100100 となり、これは 36 であるため。 |
| >> (符号を維持した右シフト) |
第 1 オペランドを指定したビット数分だけ右にシフトする。右に溢れたビットは破棄される。左端のビットのコピーを左から詰める。 | 9>>2 の結果は 2 となる。1001 を 2 ビット右にシフトすると 10 となり、これは 2 であるため。同様に、-9>>2 の結果は符号が維持されるために -3 となる。 |
| >>> (0 埋め右シフト) |
第 1 オペランドを指定したビット数分だけ右にシフトする。右に溢れたビットは破棄される。0 のビットを左から詰める。 | 19>>>2 の結果は 4 となる。10011 を 2 ビット右にシフトすると 100 になり、これは 4 であるため。非負数では 0 埋め右シフトと符号を維持した右シフトは同じ結果になる。 |
表 3.6:ビットシフト演算子