Die Herausforderung
Implementieren Sie eine Funktion, die zwei Ganzzahlen akzeptiert, deren Werte von 0 bis 255 reichen, und die Summe dieser Ganzzahlen (Mod 256) zurückgibt. Sie können nur bitweise Negation (~), bitweise oder (|), Bitverschiebungsoperatoren (>>, <<) verwenden. und Zuweisung (=).
Zu den Dingen, die Sie nicht verwenden können, gehören (ohne darauf beschränkt zu sein)
- Addition, Subtraktion, Multiplikation und Division
- Schleifen
- Bedingte Anweisungen
- Funktionsaufrufe
Die wenigsten Verwendungen von binären oder binären Negations- und Bitverschiebungsoperationen gewinnen . Bei einem Gleichstand gewinnt die beliebteste Lösung. Wie immer gelten Standardlücken .
Hier ist ein Beispiel eines einfachen 2-Bit-Addierers. Es verwendet 77 binäre Negationen, 28 binäre Ors und 2 Bitverschiebungen für eine Gesamtpunktzahl von 107 (dies kann durch Ausführen des C-Präprozessors mit angezeigt werden gcc -E
). Es könnte viel effizienter gemacht werden, indem man die #define
s entfernt und die resultierenden Ausdrücke vereinfacht, aber ich habe sie der Klarheit halber belassen.
#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));
}
}
}
}
Update: Beispiel hinzugefügt und Bewertungskriterien geändert