Gli operatori bit a bit convertono sempre i loro operandi in un numero intero. Quindi, 4 >> trueè lo stesso 4 >> 1che farà un po 'di spostamento a destra di una posizione
(decimal) 4 = (binary) 100
(binary) 100 >> 1 = (binary) 010
(binary) 010 = (decimal) 2
Quindi, usare trueo falseè solo un modo per usare rotatoria 1o 0.
La notNotNotfunzione ha un funzionamento molto semplice, nel complesso:
a%2converte il primo numero in 0pari o 1dispari.
>> bsi sposta a destra di entrambe le 0posizioni per falseo 1posizione per true.
aè dispari (1) ed bè false=1
- ci sono zero spostamenti a destra, quindi il numero rimane lo stesso.
aè dispari (1) ed bè true=0
- l'unico bit impostato
1viene spostato a destra e scartato.
aè pari (0) ed bè false=0
- ci sono zero spostamenti a destra, quindi il numero rimane lo stesso.
aè pari (0) ed bè true=0
- il numero di base è
0che non ha nessun bit impostato, quindi spostando a destra qualsiasi importo non lo cambia.
!!() converte il risultato in booleano.
Detto questo, la soluzione qui è sbagliata, poiché notNotNot(2, true)produrrà false- aè pari ed bè true. L'aspettativa è che produrrà da trueallora !!true = true. Lo stesso problema è presente per qualsiasi numero pari e true.
Può essere facilmente risolto usando XOR bit a bit invece di spostamento a destra:
aè dispari (1) ed bè false=1
- entrambi corrispondono, quindi vengono visualizzati
0
aè dispari (1) ed bè true=0
- non corrispondono, quindi otteniamo
1
aè pari (0) ed bè false=0
- entrambi corrispondono, quindi arriviamo
0
aè pari (0) ed bè true=1
- non corrispondono, quindi otteniamo
1
notNotNot = (a,b) => !!(a%2 ^ b);
console.log("!!true = ", notNotNot(2, true))
console.log("!!!true =", notNotNot(3, true))
console.log("!!false = ", notNotNot(2, false))
console.log("!!!false = ", notNotNot(3, false))
//bonus
console.log("true = ", notNotNot(0, true))
console.log("false = ", notNotNot(0, false))
Solo per completezza, nel caso in cui si desideri un'operazione completamente bit a bit:
L'operazione modulo %2può essere modificata in modo bit a bit E &1ottenere il bit più basso. Per i numeri pari, ciò produrrebbe 0dal momento che dovresti calcolare
xxx0
&
0001
che è zero. E per i numeri dispari vale lo stesso ma ne otterrai uno come risultato:
xxx1
&
0001
Quindi i risultati di a&1e a%2sono identici. Inoltre, anche se le operazioni bit a bit convertono il numero in un numero intero con segno a 32 bit che non ha importanza in quanto la parità verrebbe mantenuta.
//larger than 31 bits
const largeValue = 2**31 + 1;
//larger than 32 bits
const veryLargeValue = 2**32 + 1
console.log("2**31 + 1 =", largeValue);
console.log("2**32 + 1 =", veryLargeValue);
console.log("2**31 + 1 to 32-bit signed integer =", largeValue | 0);
console.log("2**32 + 1 to 32-bit signed integer = ", veryLargeValue | 0);
const isOddModulo = number =>
console.log(`(${number} % 2) can detect an odd number: ${(number % 2) === 1}`);
const isOddBitwise = number =>
console.log(`(${number} & 1) can detect an odd number: ${(number & 1) === 1}`);
isOddModulo(largeValue);
isOddBitwise(largeValue);
isOddModulo(veryLargeValue);
isOddBitwise(veryLargeValue);
true=1(decimale) =01(binario) spostato a sinistra di uno produrrebbe10binario o2decimale.