Código Gray
El código Gray es un sistema de numeración binario donde dos valores sucesivos difieren en un solo bit.
Denotemos por la representación del número usando el código Gray. La secuencia de códigos Gray para números de 3 bits es: 000, 001, 011, 010, 110, 111, 101, 100, así que . Por ejemplo, y difieren en exactamente un bit, el bit más a la izquierda. De forma similar, y difieren en exactamente un bit, el más a la derecha. Esto vale para todos los números sucesivos.
Este código lo inventó Frank Gray en 1953.
Encontrar el código Gray
Miremos los bits del número y los bits del número . Nótese que el -ésimo bit de vale 1 solo cuando el -ésimo bit de vale 1 y el bit vale 0, o al revés (el -ésimo bit vale 0 y el bit vale 1). Así, :
int g (int n) {
return n ^ (n >> 1);
}Encontrar el código Gray inverso
Dado el código Gray , restaurar el número original .
Nos moveremos de los bits más significativos a los menos significativos (el bit menos significativo tiene índice 1 y el más significativo tiene índice ). La relación entre los bits del número y los bits del número :
La forma más fácil de escribirlo en código es:
int rev_g (int g) {
int n = 0;
for (; g; g >>= 1)
n ^= g;
return n;
}Aplicaciones prácticas
Los códigos Gray tienen algunas aplicaciones útiles, a veces bastante inesperadas:
-
El código Gray de bits forma un ciclo hamiltoniano en un hipercubo, donde cada bit corresponde a una dimensión.
-
Los códigos Gray se usan para minimizar los errores en la conversión de señales digital-analógica (por ejemplo, en sensores).
-
El código Gray se puede usar para resolver el problema de las Torres de Hanoi. Sea la cantidad de discos. Empezar con el código Gray de longitud que consiste de todos ceros () y moverse entre códigos Gray consecutivos (de a ). Sea el -ésimo bit del código Gray actual el que representa el -ésimo disco (el bit menos significativo corresponde al disco más chico y el más significativo al disco más grande). Como exactamente un bit cambia en cada paso, podemos tratar el cambio del -ésimo bit como mover el -ésimo disco. Nótese que hay exactamente una opción de movimiento para cada disco (excepto el más chico) en cada paso (excepto las posiciones de inicio y fin). Siempre hay dos opciones de movimiento para el disco más chico, pero hay una estrategia que siempre lleva a la respuesta: si es impar, la secuencia de movimientos del disco más chico se ve como donde es la varilla inicial, es la varilla terminal y es la varilla restante, y si es par: .
-
Los códigos Gray también se usan en la teoría de algoritmos genéticos.