2016-02-29 14 views
6

C'è this post, che ha recentemente ricevuto alcuni notevole gruppo di upvotes, chiedendo il + operatore in C.
mostra la seguente implementazione:Questa implementazione full adder è corretta?

// replaces the + operator 
int add(int x, int y) { 
    while(x) { 
     int t = (x & y) <<1; 
     y ^= x; 
     x = t; 
    } 
    return y; 
} 

Casualmente, ho scritto un'implementazione me stesso (un libro dell'algoritmo) e inventato quello:

uint32_t bit_add(uint16_t a, uint16_t b) { 
    uint32_t carry = ((uint32_t) a & b) << 1; 
    uint16_t add = a^b; 

    return carry^add; 
} 

L'ho provato un paio di volte e sembra funzionare. Il fatto è che è significativamente più veloce dell'implementazione dal post di riferimento, privo di salti su un x86.

La mia implementazione è corretta o c'è qualcosa di sbagliato di cui non sono a conoscenza?
Non riesco a immaginare che il mio codice sia più veloce del codice di un post così spesso visto e rivisto.

+0

Non ho controllato, ma potrebbe essere corretto. Non dare per scontato che le persone scrivano sempre il codice più efficiente possibile; Dopo tutte queste risposte sono state create principalmente per problemi di giocattoli o per scopi dimostrativi, non per uso effettivo (+ è ancora più veloce). – Cubic

+0

I due esempi sono diversi, il primo gestisce un bit per istruzione in loop, nel vostro tutti i bit sono interessati. Il compilatore potrebbe anche aver ottimizzato il tuo codice. – purplepsycho

+0

Prova ad aggiungere 3 e 7, emette 2. – Kenney

risposta

6

La funzione non funziona.

Un semplice controesempio è 127 + 1.

Questo è facile da vedere. Il numero 127 ha tutti i bit significativi di 7 bit impostati su 1. And con il numero 1 e spostandolo a sinistra darà il valore 2. Da quel momento in poi, usando l'operatore xor, nessuna combinazione di valori che abbiamo a disposizione , può produrre un valore maggiore di 127.

+0

Crap, hai ragione. Potresti spiegare perché?Sto già per iniziare il debug ma una spiegazione renderebbe una risposta ancora più bella, IMO ... – Downvoter

+0

@cad calcoli correttamente 'add' e' carry', ma nell'istruzione 'return' hai commesso un errore! è lì che ti serve il ** Loop ** – Lrrr

+0

@cad Vedere l'aggiornamento. – 2501

Problemi correlati