Si vous regardez la séquence de comptage binaire, vous remarquez que les codes voisins diffèrent sur plusieurs bits de fin (sans trous), donc si vous les xor, un motif de plusieurs 1 finaux apparaît. De plus, lorsque vous décalez les nombres vers la droite, les xors seront également décalés vers la droite: (A xor B)>>N == A>>N xor B>>N.
N N>>1 gray
0000 . 0000 . 0000 .
| >xor = 0001 >xor = 0000 >xor = 0001
0001 . 0000 . 0001 .
|| >xor = 0011 | >xor = 0001 >xor = 0010
0010 . 0001 . 0011 .
| >xor = 0001 >xor = 0000 >xor = 0001
0011 . 0001 . 0010 .
||| >xor = 0111 || >xor = 0011 >xor = 0100
0100 0010 0110
Les résultats d'Xor originaux et les résultats décalés diffèrent d'un seul bit (je les ai marqués d'un point ci-dessus). Cela signifie que si vous les xor, vous obtiendrez un motif avec 1 bit défini. Donc,
(A xor B) xor (A>>1 xor B>>1) == (A xor A>>1) xor (B xor B>>1) == gray (A) xor gray (B)
Comme xor nous donne des 1 dans des bits différents, cela prouve que les codes voisins ne diffèrent que d'un seul bit, et c'est la principale propriété du code Gray que nous voulons obtenir.
Pour complétude, il faudrait prouver que N peut être restauré à partir de sa valeur N ^ (N>>1): en connaissant le bit n de code, nous pouvons restaurer le bit n-1 en utilisant xor.
A_[bit n-1] = A_[bit n] xor gray(A)_[bit n-1]
En commençant par le bit le plus grand (il est xoré avec 0) donc nous pouvons restaurer tout le nombre.