Le défi
Implémentez une fonction qui accepte deux entiers dont les valeurs vont de 0 à 255 et renvoie la somme de ces entiers mod 256. Vous ne pouvez utiliser que la négation au niveau du bit (~), au niveau du bit ou (|), des opérateurs de décalage de bit (>>, <<) et affectation (=).
Les choses que vous ne pouvez pas utiliser incluent (mais ne sont pas limitées à)
- Addition, soustraction, multiplication et division
- Boucles
- Expressions conditionnelles
- Appels de fonction
Les utilisations les moins nombreuses des opérations binaires ou de négation binaire et de décalage de bits l'emportent . En cas d'égalité, la solution la plus populaire l'emporte. Comme toujours, les failles standard s'appliquent.
Voici un exemple d'un simple additionneur 2 bits. Il utilise 77 négations binaires, 28 or binaires et 2 décalages binaires pour un score total de 107 (cela peut être vu en exécutant le préprocesseur C avec gcc -E
). Il pourrait être rendu beaucoup plus efficace en supprimant les #define
s et en simplifiant les expressions résultantes, mais je les ai laissées pour plus de clarté.
#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));
}
}
}
}
Mise à jour: ajout d'un exemple et modification des critères de notation