Ricerca…
Rilevamento di parità del numero con AND bit a bit
Invece di questo (purtroppo troppo spesso visto nel codice reale) "capolavoro":
function isEven(n) {
return n % 2 == 0;
}
function isOdd(n) {
if (isEven(n)) {
return false;
} else {
return true;
}
}
Puoi fare il controllo di parità molto più efficace e semplice:
if(n & 1) {
console.log("ODD!");
} else {
console.log("EVEN!");
}
(questo è valido non solo per JavaScript)
Scambiare due numeri interi con bit XOR bit (senza allocazione di memoria aggiuntiva)
var a = 11, b = 22;
a = a ^ b;
b = a ^ b;
a = a ^ b;
console.log("a = " + a + "; b = " + b);// a is now 22 and b is now 11
Moltiplicazione o divisione più rapida con poteri di 2
I bit di spostamento a sinistra (a destra) equivale a moltiplicare (dividendo) per 2. È lo stesso nella base 10: se "spostiamo a sinistra" 13
di 2
posizioni, otteniamo 1300
o 13 * (10 ** 2)
. E se prendiamo 12345
e "right-shift" di 3
posizioni e quindi rimuoviamo la parte decimale, otteniamo 12
o Math.floor(12345 / (10 ** 3))
. Quindi se vogliamo moltiplicare una variabile per 2 ** n
, possiamo spostarci a sinistra di n
bit.
console.log(13 * (2 ** 6)) //13 * 64 = 832
console.log(13 << 6) // 832
Allo stesso modo, per eseguire la divisione intera (floored) di 2 ** n
, possiamo spostare a destra di n
bit. Esempio:
console.log(1000 / (2 ** 4)) //1000 / 16 = 62.5
console.log(1000 >> 4) // 62
Funziona anche con numeri negativi:
console.log(-80 / (2 ** 3)) //-80 / 8 = -10
console.log(-80 >> 3) // -10
In realtà, è improbabile che la velocità dell'aritmetica abbia un impatto significativo sul tempo di esecuzione del codice, a meno che non si stia eseguendo l'ordine di centinaia di milioni di calcoli. Ma i programmatori C adorano questo genere di cose!