Kolejne ćwiczenia bitwise. Dostajemy funkcję i mamy opisać jej działanie. Do dzieła.
Jak działa ta funkcja?
function isEvenBitwise(num){
num = num & 1;
return num ^ 1;
}
Cóż, najpierw jest test na nieparzystość, czyli czy funkcja posiada 1 (jedyna nieparzysta wartość na pozycji w systemie dwójkowym):
8 4 2 1
1 1 1 0 (14)
0 0 0 1 (1)
------- &
0 0 0 0
ZERO - 14 nie jest nieparzyste
Potem zamieniamy 0 na 1 lub 1 na 0:
0 0 0 0
0 0 0 1
--------
0 0 0 1
0 0 0 1
0 0 0 1
--------
0 0 0 0
Ok, inna funkcja, która robi to samo:
function isEvenBitwise(num){
return ((((num >> 1) << 1) ^ num) ^ 1);
}
Jak to działa?
Cóż, najpierw dzielimy przez 2 (bez reszty):
console.log(8 >> 1); //4
console.log(9 >> 1); //4
Potem mnożymy przez 2:
console.log(4 << 1); //8
console.log( (4 << 1) === 8); //true
console.log( (4 << 1) === 9); //false
Sprawdzamy, czy liczby są równe sobie poprzez takie coś:
1 0 0 0
1 0 0 0 ^
---------
0 0 0 0 (zero, 8 JEST === 8)
1 0 0 1
1 0 0 0 ^
-------
0 0 0 1 (1, czyli 9 nie jest === 8, zera nie ma)
Jeszcze zamieniamy 0 na 1. Taki numer możemy odstawić tylko dlatego, że różnica między num // 2 * 2 nigdy nie przekracza 1.
To jest, 10 // 2 * 2 to 10, 11 // 2 * 2 to 11-1. To o tyle istotne, że chcemy aby funkcja zwracała albo 0 albo 1 a nie albo 0 albo dowolne nie-zero… Tutaj tego problemu nie mamy, ale w bitowych trzeba mieć się na baczności i włączyć takie trochę inne myślenie.