Соревнование
Реализуйте функцию, которая принимает два целых числа, значения которых находятся в диапазоне от 0 до 255, и возвращает сумму этих целых чисел mod 256. Вы можете использовать только побитовое отрицание (~), побитовое или (|), операторы сдвига битов (>>, <<) и назначение (=).
Вещи, которые вы не можете использовать, включают (но не ограничиваются ими)
- Сложение, вычитание, умножение и деление
- Loops
- Условные заявления
- Вызовы функций
Наименьшее использование двоичных операций, двоичного отрицания и операций сдвига битов выигрывает . В случае ничьей побеждает самое популярное решение. Как всегда, применяются стандартные лазейки .
Вот пример простого 2-битного сумматора. Он использует 77 бинарных отрицаний, 28 бинарных ордеров и 2 сдвига битов для общей оценки 107 (это можно увидеть, запустив препроцессор C с gcc -E
). Это можно сделать намного эффективнее, удалив #define
s и упростив полученные выражения, но я оставил их для ясности.
#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));
}
}
}
}
Обновление: добавлен пример и изменен критерий оценки.