Opanuj operacje i operatory bitowe w JavaScript. Like a boss!

Like a boss

Poziom średnio-zaawansowany

Operatory bitowe w JavaScript

Dzisiaj postaramy się przedstawić, w możliwie prosty sposób, operatory bitowe w JavaScript.

Ogólna koncepcja pracy operatorów bitowych w JavaScript jest następująca:

– argumenty konwertowane są do 32-bitowej liczby całkowitej i wyrażone przez ciąg bitów,

– każdy bit w pierwszym argumencie jest dopasowany do odpowiedniego bitu w drugim argumencie,

– operator jest stosowany dla każdej pary bitów dając rezultat bitowy.

Wśród operacji bitowych wyróżniamy:

– iloczyn bitowy (and, operator &),

– suma bitowa (or, operator |),

– negacja bitowa (not, operator ~),

– różnica symetryczna (xor, operator ^).

Widać podobieństwo do operatorów logicznych. Różnica polega na tym, że operatory bitowe nie operują na wartościach logicznych, ani w ogóle na wartościach bezpośrednio, lecz na niższym poziomie – na poszczególnych bitach liczby.

Operatory bitowe traktują swoje argumenty jako zbiory 32 bitów (zer i jedynek), a nie jak liczby dziesiętne czy szesnastkowe. Przykładowo binarny zapis liczby dziesiętnej dziesięć to 1010.

Operatory bitowe dokonują swoich operacji na tych właśnie reprezentacjach dwójkowych, ale zwracają standardowe wartości liczbowe JavaScript.

Każda liczba może zostać zapisana w postaci binarnej – ciągu zer i jedynek, gdzie każda cyfra ciągu to pojedynczy bit, na którym można przeprowadzać właśnie operacje bitowe.

Operatory bitowe JavaScript – ściągawka

ANDa & bTylko 1 oraz 1 daje wynik 1, reszta 0
ORa | b1 gdziekolwiek daje wynik 1, 0 oraz 0 dają wynik 0
XORa ^ bZwraca 1 na pozycji, na której tylko jeden z argumentów jest jedynką, 1 i 1 oraz 0 i 0 dają 0
NOT~ aOdwraca(neguje) bity podanego argumentu
<<a << bPrzesunięcie bitowe w lewo, przesuwa bity w a o b bitów w lewo wstawiając zera z prawej strony
>>a >> bPrzesunięcie bitowe w prawo, przesuwa bity w a o b bitów w prawo usuwając nadmiarowe bity z prawej strony
>>>a >>> bZero-fill right shift / przesunięcie bitowe w prawo z wypełnieniem zerami. Przesuwa bity w a o b bitów w prawo usuwając nadmiarowe bity z prawej strony i dodając zera z lewej

Tablice prawdy

Dla niektórych osób bardziej obrazowe mogą być tablice prawdy dla poszczególnych operacji:

Bitowe AND (&):

aba AND b
000
010
100
111

Bitowe OR (|):

aba OR b
000
011
101
111


Bitowe XOR (^):

aba XOR b
000
011
101
110

Bitowe NOT (^):

aNOT a
01
10

Przesunięcia bitowe

… czyli przesuwanie bitów w liczbie o określoną liczbę pozycji. Efekt działania operacji przesunięcia można podsumować krótko:

a >> N jest to a / 2 ^ N
a << N jest to a * 2 ^ N

Przykład – przesunięcia bitowe:

// pomnożenie i podzielenie przez 2: wersja szybsza - bitowa
var a = 64 >> 4;
// czyli: 64 / 16 = 4

var b = 64 << 4;
// czyli: 64 * 16 = 1024

Jeśli chodzi natomiast o operator >>>, to różnica (w odniesieniu do operatora >>) w działaniu wychodzi na jaw dla liczb ujemnych.

W skrócie: liczby ujemne reprezentowane są tak, że mają zawsze ustawiony najbardziej znaczący bit. Operator >> sprawi, że ten bit nadal będzie ustawiony (liczba nadal będzie ujemna). W przypadku operatora >>> nie zachowa ustawienia tego bitu, przez co liczba zmieni się na dodatnią.

Przykłady – pozostałe operatory bitowe w JavaScript:

// bit not - odwrócenie bitów
var a = 10; // 00000000000000000000000000001010
a = ~a;     // 11111111111111111111111111110101

// bit and
var x1 = 10, x2 = 8;
var x3 = x1 & x2;

// bit or
var x1 = 10, x2 = 8;
var x3 = x1 | x2;

// bit xor
var x1 = 10, x2 = 8;
var x3 = x1 ^ x2;

Oczywiście istnieją też operatory przypisania dla operacji bitowych:

n &= 4; // n = n & 4
n |= 4; // n = n | 4
n ^= 4; // n = n ^ 4
n <<= 4; // n = n << 4
n >>= 4; // n = n >> 4
n >>>= 4; // n = n >>> 4

Podsumowanie

Omówiliśmy esencjalne informacje na temat operacji bitowych w JavaScript. Teraz pozostaje korzystać z nich w praktyce. Operatorów bitowych użyjemy przede wszystkim tam, gdzie zależy nam na szybkości obliczeń.

Również analizując kody źródłowe istniejących skryptów i aplikacji (do czego zawsze zachęcam, jako że jest to naprawdę dobra metoda nauki), zapewne natrafimy na ich użycie. Szczególnie w przypadku kodów gier, i generalnie operujących na grafice.

Na koniec, dla dociekliwych polecam bardziej rozbudowany artykuł na stronach Mozilla.

Następnymi tematami, które pojawią się na blogu wkrótce będą obsługa daty i czasu w JavaScript. Ponadto będziemy krok po kroku zgłębiać framework’i tego języka.

JavaScript Yeah!

Programista WWW i aplikacji mobilnych z wieloletnim doświadczeniem, początkujący bloger. Pasjonat programowania, nowych technologii, e-commerce, a także sportu i motoryzacji.

Twitter LinkedIn Google+ Skype Xing 

Podaj dalej: Share on Facebook1Tweet about this on TwitterShare on Google+3Share on LinkedIn2Share on Tumblr0Digg thisEmail this to someonePin on Pinterest1
Możesz skomentować leave a response, lub podać trackback z własnej strony.
  • Operacje bitowe są dobre, kiedy można za ich pomocą skrócić czas wykonania kodu. Jak w przypadku JS to wygląda? Np. dzielenie na 2?

    var a = 10;
    a = a>>1;

    var b = 10;
    b = b/2;

    W językach niższego poziomu [np. C] takie zabiegi są bardzo opłacalne.