Operacije nad bitovima u JavaScriptu
Operacije nad bitovima su dobro poznate programerima koji rade u jezicima nižeg nivoa. Ipak, implementacije određenih algoritama, kao i rad sa grafikom mogu zahtevati rad sa bitovima.
Operandi su uvek 32-bitni označeni celi brojevi. Ako se zada racionalni broj, on se konvertuje u celi broj otkidanjem decimala (znači, ne koristi se matematičko zaokruživanje). Ako se zada tekst, znakovi se neće konvertovati u bajtove, već će imati vrednost 0.
U tabeli je dat spisak operacija nad bitovima koje su podržane u JavaScript-u.
Operator | Primer | Asocijativnost |
---|---|---|
Negacija bitova | ~x | ulevo |
Šiftovanje ulevo | x<<y | udesno |
Šiftovanje udesno sa pamćenjem znaka | x>>y | udesno |
Šiftovanje udesno | x>>>y | udesno |
AND nad bitovima | x&y | udesno |
XOR nad bitovima | x^y | udesno |
OR nad bitovima | x|y | udesno |
Negacija bitova
Ovo je jedina unarna operacija nad bitovima. Istovremeno je i najjača, odnosno, ako ne koristimo zagrade, uvek će najpre da se izvrše sve negacije u izrazu, pa tek onda ostale operacije.
Operacija je jednostavna - svaki bit u broju se "obrće". To znači da jedinice postaju nule, a nule, jedinice.
A | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 1 |
~A | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
Šiftovanje
Šiftovanje predstavlja pomeranje bitova ulevo ili udesno. Kod ovakvih operacija, potrebno je uvek imati u vidu šta se dešava sa bitovima koji "ispadnu" i kako se definišu novi bitovi koji se pojavljuju.
Prvi operan de broj nad kojim se vrši premeštanje bitova, a drugi operand je ofset (pomeraj), odnosno za koliko bitova se vrši pomeranje.
Bitovi koji "ispadnu" se, kod svih operacija šiftovanja, zanemaruju. Ovo je suprotno od operacije rotacije bitova kod koje se "otpali" bitovi pojavljuju sa druge strane. Operacija rotacije bitova ne postoji u JavaScriptu.
Šiftovanje ulevo
Pri šiftovanju ulevo se bitovi pomeraju prema "jačim" pozicijama, tj. ulevo. Mesta koja ostanu upražnjena sa desne strane, popunjavaju se nulama.
A | 1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 |
A<<1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 | 0 |
Šiftovanje udesno sa pamćenjem znaka
Pri šiftovanju udesno, bitovi se "spuštaju" naniže, tj. udesno. Novi bitovi sa leve strane su jednaki krajnjem levom bitu originalnog broja.
Zbog toga se ovo zove šiftovanje sa pamćenjem znaka - kod označenih celih brojeva, brojevi koji imaju setovan najviši bit su uvek negativni, dok su brojevi kojima je najviši bit jednak nuli, pozitivni. Ako se ovaj bit nikada ne menja, neće se menjati ni znak broja.
A | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
A>>2 | 1 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
Šiftovanje udesno
Obično šiftovanje udesno, bitove "spušta" naniže, a prazna mesta sa leve strane popunjavaju se nulama.
Ova operacija praktično predstavlja celobrojno deljenje sa dva za svaki bit "pomaka".
A | 1 | 0 | 1 | 0 | 1 | 1 | 1 | 0 |
A>>>2 | 0 | 0 | 1 | 0 | 1 | 0 | 1 | 1 |
AND-ovanje
Ova operacija se obavlja kao logička konjukcija ali "bit-na-bit". Drugim rečima, operacija povezuje bitove dva broja. Za svaki bit prvog broja gleda se odgovarajući bit drugog broja. Rezultat se dobija prema poznatom logičkom pravilu:
a | b | a & b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
Kao što vidimo, rezultujući bit će biti setovan samo ako su oba bitova jedinice. Da pogledamo primer:
A | 1 | 0 | 1 | 1 | 1 | 0 | 1 | 1 |
B | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 |
A&B | 1 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
OR-ovanje
Operacija "ILI" se obavlja kao logička disjunkcija nad bitovima dva broja. Tablica tautologije je sledeća:
a | b | a | b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
Dakle, rezultujući bit će biti setovan ako je makar jedan od bitova jedinica. Da pogledamo primer:
A | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
B | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
A|B | 1 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
XOR-ovanje
Kod operacije "ekskluzivno ILI" drugi operand praktično predstavlja "semafor" prema kome se dobija rezultat na osnovu prvog broja. Pogledajmo pravilo:
a | b | a ^ b |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
Dakle, rezultujući bit će biti jedinica ako su bitovi različiti, a nula ako su isti. Može da se posmatra i na sledeći način: "svaka jedinica bita b, obrće bit a, dok ga nula ne menja".
A | 1 | 0 | 0 | 1 | 1 | 0 | 0 | 1 |
B | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 0 |
A^B | 0 | 1 | 0 | 1 | 0 | 0 | 1 | 1 |
Primer
var x = 12;
var x1 = x << 2; // šiftovanje ulevo za dva bita - efektivno kao množenje sa 4