El reto
Implemente una función que acepte dos enteros cuyos valores oscilen entre 0 y 255 y devuelva la suma de esos enteros mod 256. Solo puede usar la negación a nivel de bit (~), a nivel de bit o (|), operadores de desplazamiento de bit (>>, <<) y asignación (=).
Las cosas que no puede usar incluyen (pero no están limitadas a)
- Suma, resta, multiplicación y división.
- Bucles
- Declaraciones condicionales
- Llamadas a funciones
Pocos usos de operaciones binarias o de negación binaria, y bit shift ganan . En caso de empate, gana la solución más popular. Como siempre, se aplican las lagunas estándar .
Aquí hay un ejemplo de un simple sumador de 2 bits. Utiliza 77 negaciones binarias, 28 or binarias y 2 cambios de bits para una puntuación total de 107 (esto se puede ver ejecutando el preprocesador C con gcc -E
). Podría hacerse mucho más eficiente eliminando los #define
sy simplificando las expresiones resultantes, pero los dejé para mayor claridad.
#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));
}
}
}
}
Actualización: ejemplo agregado y criterios de puntuación cambiados