Bitowe operatory ECMAScript
- Poprzednia strona Jednoargumentowe operatory
- Następna strona Operatorzy logiczne
Operatory bitowe działają na poziomie podstawowym liczb (tj. 32 bitów reprezentujących liczbę).
Przypomnienie o liczbach całkowitych
Liczby całkowite w ECMAScript mają dwa typy, tj. liczby całkowite (dopuszczające użycie liczb dodatnich i ujemnych) oraz liczby całkowite nieskierunkowane (dopuszczające tylko użycie liczb dodatnich). W ECMAScript wszystkie liczby całkowite są domyślnie liczbami całkowitymi, co oznacza?
Liczby całkowite używają 31 bitów do przedstawienia wartości liczby, a 32. bitu do przedstawienia znaku liczby, 0 oznacza liczbę dodatnią, a 1 oznacza liczbę ujemną. Zakres wartości wynosi od -2147483648 do 2147483647.
Liczby całkowite w formacie binarnym można przechowywać na dwa różne sposoby: jeden do przechowywania liczb dodatnich, a drugi do przechowywania liczb ujemnych. Liczby dodatnie są przechowywane w formie prawdziwego binarnego, gdzie każda cyfra z pierwszych 31 bitów reprezentuje potęgę 2, zaczynając od pierwszego bitu (bit 0), który reprezentuje 20,drugi bit (bit 1) reprezentuje 21Nie używane cyfry są wypełniane zerami, co oznacza, że są one ignorowane. Na przykład, rysunek poniżej pokazuje reprezentację liczby 18.

Wersja binarna liczby 18 używa tylko pierwszych 5 cyfr, które są istotnymi cyframi tego liczby. Przekształcenie liczby w ciąg binarny pozwala zobaczyć istotne cyfry:
var iNum = 18; alert(iNum.toString(2)); //Wyświetla "10010"
Ten kod wyświetla tylko "10010", zamiast 32-bitowego przedstawienia liczby 18. Inne cyfry są nieistotne, ponieważ wystarczy tylko pierwsze 5 cyfr, aby określić tę wartość dziesiętną. Jak pokazuje rysunek poniżej:

