O desafio
Implemente uma função que aceite dois números inteiros cujos valores variam de 0 a 255 e retorne a soma dos números inteiros mod 256. Você pode usar apenas operadores de negação bit a bit (~), bit a bit ou (|), deslocamento de bits (>>, <<) e atribuição (=).
Coisas que você não pode usar incluem (mas não estão limitadas a)
- Adição, subtração, multiplicação e divisão
- rotações
- Instruções condicionais
- Chamadas de função
O menor número de usos de operações binárias ou negativas binárias e de troca de bits vence . Em caso de empate, a solução mais popular vence. Como sempre, lacunas padrão se aplicam.
Aqui está um exemplo de um somador simples de 2 bits. Ele usa 77 negações binárias, 28 ors binários e turnos de 2 bits para uma pontuação total de 107 (isso pode ser visto executando o pré-processador C com gcc -E
). Isso poderia ser muito mais eficiente removendo os se #define
simplificando as expressões resultantes, mas eu as deixei para maior clareza.
#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));
}
}
}
}
Atualização: Exemplo adicionado e critério de pontuação alterado