bitlvl
ES

Código Gray, BCD y popcount

Escribe un número en decimal, hex o binario. Obtienes su código Gray (y la inversa), su empaquetado BCD, el número de bits activos y la paridad, con las fórmulas usadas.

Anchura

Secuencia del código Gray

Los resultados y mensajes de esta herramienta se muestran en inglés.

Código Gray

En binario normal, al contar de 7 (0111) a 8 (1000) cambian cuatro bits a la vez. Si esos bits los lee un codificador mecánico o los muestrea un reloj mientras cambian, puede aparecer cualquier mezcla de bits viejos y nuevos, y un 1111 (15) momentáneo es un error grande. El código Gray (binario reflejado) ordena los números de modo que valores consecutivos difieren exactamente en un bit. Lo usan los codificadores rotatorios, los mapas de Karnaugh, algunos ADC y esquemas de corrección de errores.

La conversión es una línea en cada sentido:

gray   = n ^ (n >> 1)
binary = g; while (g >>= 1) binary ^= g;   // XOR con todos los desplazamientos a la derecha

BCD

El decimal codificado en binario guarda cada dígito decimal en su propio nibble de 4 bits: 1234 se convierte en 0001 0010 0011 0100, que como número hex es 0x1234. Desperdicia algo de espacio (los nibbles A–F nunca se usan) pero hace triviales la visualización decimal y la aritmética decimal exacta, por eso lo usan relojes, calculadoras, el COBOL financiero y el chip de reloj de tiempo real de cada PC. Leer un byte BCD como binario puro da un sinsentido, y ese es el error habitual.

Popcount y paridad

El peso de Hamming (popcount) es el número de bits a 1. Es una sola instrucción en las CPU modernas (POPCNT) y la base de la distancia de Hamming, la cardinalidad de bitsets y algunos trucos de hashing. La paridad es popcount mod 2; un bit de paridad es el código detector de errores más simple y atrapa cualquier bit volteado.

// Truco de Kernighan: cada paso borra el bit activo más bajo
int count = 0; while (n) { n &= n - 1; count++; }

Preguntas

¿Por qué los codificadores rotatorios usan código Gray?

Entre dos posiciones adyacentes solo cambia un contacto, así que una lectura a mitad de transición es siempre uno de los dos valores vecinos, nunca uno disparatado. Los codificadores binarios pueden mostrar cualquier valor durante una transición de varios bits.

¿El código Gray es único?

El binario reflejado es el estándar, pero cualquier ordenación en la que los vecinos difieren en un bit es «un» código Gray. Existen códigos Gray balanceados y n-arios para casos especiales.

¿Cómo convierto BCD a binario en código?

Toma cada nibble como dígito: value = value*10 + nibble, desde el nibble más significativo hacia abajo. O, para bytes de dos dígitos, ((b >> 4) * 10) + (b & 0x0F). Muchos chips RTC necesitan exactamente eso.

¿Cuál es la forma más rápida de contar bits?

La función integrada: __builtin_popcount (C), bits.OnesCount (Go), int.bit_count() (Python 3.10+), u32::count_ones (Rust). Se compilan a una sola instrucción donde está disponible.