Iniziamo con l'istruzione 'operazioni bit a bit su numeri interi non associati senza significato'. Non testerai se il numero 2 128 ha un esponente pari o no. L'area del problema è vincolata, diciamo, a 32 bit senza segno. Questo potrebbe anche essere facilmente 64 (il tipo di dati long
), ma è più facile digitare numeri a 32 bit.
Il numero 2 n , quando scritto in binario ha esattamente un 1
in esso:
2 0 = 0...0001
2 1 = 0...0010
2 2 = 0...0100
2 3 = 0...1000
e così via. La domanda quindi è "quale operazione bit a bit avrà un valore che è 0
o non 0
quando viene eseguito rispetto a tale numero?"
Il valore sarebbe 2 2 + 2 0 che ci dà 5. Questo pattern si ripete per tutti gli esponenti pari.
Quindi, l'operazione bit a bit è & 5
(o & A
). Il valore di 5 2 è 0101
con i valori dispari come 0
, mentre 10 2 è 1010
con i valori pari come 0
. Questo valore viene quindi eseguito per ogni nyble (mezzo byte) nel numero: il valore a cui siamo interessati è 0101 0101 0101 0101 0101 0101 0101 0101
o 0x55555555
n & 0x55555555
darà un valore di 0
quando la potenza di 2 è dispari e qualche altro valore quando la potenza di 2 è pari. n & 0xAAAAAAAA
farà l'opposto ( 0
quando la potenza di 2 è pari e qualche altro valore quando è dispari).
n & 0x55555555
è in effetti n & (2 0 + 2 2 + 2 4 + 2 6 + ... + 2 30 ) che, di nuovo, ci dà la risposta che cerchiamo.