El código Gray ordena patrones binarios de modo que dos estados consecutivos difieran en un solo bit. Esta regla resulta valiosa cuando varias señales eléctricas no pueden cambiar exactamente al mismo tiempo. Un contador binario convencional puede modificar varios bits al cruzar ciertos límites; si un sensor toma una muestra durante la transición, puede observar por un instante un valor que nunca fue el objetivo. El código Gray limita la incertidumbre a un único canal cambiante.
Esta guía explica la secuencia binaria reflejada, las conversiones en ambos sentidos y sus aplicaciones en hardware. Se trata de una técnica de representación y ordenación, no de un sustituto de la aritmética binaria habitual.
Diferencia entre código Gray y binario convencional
El binario convencional es un sistema posicional: cada bit tiene un peso que es una potencia de dos. En el código Gray, los patrones se reorganizan deliberadamente para conservar una distancia de Hamming igual a 1 entre vecinos. Los bits identifican un estado, pero no tienen pesos numéricos independientes.
| Índice decimal | Binario | Código Gray | Bits modificados |
|---|---|---|---|
| 0 | 000 | 000 | - |
| 1 | 001 | 001 | 1 |
| 2 | 010 | 011 | 1 |
| 3 | 011 | 010 | 1 |
| 4 | 100 | 110 | 1 |
| 5 | 101 | 111 | 1 |
| 6 | 110 | 101 | 1 |
| 7 | 111 | 100 | 1 |
El salto binario de 011 a 100 cambia los tres bits. La transición equivalente en código Gray, de 010 a 110, cambia únicamente el bit más significativo. Para repasar los pesos en base 2, consulta la guía del sistema binario y la tabla binaria.
Cómo se construye el código Gray reflejado
La variante más usada es el código Gray binario reflejado. Su nombre describe el procedimiento recursivo: se copia la lista existente en orden inverso, se antepone cero a la mitad original y uno a la mitad reflejada.
La lista de un bit es:
0
1Para obtener dos bits:
Original con 0: 00, 01
Reflejo con 1: 11, 10
Secuencia: 00, 01, 11, 10Al repetir el proceso aparecen los ocho estados de tres bits:
000, 001, 011, 010, 110, 111, 101, 100Cada mitad conserva las transiciones de un bit. En la unión, los dos patrones centrales solo difieren en el prefijo añadido. La secuencia reflejada completa también es cíclica: el último estado y el primero están separados por un bit, una propiedad importante en un encoder rotatorio que vuelve de la posición final al origen.
Una secuencia de n bits contiene 2^n patrones únicos. Visita todas las combinaciones posibles, aunque no lo hace en orden numérico binario.
Convertir binario a código Gray
La conversión directa utiliza XOR. El bit más significativo se conserva; cada bit siguiente se obtiene aplicando XOR a dos bits binarios adyacentes:
gray[más significativo] = binario[más significativo]
gray[i] = binario[i + 1] XOR binario[i]La expresión compacta es:
gray = binario XOR (binario desplazado una posición a la derecha)Ejemplo: convertir 1011
| Posición | Operación | Resultado |
|---|---|---|
| Primera | Copiar 1 | 1 |
| Segunda | 1 XOR 0 | 1 |
| Tercera | 0 XOR 1 | 1 |
| Cuarta | 1 XOR 1 | 0 |
El binario 1011 se convierte en código Gray 1110. XOR produce uno cuando sus entradas son diferentes. La guía de puertas lógicas contiene su tabla de verdad y explica cómo se implementa en circuitos digitales.
Convertir código Gray a binario
La conversión inversa usa un XOR acumulado:
- Copia el bit más significativo al resultado binario.
- Aplica XOR entre ese bit binario recuperado y el siguiente bit Gray.
- Usa el nuevo resultado binario en la siguiente operación.
- Continúa hasta el bit menos significativo.
Ejemplo: convertir 1110
| Posición | Operación | Resultado binario |
|---|---|---|
| Primera | Copiar 1 | 1 |
| Segunda | 1 XOR 1 | 0 |
| Tercera | 0 XOR 1 | 1 |
| Cuarta | 1 XOR 0 | 1 |
El patrón recuperado es 1011. Solo entonces conviene usar el conversor de binario a decimal, que devuelve 11. Interpretar 1110 directamente con pesos posicionales daría otro número y constituye uno de los errores más frecuentes.
Por qué los encoders rotatorios usan código Gray
Un encoder absoluto puede tener varias pistas concéntricas sobre un disco. Cada sensor lee una pista y aporta un canal a la palabra de posición. Con marcas binarias comunes, un límite como el de 7 a 8 exigiría cambiar todas las pistas. La alineación mecánica, el polvo, la excentricidad del eje y los umbrales eléctricos impiden que todos los sensores conmuten a la vez.
Con código Gray, sectores angulares vecinos difieren en una sola pista. Cerca del límite, los demás canales permanecen estables y solo un sensor queda indeciso. La lectura será normalmente una de las dos posiciones vecinas en lugar de un estado lejano sin relación. La técnica no elimina el ruido ni sustituye la calibración, pero reduce mucho la ambigüedad de transición.
Los encoders lineales aplican la misma idea a lo largo de una regla. La geometría cambia, pero las regiones físicas adyacentes mantienen la transición de un solo bit.
Otras aplicaciones
Cruce entre dominios de reloj
En hardware digital puede ser necesario transferir un contador entre relojes no relacionados. Si varios bits binarios cambian y el receptor muestrea a mitad del proceso, puede capturar una mezcla de dos estados. Convertir el contador a código Gray antes de sincronizarlo reduce el problema porque solo cambia un bit por incremento. Aun así, hacen falta sincronizadores correctos: la codificación no elimina por sí sola la metaestabilidad.
Mapas de Karnaugh
Las filas y columnas de un mapa de Karnaugh siguen el orden Gray para que celdas vecinas cambien una sola variable booleana. Así, los grupos de celdas contiguas corresponden a términos lógicos simplificados. El orden establece la vecindad y el álgebra booleana aporta las reglas de reducción.
Máquinas de estados y recorridos
Algunas máquinas asignan estados con esta secuencia para reducir la cantidad de biestables que conmutan simultáneamente y limitar transitorios o consumo dinámico. Ciertos algoritmos recorren espacios de combinaciones de la misma forma, de modo que cada candidato modifica una decisión. La utilidad depende del coste real del cambio; no es una optimización universal.
Implementación práctica
Para un entero sin signo b, muchos lenguajes calculan la forma reflejada mediante b ^ (b >> 1). La decodificación propaga el XOR desde el bit más significativo:
codificar(b):
devolver b XOR (b desplazado a la derecha)
decodificar(g):
b = 0
mientras g no sea cero:
b = b XOR g
g = g desplazado a la derecha
devolver bEl formato debe fijar el ancho y conservar ceros iniciales. También debe indicar si emplea el código Gray reflejado estándar u otro código de cambio unitario, ya que la propiedad de un solo bit no determina por sí sola la correspondencia numérica.
Errores frecuentes
- Leer el patrón con pesos binarios: primero se decodifica y después se calcula el valor.
- Aplicar la regla a cualquier pareja: solo los vecinos de la secuencia definida difieren en un bit.
- Olvidar el ancho: eliminar ceros iniciales oculta canales físicos y rompe interfaces fijas.
- Tratarlo como código corrector: no contiene redundancia para localizar y reparar corrupción arbitraria.
- Omitir la sincronización: un contador entre relojes sigue necesitando un diseño de cruce adecuado.
- Confundir orden de bits y orden de bytes: la secuencia no define cómo se almacenan valores multibyte.
Preguntas frecuentes
¿Qué es el código Gray en términos sencillos?
Es una ordenación de patrones de bits donde cada patrón vecino cambia exactamente una posición. Ayuda a representar estados físicos continuos sin que pequeñas diferencias de tiempo produzcan combinaciones de muchos bits.
¿Por qué se llama código Gray reflejado?
Porque para ampliar la secuencia se refleja la lista anterior y se añaden prefijos distintos a la mitad original y a la invertida. El procedimiento puede repetirse para cualquier ancho.
¿Es un sistema de numeración binario?
Usa símbolos binarios, pero sus posiciones no conservan pesos de potencias de dos. Es una asignación ordenada de estados. Para operar aritméticamente, se convierte primero a binario convencional.
¿Puede detectar o corregir errores?
No de forma general. Puede revelar saltos imposibles en un sistema de movimiento restringido, pero no añade bits redundantes de corrección. Para ese objetivo se emplean técnicas como el código Hamming.
¿Cuántos estados representa con n bits?
Representa 2^n estados, igual que el binario común. Cuatro bits ofrecen 16 estados y diez bits ofrecen 1024.
¿La secuencia siempre cierra el ciclo con un solo cambio?
La secuencia reflejada completa sí. Un subconjunto o una asignación personalizada puede perder esa propiedad, por lo que deben comprobarse sus extremos reales.
Resumen
El código Gray reorganiza los patrones binarios para que cada paso cambie un bit. La construcción reflejada crece de forma recursiva, la conversión directa usa XOR adyacente y la inversa usa XOR acumulado. Encoders, contadores entre dominios de reloj, mapas de Karnaugh y algunas máquinas de estados aprovechan esta propiedad. Conviene usar la codificación en los límites de representación y volver al binario convencional para cálculos y comparaciones.