Ujemne liczby są również przechowywane jako kod binarny, ale w formie kodu uzupełnienia dwójkowego. Krokami obliczania kodu uzupełnienia dwójkowego liczby są trzy:
- Określ binarną reprezentację nieujemnej wersji liczby (na przykład, aby obliczyć kod uzupełnienia dwójkowego -18, najpierw musisz określić binarną reprezentację 18)
- Uzyskaj kod odwrotny, co oznacza zastąpienie 0 przez 1, a 1 przez 0
- Dodaj 1 do kodu odwrotnego
Aby określić binarną reprezentację -18, najpierw musisz uzyskać binarną reprezentację 18, jak pokazano poniżej:
0000 0000 0000 0000 0000 0000 0001 0010
Następnie oblicz kod odwrotny, jak pokazano poniżej:
1111 1111 1111 1111 1111 1111 1110 1101
Ostatecznie, dodaj 1 do kodu odwrotnego, jak pokazano poniżej:
1111 1111 1111 1111 1111 1111 1110 1101 1 --------------------------------------- 1111 1111 1111 1111 1111 1111 1110 1110
Zatem binarna reprezentacja -18 to 1111 1111 1111 1111 1111 1111 1110 1110. Pamiętaj, że podczas przetwarzania liczb całkowitych ze znakiem, deweloperzy nie mogą uzyskać dostępu do bitu 31.
Ciekawe jest to, że po przekształceniu ujemnej liczby w ciąg binarny, ECMAScript nie wyświetla go w formie kodu uzupełnienia dwójkowego, ale w formie standardowego kodu binarnego wartości absolutnej liczby z przedrostkiem ujemnym. Na przykład:
var iNum = -18; alert(iNum.toString(2)); // wyświetla "-10010"
Ten kod wyświetla "-10010", a nie kod uzupełnienia dwójkowego, aby uniknąć dostępu do bitu 31. Dla uproszczenia ECMAScript przetwarza liczby w prosty sposób, dzięki czemu deweloperzy nie muszą się martwić o ich użycie.
Z drugiej strony, liczby całkowite bez znaku traktują ostatni bit jako dodatkowy bit. W tym trybie, 32. bit nie reprezentuje znaku liczby, ale wartość 231Dzięki temu dodatkowemu bitowi, zakres wartości liczb całkowitych bez znaku wynosi od 0 do 4294967295. Dla liczb całkowitych mniejszych niż 2147483647, liczby całkowite bez znaku wyglądają tak samo jak liczby całkowite ze znakiem, podczas gdy liczby większe niż 2147483647 wymagają użycia bitu 31 (w liczbach całkowitych ze znakiem ten bit zawsze wynosi 0).
Po przekształceniu liczby całkowitej bez znaku w ciąg znaków, zwracane są tylko ich istotne bity.
Uwaga:Wszystkie liczby całkowite są domyślnie przechowywane jako liczby całkowite ze znakiem. Tylko operatorzy bitowe ECMAScript mogą tworzyć liczby całkowite bez znaku.
Abitowe operacje NOT
Abitowe operacje NOT są reprezentowane przez znak zaprzeczenia (~), są to jeden z niewielu operatorów binarnych w ECMAScript, które mają związek z算术.
Bitowa operacja NOT to trzystopniowy proces:
- Konwersja liczby operacyjnej na 32-bitową liczbę
- Konwersja liczby binarnej na jej kod odwrotny
- Konwersja liczby binarnej na liczbę zmiennoprzecinkową
Na przykład:
var iNum1 = 25; //25 równa się 00000000000000000000000000011001 var iNum2 = ~iNum1; //Konwersja na 11111111111111111111111111100110 alert(iNum2); //wyjście "-26"
Bitowa operacja NOT w rzeczywistości jest obliczaniem ujemnej liczby, a następnie odejmowaniem 1, więc 25 zmienia się w -26. Można również uzyskać ten sam wynik za pomocą poniższego sposobu:
var iNum1 = 25; var iNum2 = -iNum1 -1; alert(iNum2); //wyjście -26
Bitowa operacja AND
Bitowa operacja AND oznaczona znakiem (+) wykonuje bezpośrednią operację na binarnej formie liczby. On alignuje cyfry każdej liczby i wykonuje operację AND na dwóch cyfrach w tym samym miejscu według poniższych zasad:
Cyfry pierwszej liczby | Cyfry drugiej liczby | Wynik |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
Na przykład, aby wykonać operację AND na liczbach 25 i 3, kod jest następujący:
var iResult = 25 & 3; alert(iResult); //wyjście "1"
Rezultat AND operacji 25 i 3 wynosi 1. Dlaczego? Analiza poniżej:
25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0011 --------------------------------------------- AND = 0000 0000 0000 0000 0000 0000 0000 0001
Widać, że w 25 i 3 tylko jeden bit (bit 0) przechowuje liczby 1, więc inne bity generują 0, więc wynik to 1.
Bitowa operacja OR
Bitowa operacja OR oznaczona symbolem (|) wykonuje bezpośrednią operację na binarnej formie liczby. Podczas obliczania każdego miejsca, operacja OR stosuje następujące zasady:
Cyfry pierwszej liczby | Cyfry drugiej liczby | Wynik |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
Nadal używając przykładu operacji AND, wykonaj OR operację na 25 i 3, kod jest następujący:
var iResult = 25 | 3; alert(iResult); //wyjście "27"
Rezultat OR operacji 25 i 3 wynosi 27:
25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0011 -------------------------------------------- OR = 0000 0000 0000 0000 0000 0000 0001 1011
Widać, że w dwóch liczbach, łącznie 4 cyfry przechowują liczbę 1, które są przekazywane do wyniku. Binarna kod 11011 równa się 27.
Operacja bitowa XOR
Operacja bitowa XOR jest reprezentowana przez znak (^), oczywiście, jest to bezpośrednia operacja na formie binarnej. XOR różni się od OR, zwraca 1 tylko wtedy, gdy tylko jeden bit przechowuje 1. Prawda tabeli jest następująca:
Cyfry pierwszej liczby | Cyfry drugiej liczby | Wynik |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
Operacja bitowa XOR jest reprezentowana przez znak (^), oczywiście, jest to bezpośrednia operacja na formie binarnej. XOR różni się od OR, zwraca 1 tylko wtedy, gdy tylko jeden bit przechowuje 1. Prawda tabeli jest następująca:
var iResult = 25 ^ 3; alert(iResult); // wyświetla "26"
Wynik operacji XOR między 25 a 3 to 26:
25 = 0000 0000 0000 0000 0000 0000 0001 1001 3 = 0000 0000 0000 0000 0000 0000 0000 0011 --------------------------------------------- XOR = 0000 0000 0000 0000 0000 0000 0001 1010
Widać, że w dwóch liczbach, łącznie 4 cyfry przechowują 1, które są przekazywane do wyniku. Kodeks binarny 11010 równa się 26.
Operacja przesunięcia w lewo
Operacja przesunięcia w lewo jest reprezentowana przez dwa znaki less than (<<). Przesuwa wszystkie cyfry liczby w lewo o określoną liczbę miejsc. Na przykład, przesunięcie liczby 2 (równa się binarnie 10) w lewo o 5 miejsc, wynik to 64 (równa się binarnie 1000000):
var iOld = 2; // równa się binarnie 10 var iNew = iOld << 5; // równa się binarnie 1000000 dziesiętnie 64
Uwaga:Przy przesuwaniu cyfr w lewo, liczba ma 5 pustych miejsc po prawej stronie. Operacja przesunięcia w lewo wypełnia te miejsca zerami, aby wynik był pełnym 32-bitowym liczbą.

