Если вы посмотрите на двоичную последовательность подсчета, вы заметите, что соседние коды отличаются на несколько последних битов (без дырок), поэтому, если вы их зафиксируете, вы увидите паттерн из нескольких конечных единиц.Кроме того, когда вы сдвигаете числа вправо, xors также будет сдвигаться вправо: (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
Исходные результаты Xor и сдвинутые результатыотличаются одним битом (я пометил их точкой выше).Это означает, что если вы их xor, вы получите шаблон с установленным 1 битом.Итак,
(A xor B) xor (A>>1 xor B>>1) == (A xor A>>1) xor (B xor B>>1) == gray (A) xor gray (B)
Поскольку xor дает нам 1 с разными битами, это доказывает, что соседние коды отличаются только одним битом, и это основное свойство кода Грея, которое мы хотим получить.
Таким образом, для полноты следует доказать, что N можно восстановить из его значения N ^ (N >> 1): зная n-й бит кода, мы можем восстановить n-1-й бит, используя xor.
A_[bit n-1] = A_[bit n] xor gray(A)_[bit n-1]
Начиная с самого большого бита (он обозначен 0), поэтому мы можем восстановить целое число.