
Sistemas de numeración y operaciones de bits — Guía completa
Aprende conversiones, máscaras, complemento a dos, rangos de enteros y operaciones con registros mediante ejemplos de sistemas embebidos.
Reproduce los ejemplos con el conversor de bases numéricas. Binario, decimal, hexadecimal y octal representan el mismo entero con distintos dígitos. El binario describe estados lógicos y registros, el hexadecimal resume bytes y direcciones, el decimal facilita las medidas y el octal agrupa bits de tres en tres, por ejemplo en máscaras de permisos.
1. Bases y notación posicional
La base 2 utiliza 0–1; la base 8, 0–7; la base 10, 0–9; y la base 16, 0–9 y A–F, donde A = 10 y F = 15. Para dígitos dᵢ en base b: N = Σ dᵢ × bⁱ, empezando por i = 0 a la derecha. Los ceros iniciales no cambian el valor, aunque pueden indicar el ancho de un registro.
| DEC | BIN | HEX | OCT |
|---|---|---|---|
| 0 | 0000 | 0 | 0 |
| 1 | 0001 | 1 | 1 |
| 2 | 0010 | 2 | 2 |
| 3 | 0011 | 3 | 3 |
| 4 | 0100 | 4 | 4 |
| 5 | 0101 | 5 | 5 |
| 6 | 0110 | 6 | 6 |
| 7 | 0111 | 7 | 7 |
| 8 | 1000 | 8 | 10 |
| 9 | 1001 | 9 | 11 |
| 10 | 1010 | A | 12 |
| 11 | 1011 | B | 13 |
| 12 | 1100 | C | 14 |
| 13 | 1101 | D | 15 |
| 14 | 1110 | E | 16 |
| 15 | 1111 | F | 17 |
2. Conversión paso a paso
Binario a decimal: 10101010₂ = 1×128 + 0×64 + 1×32 + 0×16 + 1×8 + 0×4 + 1×2 + 0×1 = 170₁₀. Suma los pesos de las posiciones con uno.
Decimal a binario: divide repetidamente entre 2 y anota los restos. Para 13: 13 = 2×6+1; 6 = 2×3+0; 3 = 2×1+1; 1 = 2×0+1. Leyéndolos de abajo arriba se obtiene 1101. Asimismo, 255₁₀ = 11111111₂ = FF₁₆ = 377₈.
Binario a hexadecimal: agrupa de cuatro en cuatro desde la derecha y completa solo el extremo izquierdo: 1010 1011 1100 1101₂ = ABCD₁₆. Cada grupo equivale a un dígito porque 16 = 2⁴.
Hexadecimal a binario: sustituye cada dígito por cuatro bits: 0x2F → 0010 1111₂ → 47₁₀. Las mayúsculas y minúsculas son equivalentes.
Octal: agrupa de tres en tres porque 8 = 2³: 11111111₂ → 011 111 111₂ = 377₈. En sentido inverso, 17₈ → 001 111₂ = 15₁₀. Por posiciones: 377₈ = 3×8² + 7×8 + 7 = 255. Para pasar de decimal a octal, divide sucesivamente entre 8.
3. Aritmética y enteros exactos
Ejemplos: 0x0F + 0b1 = 16, 20 − 7 = 13, 0o7 × 0x3 = 21. En binario, se acarrea cuando una columna suma dos: 0111 + 0001 = 1000.
La herramienta mantiene los enteros como BigInt, incluso por encima de 2⁵³ − 1. La división entera trunca hacia cero: −7 ÷ 3 = −2. % devuelve un resto con el signo del dividendo, no un módulo euclídeo siempre no negativo: −7 % 3 = −1. Para b distinto de cero, a = (a / b) × b + (a % b). Dividir o calcular el resto entre cero produce un error.
4. AND, OR, XOR y NOT
AND conserva los bits activos en ambas entradas; OR activa los presentes en cualquiera; XOR activa los que difieren; NOT invierte todos los bits dentro del ancho elegido. Cada columna se procesa de forma independiente.
| A | B | A AND B | A OR B | A XOR B | NOT A |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
En ocho bits: 11111111 & 00001111 = 00001111 (15); 10100000 | 00001111 = 10101111 (175); 10101010 ^ 11111111 = 01010101 (85). NOT de 00001111 sin signo da 11110000 (240). Auto no tiene máscara finita: ~15 = −16, ya que ~x = −x − 1.
5. Enteros con signo y complemento a dos
Sin signo, el valor es Σ bᵢ2ⁱ y el rango 0 … 2ʷ−1. En complemento a dos, el bit más significativo pesa −2ʷ⁻¹ y el rango es −2ʷ⁻¹ … 2ʷ⁻¹−1. Si ese bit está activo, resta 2ʷ a la interpretación sin signo.
En ocho bits: FF = 255 − 256 = −1; 80 = 128 − 256 = −128. Para codificar −5, invierte 00000101 a 11111010 y suma uno: 11111011 = FB. En dieciséis bits, FFFF es −1. El complemento a dos es una representación binaria que depende del ancho, no otra base.
| Bits | Sin signo | Con signo |
|---|---|---|
| 8 | 0 … 255 | −128 … 127 |
| 16 | 0 … 65535 | −32768 … 32767 |
| 32 | 0 … 4294967295 | −2147483648 … 2147483647 |
| 64 | 0 … 18446744073709551615 | −9223372036854775808 … 9223372036854775807 |
DEC es un valor matemático. Con ancho fijo, BIN/HEX/OCT no negativos son patrones de bits: HEX FF con signo de 8 bits produce DEC −1, mientras que DEC 255 se rechaza. Las entradas negativas deben caber en el rango matemático. Nunca se trunca una entrada silenciosamente. Las salidas no decimales se rellenan con ceros; el primer dígito octal puede contener hasta dos bits superiores sin usar.
Auto no impone ancho ni rango sin signo. Los negativos se muestran mediante signo y magnitud. La vista se limita a los 128 bits menos significativos de la magnitud; las conversiones y copias mantienen el entero completo.
6. Desplazamientos y desbordamiento
Desplazar k bits a la izquierda multiplica por 2ᵏ sin límite de ancho: 0x01 << 4 = 0x10 = 16. Con ancho fijo se aplica la máscara 2ʷ−1. En ocho bits sin signo, 0x80 << 1 tiene resultado exacto 256 y almacenado 0, con aviso. Con signo, 0x40 << 1 se convierte en −128 con aviso, porque 128 no cabe.
El desplazamiento lógico a la derecha inserta ceros: FF >> 1 = 7F = 127 sin signo. El aritmético propaga el signo: FF >> 1 = FF = −1, 80 >> 1 = C0 = −64, con signo de ocho bits. Redondea hacia menos infinito: −3 >> 1 = −2, mientras que −3 / 2 = −1.
B siempre es una cantidad decimal no negativa, de 0 a 65536. Este límite controla el trabajo por cálculo; no limita la precisión de las entradas. No se reduce módulo 32 ni módulo el ancho. Desplazar a la derecha un valor sin signo de ocho bits en 8 posiciones da 0. Se rechaza el desbordamiento aritmético, como 255 + 1 sin signo o −128 / −1 con signo de ocho bits, mostrando el resultado exacto DEC. Auto sigue la semántica BigInt con signo de ancho ilimitado.
7. Registros STM32, máscaras y flags
En STM32F407, el registro GPIO de entrada contiene los estados de los pines. Tras configurar reloj y periférico, una cabecera CMSIS permite este acceso ilustrativo:
uint32_t snapshot = GPIOA->IDR;
uint32_t pin5 = (snapshot >> 5u) & 1u;
uint32_t field = (snapshot >> 4u) & 0x0Fu;
GPIOA->BSRR = 1u << 5u;
Si snapshot vale 0xB0, pin5 es 1 y los bits 7:4 forman 0xB = 11. La escritura BSRR activa el bit de salida 5 sin lectura-modificación-escritura de ODR por software; el modo del pin sigue determinando su comportamiento externo. Consulta el manual del dispositivo sobre reloj, bits reservados y campos que se borran escribiendo uno. Una captura evita lecturas sucesivas posiblemente distintas.
Estas operaciones se aplican a una variable local sin signo:
uint32_t flags = 0u;
uint32_t mask = 1u << 3u;
flags |= mask;
flags &= ~mask;
flags ^= mask;
uint32_t active = (flags & mask) != 0u;
La máscara 0x08 selecciona el bit 3. OR lo activa, AND con el complemento lo borra, XOR lo invierte y la última expresión lo comprueba. La lectura-modificación-escritura no es automáticamente atómica en memoria compartida o registros: utiliza mecanismos documentados o sincronización adecuada.
8. CAN, UART, SPI, ADC y FPGA
Con los bytes 0x12 y 0x34, un campo big endian definido por el protocolo vale (0x12 << 8) | 0x34 = 0x1234 = 4660; little endian da 0x3412 = 13330. Los campos CAN dependen de la especificación del mensaje o DBC. El entramado UART y el orden de bits SPI no definen por sí solos el orden de bytes de un valor multibyte. Consulta UART y SPI.
En un ADC sin signo de 12 bits, 0xABC = 2748 está en el rango 0–4095. Una aproximación de visualización entre extremos con Vref = 3,3 V da 2748 × 3,3 / 4095 ≈ 2,2145 V. No es la ley exacta de cuantificación: el paso ideal es 3,3/4096 V y la transferencia real depende del ADC. Los datos con signo pueden usar complemento a dos o binario desplazado. Verifica alineación y codificación y utiliza la calculadora ADC/DAC.
Declara ancho y signo explícitos en FPGA y microcontroladores. En SystemVerilog, 8'hFF es un patrón sin signo de ocho bits; 8'shFF representa −1 con signo. Los literales sin tamaño y las promociones pueden cambiar resultados. Las reglas de máscara de esta calculadora no reproducen todas las reglas de C/C++ o HDL.
9. Preguntas frecuentes
¿Cómo convierto binario a hexadecimal?
Agrupa los bits desde la derecha de cuatro en cuatro y sustituye cada grupo por 0–F. Por ejemplo, 1111 0000 es F0. Completa con ceros el grupo izquierdo si hace falta.
¿Qué diferencia hay entre enteros con y sin signo?
Sin signo, todos los bits contribuyen a un valor no negativo. En complemento a dos, el bit más significativo tiene peso negativo. FF en ocho bits es 255 sin signo o −1 con signo.
¿Cómo funciona el complemento a dos?
Para un negativo en w bits, suma su valor a 2ʷ. Equivale a invertir los bits de su magnitud positiva y sumar uno dentro del ancho.
¿Qué es una operación XOR bit a bit?
Produce uno donde los bits de entrada difieren. Una máscara XOR invierte las posiciones seleccionadas: AA XOR FF da 55.
¿Cómo extraigo bits de un registro?
Desplaza el campo hacia la derecha y aplica AND con la máscara de su ancho. Para los bits 7:4: (reg >> 4) & 0x0F. Respeta los efectos de lectura del hardware.
¿Por qué FF a veces significa −1?
La interpretación depende del ancho: FF tiene activo el bit de signo en ocho bits; 00FF en dieciséis bits representa +255.