logo
close

Operatory bitowe

2 marca 2019
simplie Komentarze: 0 Kategoria: Kurs JavaScript

Operatory bitowe są blisko spokrewnione z operatorami logicznymi – istnieje mianowicie iloczyn bitowy (operator &), suma bitowa (operator |) oraz negacja bitowa (operator ~). Różnica tutaj polega na tym, iż operują one na poszczególnych bitach liczby, a nie na wartościach logicznych jak operatory logiczne.

Każda liczba może zostać zapisana także w systemie dwójkowym (binarnym), gdzie każda cyfra będzie reprezentować jeden bit. Np. liczbie 10 w systemie dziesiętnym odpowiada liczna 1010 w systemie dwójkowym (1 * 23 + 0 * 22 + 1 * 21 + 0 * 20 = 1 * 8 + 1 * 2 = 10).

Operator negacji bitowej ~ (znak tylda) służy do negacji poszczególnych bitów w liczbie, np.:

var n = 10; // 00000000000000000000000000001010
n = ~n;     // 11111111111111111111111111110101

Powyższy wynik dotyczy oczywiście przypadku gdy liczby są 32-bitowe (tak jest zazwyczaj). Jeżeli spróbujesz go sobie wyświetlić jako liczbę, to zobaczysz że jest ona równa -11. Wynika to ze sposobu w jaki zapisywane są w pamięci komputera liczby – stosowany jest tzw. kod uzupełnień do 2, w skrócie U2. Więcej na ten temat możesz przeczytać np. w Wikipedii.

Operator iloczynu bitowego & sprawdza wartości poszczególnych bitów w liczbie, i na tej podstawie ustala wynik – jeżeli obydwa bity były równe 1, wynikowy bit też jest równy 1; w przeciwnym wypadku jest on równy 0.

var n1 = 12;      // 12 = 1100
var n2 = 10;      // 10 = 1010
var n3 = n1 & n2; //  8 = 1000

W przypadku operatora sumy bitowej | wynikowy bit jest równy jeden jeżeli co najmniej jeden z bitów w liczbach był równy 1.

var n1 = 12;      // 12 = 1100
var n2 = 10;      // 10 = 1010
var n3 = n1 | n2; // 14 = 1110

Oprócz wymienionych operatorów jest także operator różnicy symetrycznej XOR, który zapisuje się jako ^. Wynikiem działania tego operatora są wartości 1 na tych bitach, które były różne i 0 tam gdzie bity miały identyczne wartości.

var n1 = 12;      // 12 = 1100
var n2 = 10;      // 10 = 1010
var n3 = n1 ^ n2; //  6 = 0110

Dostępne są także operatory przesunięć bitowych, które przesuwają wszystkie bity w liczbie o określoną liczbę pozycji. Pierwszym z nich jest operator przesunięcia bitowego w lewo <<, który przesuwa bity w lewo o podaną liczbę pozycji:

var n = 12;      // 12 = 001100
n = n << 2;      // 48 = 110000

Drugim operatorem jest operator przesunięcia bitowego w prawo >>, który od powyższego różni się tylko kierunkiem przesuwania bitów:

var n = 48;      // 48 = 110000
n = n >> 2;      // 12 = 001100

Ostatni operator posiada także specjalną wersję, która traktuje liczby jako liczby bez znaku (jest on zapisywany jako >>>). Różnica w ich działaniu ujawnia się dla liczb ujemnych, które mają zawsze ustawiony najbardziej znaczący bit. Omawiany wcześniej operator spowoduje że ten bit nadal będzie ustawiony (liczba nadal będzie ujemna). Ten tutaj natomiast nie zrobi tego, przez co liczba zmieni się na dodatnią:

var n1 = -1, n2 = -13; //  -1 = 11111111111111111111111111110011
n1 = n1 >> 2;          //  -4 = 11111111111111111111111111111100
n2 = n2 >>> 2;  // 1073741820 = 00111111111111111111111111111100

Komentarze

Komentarz

Komentując, akceptujesz Politykę prywatności