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.