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.