Moui. j'ai un peu regardé rapidement le code. Je ne comprends pas trop pourquoi tu distingues e1 e2 e3 (je pense que ce sont les bits de Hamming) différents de 0 ou bien tous à 0. Imaginons par exemple que tu aies 0001 0000. Ca donne e1, e2 et e3 à 0 0 0 mais justement ils ne devraient pas l'être. Ils devraient être à 1 0 1 ce qui indique que le bit erroné est le 5° mais avec ta distinction tu ne le corriges pas.
J'ai e1 = a1 xor a3 xor a5 xor a7
e2 = a2 xor a3 xor a6 xor a7
e3 = a4 xor a5 xor a6 xor a7

Je pense que tu parles aussi de ça :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 if(e1 != 0 || e2 !=0 || e3 !=0)
C'est simple, si e1 ou e2 ou e3 (ou les 2 ou les 3 en même temps) sont à 1, il y a erreur quelque part. Donc on corrige.

Dans mon cas, pour 0001 0000 on a e1 = 1 e2 = 1 et e3 = 0.
Utilise des notations hexa quand tu fais des opérations de bits (& 0x01 au lieu de & 1). Déjà c'est plus explicite surtout dans la hiérarchie des nombres (0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080, 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000 plus "élégants" visuellement que 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768). Pareil avec 1<<0, 1<<1 et 1<<2. On voit bien l'effort d'unification de la formulation qui amène naturellement 1<<3 si ça devait continuer mais en l'écrivant 0x1, 0x10, 0x0100 ça le fait aussi (et 0x1000 arrive tout aussi naturellement).
Merci pour le conseil, j'y tâcherai désormais