Pari o Dispari: modulo o somma logica?



Problema tipico no? Dato un numero N dire se è pari o dispari, la soluzione umanamente più immediata è calcolare il resto della divisione con 2 che deve essere zero, nella maggior parte dei linguaggi:

N % 2 == 0.

Però ci si dimentica che il computer gira in binario e che può fare un’operazione ancora più veloce: n & 1; ovvero la somma logica.

Essendo a base due tutti i numeri pari terminanti con lo zero basta guardare se terminano con esso, per farlo si può fare un And con il numero 1 il che darà 1 se il numero da controllare finisce per 1 (e quindi è dispari) e 0 se invece è pari.

Ecco il codice di esempio (la sintassi è quella stile C in quanto la più diffusa):


if(x & 1) //dispari
else // pari

Ecco l’assembly risultante messo a confronto:

x % 2
—-
00401043 mov ecx,dword ptr [ebp-4]
00401046 and ecx,80000001h
0040104C jns main+43h (00401053)
0040104E dec ecx
0040104F or ecx,0FEh
00401052 inc ecx
00401053 test ecx,ecx
00401055 je main+50h (00401060)

x & 1
—–
00401043 mov ecx,dword ptr [ebp-4]
00401046 and ecx,1
00401049 test ecx,ecx
0040104B je main+46h (00401056)

Come soluzione sarà meno intuitiva, ma più performante e secondo me fa anche più skill ; – ).

Annunci sponsorizzati:
Condividi su Facebook Condividi su Twitter!
Pinterest