Quando si cerca di scoprire se un numero è pari o dispari: AND 1 o O 0

0

Recentemente ho appreso del trucco per scoprire se un numero binario è pari o dispari.

If the last bit in the number is 0, then the number is even. If it ends in a 1, then the number is odd.

Nel tutorial in cui leggo questo, si afferma che questo potrebbe essere applicato alla programmazione se si "E" il numero con il numero binario 1.

In un altro tutorial che ho letto, hanno detto che è possibile applicare se "O" il numero con 0 binario.

Riguardo all'efficienza, quale metodo sarebbe più efficiente per scoprire se un numero è pari o dispari?

    
posta SirPython 03.01.2015 - 19:42
fonte

2 risposte

2

In definitiva, ciò dipende dal processore o dall'interprete che stai usando. Non ho riscontrato una situazione in cui queste operazioni differivano in modo rispettabile nei tempi di esecuzione.

Uno sviluppatore GMP conserva un documento sulle latenze e throughput delle istruzioni x86 / amd64 . Questo documento mostra che entrambe le istruzioni AND e OR hanno gli stessi tempi quando entrambi gli argomenti sono registri. Quando uno degli operandi è un indirizzo di memoria, ovviamente il tempo potrebbe cambiare quando quella memoria non è nella cache. Ma questa non è una funzione dell'istruzione.

Sfortunatamente, non posso parlare ad altri processori o se le persone hanno fatto cose asinine negli interpreti che causerebbero una disparità di rendimento.

    
risposta data 03.01.2015 - 19:49
fonte
1

Esiste un'istruzione Bit Test nel set di istruzioni x86 (dal 80386):

BT copies a bit from a given register to the carry flag.

A quanto ho capito, puoi quindi eseguire un'istruzione JC (jump se carry) per prendere una decisione basata sul flag di carry. Questo è un totale di due istruzioni elementali e utilizza un solo registro.

Tuttavia, dubito che sia più efficiente dell'utilizzo di AND con 1 e salta se è impostato il flag di zero. Entrambe le alternative sono due istruzioni CPU elementali. È possibile che la costante per specificare il bit nell'istruzione BT utilizzi meno bit dell'operando costante dell'istruzione AND , ma non mi preoccuperò di cercarlo. :)

Questo probabilmente significa che il metodo OR è meno efficiente perché dovresti fare il OR , quindi confrontare il numero originale e saltare se uguale o non uguale, che perlomeno sta legando 2 registri invece di 1.

Un'alternativa leggermente migliore di AND potrebbe essere l'istruzione TEST perché esegue un AND ma butta via il risultato dell'operazione e mantiene solo i flag impostati. Dato che in realtà non vuoi mantenere il risultato, allora TEST eax, 1 seguito da jump se zero ( JZ ) potrebbe essere la soluzione migliore (dato che è possibile che tu voglia fare qualcos'altro con il valore originale e questo lo lasci caricato nel registro).

    
risposta data 03.01.2015 - 19:59
fonte

Leggi altre domande sui tag