Operacje bitowe JavaScript
Operatory bitowe 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 |
Przykłady
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 używa 32-bitowych operandów bitowych
JavaScript przechowuje liczby jako 64-bitowe liczby zmiennoprzecinkowe, ale wszystkie operacje bitowe są wykonywane na 32-bitowych liczbach binarnych.
Przed wykonaniem operacji bitowej JavaScript konwertuje liczby na 32-bitowe liczby całkowite ze znakiem.
Po wykonaniu operacji bitowej wynik jest konwertowany z powrotem na 64-bitowe liczby JavaScript.
Powyższe przykłady wykorzystują 4-bitowe liczby binarne bez znaku. Z tego powodu ~5 zwraca 10.
Ponieważ JavaScript używa 32-bitowych liczb całkowitych ze znakiem, nie zwróci 10. Zwróci -6.
0000000000000000000000000000000101 (5)
111111111111111111111111111111010 (~5 = -6)
Liczba całkowita ze znakiem używa skrajnego lewego bitu jako znaku minus.
Bitowe AND
Kiedy bitowe AND jest wykonywane na parze bitów, zwraca 1, jeśli oba bity są 1.
Operacja | Wynik |
---|---|
0 i 0 | 0 |
0 i 1 | 0 |
1 i 0 | 0 |
1 i 1 | 1 |
Operacja | Wynik |
---|---|
1111 i 0000 | 0000 |
1111 i 0001 | 0001 |
1111 i 0010 | 0010 |
1111 i 0100 | 0100 |
Bitowe OR
Kiedy bitowe OR jest wykonywane na parze bitów, zwraca 1, jeśli jeden z bitów ma wartość 1:
Operacja | Wynik |
---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Operacja | Wynik |
---|---|
1111 | 0000 | 1111 |
1111 | 0001 | 1111 |
1111 | 0010 | 1111 |
1111 | 0100 | 1111 |
Bitowe XOR
Gdy bitowe XOR jest wykonywane na parze bitów, zwraca 1, jeśli bity są różne:
Operacja | Wynik |
---|---|
0^0 | 0 |
0^1 | 1 |
1 ^ 0 | 1 |
1 ^ 1 | 0 |
Operacja | Wynik |
---|---|
1111 ^ 0000 | 1111 |
1111^0001 | 1110 |
1111^0010 | 1101 |
1111 ^ 0100 | 1011 |
JavaScript Bitowe AND (&)
Bitowe AND zwraca 1 tylko wtedy, gdy oba bity to 1:
Dziesiętny | Dwójkowy |
---|---|
5 | 0000000000000000000000000000000101 |
1 | 0000000000000000000000000000000001 |
5 i 1 | 00000000000000000000000000000001 (1) |
Przykład
let x = 5 & 1;
JavaScript Bitowe LUB (|)
Bitowe OR zwraca 1, jeśli jeden z bitów to 1:
Dziesiętny | Dwójkowy |
---|---|
5 | 0000000000000000000000000000000101 |
1 | 0000000000000000000000000000000001 |
5 | 1 | 0000000000000000000000000000000101 (5) |
Przykład
let x = 5 | 1;
JavaScript Bitowe XOR (^)
Bitwise XOR zwraca 1, jeśli bity są różne:
Dziesiętny | Dwójkowy |
---|---|
5 | 0000000000000000000000000000000101 |
1 | 0000000000000000000000000000000001 |
5 ^ 1 | 0000000000000000000000000000000100 (4) |
Przykład
let x = 5 ^ 1;
JavaScript Bitowe NIE (~)
Dziesiętny | Dwójkowy |
---|---|
5 | 0000000000000000000000000000000101 |
~5 | 1111111111111111111111111111111010 (-6) |
Przykład
let x = ~5;
JavaScript (wypełnienie zerowe) Bitowe przesunięcie w lewo (<<)
To jest przesunięcie w lewo z zerowym wypełnieniem. Jeden lub więcej bitów zerowych jest wpychanych od prawej strony, a skrajne lewe bity odpadają:
Dziesiętny | Dwójkowy |
---|---|
5 | 0000000000000000000000000000000101 |
5 << 1 | 00000000000000000000000000001010 (10) |
Przykład
let x = 5 << 1;
JavaScript (zachowanie znaków) Bitowe przesunięcie w prawo (>>)
To jest znak zachowania właściwego przesunięcia. Kopie skrajnego lewego bitu są wsuwane od lewej, a skrajne prawe bity odpadają:
Dziesiętny | Dwójkowy |
---|---|
-5 | 1111111111111111111111111111111011 |
-5 >> 1 | 111111111111111111111111111111101 (-3) |
Przykład
let x = -5 >> 1;
JavaScript (wypełnienie zerowe) Prawy Shift (>>>)
To jest przesunięcie w prawo z zerowym wypełnieniem. Jeden lub więcej bitów zerowych jest wpychanych od lewej strony, a skrajne prawe bity odpadają:
Dziesiętny | Dwójkowy |
---|---|
5 | 0000000000000000000000000000000101 |
5 >>> 1 | 000000000000000000000000000000010 (2) |
Przykład
let x = 5 >>> 1;
Liczby binarne
Liczby binarne z tylko jednym zestawem bitów są łatwe do zrozumienia:
Reprezentacja binarna | Wartość dziesiętna |
---|---|
0000000000000000000000000000000001 | 1 |
0000000000000000000000000000000010 | 2 |
0000000000000000000000000000000100 | 4 |
00000000000000000000000000000001000 | 8 |
000000000000000000000000000010000 | 16 |
000000000000000000000000000100000 | 32 |
0000000000000000000000000001000000 | 64 |
Ustawienie kilku dodatkowych bitów ujawnia wzór binarny:
Reprezentacja binarna | Wartość dziesiętna |
---|---|
0000000000000000000000000000000101 | 5 (4 + 1) |
000000000000000000000000000001101 | 13 (8 + 4 + 1) |
000000000000000000000000000101101 | 45 (32 + 8 + 4 + 1) |
Liczby binarne JavaScript są przechowywane w formacie uzupełnienia do dwóch.
Oznacza to, że liczba ujemna jest bitową NIE z liczby plus 1:
Reprezentacja binarna | Wartość dziesiętna |
---|---|
0000000000000000000000000000000101 | 5 |
1111111111111111111111111111111011 | -5 |
0000000000000000000000000000000110 | 6 |
1111111111111111111111111111111010 | -6 |
0000000000000000000000000000101000 | 40 |
1111111111111111111111111111011000 | -40 |
Konwersja dziesiętna na binarną
Przykład
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
Konwersja binarnego na dziesiętny
Przykład
function bin2dec(bin){
return parseInt(bin, 2).toString(10);
}