x^y
è x XOR y
, il risultato ha 1 per i bit x ed y sono diverse e 0 per i bit sono stessi:
x = 01010011
y = 00010011
x^y = 01000000
^(x^y) nega questo, cioè, si ottiene 0 per i bit sono diversi e 1 altrimenti:
^(x^y) = 10111111 => z
quindi iniziamo spostando z a destra per mascherare i bit da sola. Uno spostamento pads lato sinistro del numero con zero bit:
z >> 4 = 00001011
Con l'obiettivo di propagare eventuali zeri z
al risultato, iniziare ANDing:
z = 10111111
z >> 4 = 00001011
z & (z >> 4) = 00001011
volte anche il nuovo valore per spostare qualsiasi zero a destra:
z = 00001011
z >> 2 = 00000010
z & (z >> 2) = 00000010
ulteriormente volte all'ultimo bit:
z = 00001010
z >> 1 = 00000001
z & (z >> 1) = 00000000
D'altra parte, se avete x == y
inizialmente, va in questo modo:
z = 11111111
z (& z >> 4) = 00001111
z (& z >> 2) = 00000011
z (& z >> 1) = 00000001
Quindi è davvero restituisce 1 quando x == y
, 0 altrimenti.
In genere, se xey sono zero, il confronto può richiedere meno tempo rispetto ad altri casi. Questa funzione cerca di far sì che tutte le chiamate abbiano la stessa durata indipendentemente dai valori dei suoi ingressi. In questo modo, un utente malintenzionato non può utilizzare attacchi basati sui tempi.