Змагання
Реалізуйте функцію, яка приймає два цілі числа, значення яких варіюються від 0 - 255 і повертає суму цих цілих чисел mod 256. Ви можете використовувати лише побітові заперечення (~), порозрядне чи (|), бітові оператори зсуву (>>, <<) , і призначення (=).
Речі, які ви не можете використовувати, включають (але не обмежуються ними)
- Додавання, віднімання, множення та ділення
- Петлі
- Умовні твердження
- Функціональні дзвінки
Виграє мало хто з використання двійкових або, бінарних заперечень та операцій зі зміною бітів . У разі вирівнювання виграє найпопулярніше рішення. Як завжди, застосовуються стандартні лазівки .
Ось приклад простого 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));
}
}
}
}
Оновлення: Додано приклад та змінено кількість балів