Uwaga:Operacja przesunięcia w lewo zachowuje bit znaku liczby. Na przykład, przesunięcie liczby -2 w lewo o 5 miejsc, daje -64, a nie 64. "Czy znak jest przechowywany w 32. cyfrze?" Tak, ale to dzieje się w tle ECMAScript, a deweloperzy nie mogą bezpośrednio uzyskać dostępu do 32. cyfry. Nawet jeśli wyświetla się liczby ujemne w formie binarnej, wyświetla się formę minusa (np. -2 wyświetla się jako -10).
Operacja przesunięcia w prawo ze znakiem
Operacja przesunięcia w prawo ze znakiem jest reprezentowana przez dwa znaki greater than (>>). Przesuwa wszystkie cyfry 32-bitowego liczby w prawo jako całość, jednocześnie zachowując znak liczby (plus lub minus). Operacja przesunięcia w prawo jest przeciwna do przesunięcia w lewo. Na przykład, przesunięcie liczby 64 w prawo o 5 miejsc, zmienia się w 2:
var iOld = 64; // równa się binarnie 1000000 var iNew = iOld >> 5; // równa się binarnie 10 dziesiętnie 2
Podobnie, przesunięcie bitów powoduje puste miejsca. Tym razem, puste miejsca znajdują się po lewej stronie liczby, ale po symbolu znaku. ECMAScript wypełnia te puste miejsca wartością symbolu znaku, tworząc pełną liczbę, jak pokazano na rysunku poniżej:

Bezpodstawne przesunięcie w prawo
Operator bezpodstawnego przesunięcia w prawo jest reprezentowany przez trzy znaki większe niż (>>>), który przesuwa wszystkie liczby 32-bitowe w prawo. Dla liczb dodatnich wynik bezpodstawnego przesunięcia w prawo jest taki sam jak wynik przesunięcia w prawo ze znakiem.
Używając przykładu przesunięcia w prawo ze znakiem, przesunięcie 64 w prawo 5 miejsc staje się 2:
var iOld = 64; // równa się binarnie 1000000 var iNew = iOld >>> 5; // równa się binarnie 10 dziesiętnie 2
Dla liczb ujemnych sytuacja jest inna.
Bezpodstawne przesunięcie w prawo wypełnia wszystkie puste miejsca zerami. Dla liczb dodatnich to jest takie samo jak przesunięcie w prawo ze znakiem, podczas gdy ujemne liczby są traktowane jako dodatnie.
Ponieważ wynik bezpodstawnego przesunięcia w prawo jest 32-bitową liczbą dodatnią, niesignumowane przesunięcie w prawo ujemnej liczby zawsze daje bardzo dużą liczbę. Na przykład, jeśli przesunieć -64 w prawo 5 miejsc, otrzymamy 134217726. Jak można uzyskać taki wynik?
Aby to osiągnąć, należy przekształcić tę liczbę na jej niesignumowaną ekwiwalentną formę (choć liczba sama w sobie jest znakowana), co można uzyskać za pomocą następującego kodu:
var iUnsigned64 = -64 >>> 0;
Następnie, używając metody toString() klasy Number, uzyskaj jego rzeczywiste przedstawienie bitowe, używając bazy 2:
alert(iUnsigned64.toString(2));
To wygeneruje 11111111111111111111111111000000, co jest binarnym przedstawieniem ujemnej liczby -64 w formie kodu uzupełniania, ale jest równe nieznakowanej liczbie 4294967232.
Dlatego użycie operatora bezpodstawnego przesunięcia w prawo wymaga ostrożności.
- Poprzednia strona Jednoargumentowe operatory
- Następna strona Operatorzy logiczne