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.
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
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
Prova ad aggiungere 3 e 7, emette 2. – Kenney