Deo zbornika Napredni Javaskript

Bitovni operatori u Javaskriptu

Za detaljno objašnjenje koncepta vidi Bitovni operatori

Iako se bitovski operatori uglavnom koriste u jezicima nižeg nivoa, mogu imati par korisnih primena u Javaskriptu. U tim slučajevima, oni su uglavnom brža alternativa drugim operacijama.

Provera jel broj paran / neparan

Provera jel broj neparan se može izvršiti pomoću bitovskog i (&). Na primer, ovako proveravamo jel broj 7 neparan:

7 & 1

Za broj 4 dobićemo drukčiji rezultat:

4 & 1

Objašnjenje:

// 7 & 1
00000111 // 7
00000001 // 1
--------
00000001 // 1 (neparan)

// 4 & 1
00000100 // 4
00000001 // 1
--------
00000000 // 0 (paran)

Zamena vrednosti varijabli

Pomoću ekskluzivnog ili (^) možemo zameniti vrednosti dve varijable, bez pomoći treće.

let a = 97, b = 98

a = a ^ b
b = b ^ a
a = a ^ b

console.log(a, b)

Može i skraćeno:

let a = 97, b = 98

a ^= b
b ^= a
a ^= b

console.log(a, b)

Objašnjenje:

// a = 97 (1100001)
// b = 98 (1100010)

// a ^= b
1100001 // 97 (a)
1100010 // 98 (b)
-------
0000011 // 3 (a)

// b ^= a
1100010 // 98 (b)
0000011 // 3 (a)
-------
1100001 // 97 (b)

// a ^= b
0000011 // 3 (a)
1100001 // 97 (b)
-------
1100010 // 98 (a)

Zaokruživanje brojeva

Dvostruka bitovska negacija (~~) i bitovsko pomeranje (>> ili <<) nam mogu služiti za brzo zaokruživanja brojeva.

Zaokruživanje pozitivnih brojeva

Dvostruka negacija pozitivnih brojeva može zameniti Math.floor() funkciju:

~~(5.3)

Zaokruživanje se može vršiti i pomoću “lažnog” bitovskog pomeranja (pomera za nula mesta ulevo ili udesno, zapravo menja samo tip):

5.3 >> 0
5.3 << 0

Zaokruživanje negativnih brojeva

Dvostruka bitovska negacija negativnih brojeva može zameniti Math.ceil():

~~(-5.3)

Bitovsko pomeranje takođe radi za negativne brojeve:

-5.3 >> 0
-5.3 << 0

Množenje i deljenje sa dva

Pomoću bitovnih pomeranja možemo brzo množiti i deliti brojeve sa osnovom dva. Na primer, delimo broj napola jedanput:

8 >> 1

Deli broj napola dva puta:

8 >> 2

Ili množimo broj sa dva jedanput:

8 << 1

Množimo broj sa dva dva puta:

8 << 2

Objašnjenje:

// 8 >> 1
00001000 // 8
00000100 // 4

// 8 >> 2
00001000 // 8
00000010 // 2

// 8 << 1
00001000 // 8
00010000 // 16

// 8 << 2
00001000 // 8
00100000 // 32

Konverzija tipa

Pomoću bitovnih operacija možemo vršiti efikasnu konverziju prostih tipova u broj. Npr. uz pomoć disjunkcije:

"3" | 0
true | 0

Ili pomoću “lažnog” pomeranja:

"5" >> 0
true >> 0

Obrtanje vrednosti

Pomoću bitovnog isključivog ili (^) možemo obrtati vrednost između 0 i 1.

let stanje = 0
stanje ^= 1

I obratno:

let stanje = 1
stanje ^= 1