Si observa la secuencia de recuento binaria, observe que los códigos vecinos difieren en varios últimos bits (sin agujeros), por lo que si los compara, aparece un patrón de varios trazos de 1. Además, cuando cambia los números a la derecha, xors también se desplazará a la derecha: (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
Los resultados originales Xor y los resultados desplazados difieren en un solo bit (los marqué por el punto anterior). Esto significa que si los supera, obtendrá un patrón con 1 bit configurado. Así,
(A xor B) xor (A>>1 xor B>>1) == (A xor A>>1) xor (B xor B>>1) == gray (A) xor gray (B)
Como xor nos da 1s en diferentes trozos, se demuestra, qué códigos vecinos sólo se diferencian en un solo bit, y eso es principal característica de código Gray queremos conseguir.
Por lo tanto, para que quede demostrado, se puede probar que N puede restaurarse desde su valor N^(N >> 1): conociendo un bit de código podemos restaurar n-1'th bit usando xor.
A_[bit n-1] = A_[bit n] xor gray(A)_[bit n-1]
Comenzando por el bit más grande (se xored con 0) por lo tanto, podemos restaurar el número entero.
Me pregunto si n-- realmente se necesita aquí. n^(n >> 1) está intacto cuando los códigos cuentan desde 0. – Vovanium
sí, los códigos se cuentan desde 1, de lo contrario (n-1) en la fórmula habría sido n. IMO, "1st gray code" tiene más sentido para mí que "0th gray code". – sud03r