La sfida
Implementare una funzione che accetta due numeri interi i cui valori vanno da 0 a 255 e restituisce la somma di questi numeri interi mod 256. È possibile utilizzare solo operatori negazione bit a bit (~), bit a bit o (|), bit shifting (>>, <<) e assegnazione (=).
Le cose che non puoi usare includono (ma non sono limitate a)
- Addizione, sottrazione, moltiplicazione e divisione
- Loops
- Dichiarazioni condizionali
- Chiamate di funzione
Vince il minor numero di operazioni binarie o di negazione binaria e di spostamento dei bit . In caso di pareggio, vince la soluzione più popolare. Come sempre, si applicano scappatoie standard .
Ecco un esempio di un semplice sommatore a 2 bit. Usa 77 negazioni binarie, 28 binari e 2 bit-shift per un punteggio totale di 107 (questo può essere visto eseguendo il preprocessore C con gcc -E
). Potrebbe essere reso molto più efficiente rimuovendo le #define
s e semplificando le espressioni risultanti, ma le ho lasciate chiare per chiarezza.
#include <stdio.h>
#define and(a, b) (~((~a)|(~b)))
#define xor(a, b) (and(~a,b) | and(a,~b))
int adder(int a, int b)
{
int x, carry;
x = xor(and(a, 1), and(b, 1));
carry = and(and(a, 1), and(b, 1));
carry = xor(xor(and(a, 2), and(b, 2)), (carry << 1));
x = x | carry;
return x;
}
int main(int argc, char **argv)
{
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (adder(i, j) != (i + j) % 4) {
printf("Failed on %d + %d = %d\n", i, j, adder(i, j));
}
}
}
}
Aggiornamento: esempio aggiunto e modifica dei criteri di punteggio