Wyzwanie
Zaimplementuj funkcję, która akceptuje dwie liczby całkowite, których wartości mieszczą się w zakresie od 0 do 255 i zwraca sumę tych liczb całkowitych mod 256. Możesz używać tylko negacji bitowej (~), bitowej lub (|), operatorów przesunięcia bitów (>>, <<) i przypisanie (=).
Do rzeczy, których nie można użyć, należą (ale nie wyłącznie)
- Dodawanie, odejmowanie, mnożenie i dzielenie
- Pętle
- Instrukcje warunkowe
- Wywołania funkcji
Wygrywa niewiele zastosowań binarnych lub binarnych negacji i operacji przesunięcia bitów . W przypadku remisu wygrywa najpopularniejsze rozwiązanie. Jak zawsze obowiązują standardowe luki .
Oto przykład prostego 2-bitowego sumatora. Wykorzystuje 77 binarnych negacji, 28 binarnych orów i 2 przesunięcia bitów, co daje łączny wynik 107 (można to zobaczyć po uruchomieniu preprocesora C gcc -E
). Można to uczynić znacznie bardziej wydajnym, usuwając #define
s i upraszczając powstałe wyrażenia, ale zostawiłem je dla jasności.
#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));
}
}
}
}
Aktualizacja: Dodano przykład i zmieniono kryteria punktacji