JavaScript ビット演算

❮ 前章へ 次章へ ❯

JavaScript ビット演算子

演算子 説明 同左 結果 同左
& 論理積(AND) 5 & 1 0101 & 0001  1 0001
| 論理和(OR) 5 | 1 0101 | 0001  5 0101
~ 論理否定(NOT) ~ 5  ~0101  10 1010
^ 排他的論理和(XOR) 5 ^ 1 0101 ^ 0001  4 0100
<< ゼロ埋め左シフト 5 << 1 0101 << 1  10 1010
>> 符号維持右シフト 5 >> 1 0101 >> 1   2 0010
>>> ゼロ埋め右シフト 5 >>> 1 0101 >>> 1   2 0010

上の例では、4ビットの符号なしの例を使用しています。 しかし、JavaScript では32ビットの符号付き数値が使用されます。

このため、JavaScript では、~ 5 は 10 を返すのではなく -6 を返します。

~00000000000000000000000000000101 は 11111111111111111111111111111010 を返します


ビット演算 AND(論理積)

1 組のビットに対してビット演算の AND を実行すると、両方のビットが1の場合は1が返されます。

1 ビットの例:
演算結果
0 & 00
0 & 10
1 & 00
1 & 11
4 ビットの例:
演算結果
1111 & 00000000
1111 & 00010001
1111 & 00100010
1111 & 01000100

ビット演算 OR(論理和)

1 組のビットに対してビット演算の OR を実行すると、どちらかのビットが1の場合は1が返されます:

1 ビットの例:
演算結果
0 | 00
0 | 1
1 | 01
1 | 11
4 ビットの例:
演算結果
1111 | 00001111
1111 | 00011111
1111 | 00101111
1111 | 01001111

ビット演算 XOR(排他論理和)

1 組のビットに対してビット演算の XOR を実行すると、ビットが異なる場合には1が返されます:

1 ビットの例:
演算結果
0 ^ 00
0 ^ 1
1 ^ 01
1 ^ 1
4 ビットの例:
演算結果
1111 ^ 00001111
1111 ^ 00011110
1111 ^ 00101101
1111 ^ 01001011

JavaScript ビット演算

JavaScript のビット演算は32ビット符号付き整数で動作します。

ビット演算では、全ての数値は32ビット符号付き整数に変換されます。

ビット演算の結果は、JavaScript の数値に変換されます。


JavaScript ビット演算 AND (&)

ビット演算 AND は、両方のビットが1の場合のみ1を返します:

10進数バイナリ
500000000000000000000000000000101
100000000000000000000000000000001
5 & 100000000000000000000000000000001 (1)

var x = 5 & 1;
Try it Yourself »

JavaScript ビット演算 OR (|)

ビット演算 OR は、どちらか一方のビットが1の場合に1を返します:

10進数バイナリ
500000000000000000000000000000101
100000000000000000000000000000001
5 | 100000000000000000000000000000101 (5)

var x = 5 | 1;
Try it Yourself »

JavaScript ビット演算 XOR (^)

ビット演算 XOR は、双方のビットが異なる場合に1を返します:

10進数バイナリ
500000000000000000000000000000101
100000000000000000000000000000001
5 ^ 100000000000000000000000000000100 (4)

var x = 5 ^ 1;
Try it Yourself »

JavaScript ビット演算 NOT (~)

10進数バイナリ
500000000000000000000000000000101
~511111111111111111111111111111010 (-6)

var x = ~5;
Try it Yourself »

JavaScript (ゼロ埋め) ビット演算左シフト (<<)

これはゼロ埋めの左シフトです。 1つ以上のゼロが右から埋められ、左端のビットから切捨てられます:

10進数バイナリ
500000000000000000000000000000101
5 << 100000000000000000000000000001010 (10)

var x = 5 << 1;
Try it Yourself »

JavaScript (符号維持) ビット演算右シフト (>>)

これはサインを維持する右シフトです。左端のビットのコピーを左から埋め込んで、右端のビットが切り捨てられます:

10進数バイナリ
-511111111111111111111111111111011
-5 >> 111111111111111111111111111111101 (-3)

var x = -5 >> 1;
Try it Yourself »

JavaScript (ゼロ埋め) 右シフト (>>>)

これはゼロ埋めの右シフトです。 1つ以上のゼロビットが左から埋められ、右端のビットが切り捨てられます:

10進数バイナリ
500000000000000000000000000000101
5 >>> 100000000000000000000000000000010 (2)

var x = 5 >>> 1;
Try it Yourself »

32ビット符号付き整数

1 ビットのみが設定されている32ビット整数を理解するのは簡単です:

バイナリ表現10進数値
000000000000000000000000000000011
000000000000000000000000000000102
000000000000000000000000000001004
000000000000000000000000000010008
0000000000000000000000000001000016
0000000000000000000000000010000032
0000000000000000000000000100000064

さらにいくつかのビットを設定することによりバイナリのパターンが明らかになります:

バイナリ表現10進数値
000000000000000000000000000001015 (4 + 1)
0000000000000000000000000010100040 (32 + 8)
0000000000000000000000000010110145 (32 + 8 + 4 + 1)

負の数値は、2 つの補数フォーマットで格納されます。 これは、負の数は、数値に1を加えたビット演算の NOT であることを意味します。

バイナリ表現10進数値
000000000000000000000000000001015
11111111111111111111111111111011-5
0000000000000000000000000010100040
11111111111111111111111111011000-40

10進から2進への変換

function dec2bin(dec){
    return (dec >>> 0).toString(2);
}
Try it Yourself »

2審から10進への変換

function bin2dec(bin){
    return parseInt(bin, 2).toString(10);
}
Try it Yourself »

❮ 前章へ 次章へ ❯