JavaScriptのビット演算
JavaScriptビット演算子
Operator | Name | Description |
---|---|---|
& | AND | Sets each bit to 1 if both bits are 1 |
| | OR | Sets each bit to 1 if one of two bits is 1 |
^ | XOR | Sets each bit to 1 if only one of two bits is 1 |
~ | NOT | Inverts all the bits |
<< | Zero fill left shift | Shifts left by pushing zeros in from the right and let the leftmost bits fall off |
>> | Signed right shift | Shifts right by pushing copies of the leftmost bit in from the left, and let the rightmost bits fall off |
>>> | Zero fill right shift | Shifts right by pushing zeros in from the left, and let the rightmost bits fall off |
例
Operation | Result | Same as | Result |
---|---|---|---|
5 & 1 | 1 | 0101 & 0001 | 0001 |
5 | 1 | 5 | 0101 | 0001 | 0101 |
~ 5 | 10 | ~0101 | 1010 |
5 << 1 | 10 | 0101 << 1 | 1010 |
5 ^ 1 | 4 | 0101 ^ 0001 | 0100 |
5 >> 1 | 2 | 0101 >> 1 | 0010 |
5 >>> 1 | 2 | 0101 >>> 1 | 0010 |
JavaScriptは32ビットのビット演算子を使用します
JavaScriptは数値を64ビット浮動小数点数として格納しますが、すべてのビット演算は32ビットの2進数で実行されます。
ビット単位の演算が実行される前に、JavaScriptは数値を32ビットの符号付き整数に変換します。
ビット単位の演算が実行された後、結果は64ビットのJavaScript数値に変換されます。
上記の例では、4ビットの符号なし2進数を使用しています。このため、〜5は10を返します。
JavaScriptは32ビットの符号付き整数を使用するため、10を返しません。-6を返します。
00000000000000000000000000000101(5)
11111111111111111111111111111010(〜5 = -6)
符号付き整数は、左端のビットをマイナス記号として使用します。
ビットごとのAND
ビットごとのANDがビットのペアに対して実行される場合、両方のビットが1の場合は1を返します。
手術 | 結果 |
---|---|
0&0 | 0 |
0&1 | 0 |
1&0 | 0 |
1&1 | 1 |
手術 | 結果 |
---|---|
1111&0000 | 0000 |
1111&0001 | 0001 |
1111&0010 | 0010 |
1111&0100 | 0100 |
ビットごとのOR
ビットのペアに対してビットごとのORが実行されると、ビットの1つが1の場合、1を返します。
手術 | 結果 |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
手術 | 結果 |
---|---|
1111 | 0000 | 1111 |
1111 | 0001 | 1111 |
1111 | 0010 | 1111 |
1111 | 0100 | 1111 |
ビット単位のXOR
ビット単位のXORがビットのペアに対して実行される場合、ビットが異なる場合は1を返します。
手術 | 結果 |
---|---|
0 ^ 0 | 0 |
0 ^ 1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
手術 | 結果 |
---|---|
1111 ^ 0000 | 1111 |
1111 ^ 0001 | 1110 |
1111 ^ 0010 | 1101 |
1111 ^ 0100 | 1011 |
JavaScriptビット単位AND(&)
ビット単位のANDは、両方のビットが1の場合にのみ1を返します。
10進数 | バイナリ |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5&1 | 00000000000000000000000000000001(1) |
例
let x = 5 & 1;
JavaScriptビット単位OR(|)
ビットの1つが1の場合、ビットごとのORは1を返します。
10進数 | バイナリ |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 | 1 | 00000000000000000000000000000101(5) |
例
let x = 5 | 1;
JavaScriptビット単位XOR(^)
ビットが異なる場合、ビット単位のXORは1を返します。
10進数 | バイナリ |
---|---|
5 | 00000000000000000000000000000101 |
1 | 00000000000000000000000000000001 |
5 ^ 1 | 00000000000000000000000000000100(4) |
例
let x = 5 ^ 1;
JavaScriptビット単位NOT(〜)
10進数 | バイナリ |
---|---|
5 | 00000000000000000000000000000101 |
〜5 | 11111111111111111111111111111010(-6) |
例
let x = ~5;
JavaScript(ゼロフィル)ビット単位の左シフト(<<)
これはゼロフィル左シフトです。1つ以上のゼロビットが右から押し込まれ、左端のビットが脱落します。
10進数 | バイナリ |
---|---|
5 | 00000000000000000000000000000101 |
5 << 1 | 00000000000000000000000000001010(10) |
例
let x = 5 << 1;
JavaScript(符号保存)ビット単位の右シフト(>>)
これは右シフトを維持する兆候です。左端のビットのコピーが左から押し込まれ、右端のビットが脱落します。
10進数 | バイナリ |
---|---|
-5 | 11111111111111111111111111111011 |
-5 >> 1 | 11111111111111111111111111111101(-3) |
例
let x = -5 >> 1;
JavaScript(ゼロフィル)右シフト(>>>)
これはゼロフィル右シフトです。1つ以上のゼロビットが左から押し込まれ、右端のビットが脱落します。
10進数 | バイナリ |
---|---|
5 | 00000000000000000000000000000101 |
5 >>> 1 | 00000000000000000000000000000010(2) |
例
let x = 5 >>> 1;
2進数
1ビットのみが設定された2進数は、簡単に理解できます。
バイナリ表現 | 10進値 |
---|---|
00000000000000000000000000000001 | 1 |
00000000000000000000000000000010 | 2 |
00000000000000000000000000000100 | 4 |
00000000000000000000000000001000 | 8 |
00000000000000000000000000010000 | 16 |
00000000000000000000000000100000 | 32 |
00000000000000000000000001000000 | 64 |
さらに数ビットを設定すると、バイナリパターンが明らかになります。
バイナリ表現 | 10進値 |
---|---|
00000000000000000000000000000101 | 5(4 + 1) |
00000000000000000000000000001101 | 13(8 + 4 + 1) |
00000000000000000000000000101101 | 45(32 + 8 + 4 + 1) |
JavaScriptの2進数は、2の補数形式で格納されます。
これは、負の数が1を足した数のビット単位のNOTであることを意味します。
バイナリ表現 | 10進値 |
---|---|
00000000000000000000000000000101 | 5 |
11111111111111111111111111111011 | -5 |
00000000000000000000000000000110 | 6 |
11111111111111111111111111111010 | -6 |
00000000000000000000000000101000 | 40 |
11111111111111111111111111011000 | -40 |
10進数から2進数への変換
例
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
2進数から10進数への変換
例
function bin2dec(bin){
return parseInt(bin, 2).toString(10);
}