Conversión de bases -- binario, decimal, hexadecimal

En esta lección dominarás los métodos de conversión entre las tres bases y comprenderás por qué el hexadecimal es la «mejor abreviatura» del binario.


Analogía cotidiana: múltiples sistemas de numeración

Las diferentes bases son como diferentes «unidades de medida».

Los humanos estamos acostumbrados al decimal, como a medir la estatura en «metros».

Las computadoras usan binario, como si pensaran en «estados de interruptor».

El hexadecimal, en cambio, es la «abreviatura» de los ingenieros: expresa el largo binario de forma más corta.

Por ejemplo, si expresamos la palabra «EJEMPLO» en los tres «idiomas»:

  • Lenguaje humano decimal:82 85 78 79 79 66
  • Lenguaje máquina binario:01010010 01010101 01001110 01001111 01001111 01000010
  • Abreviatura hexadecimal:52 55 4E 4F 4F 42

Para la misma frase, la longitud de la representación binaria es 4 veces la hexadecimal.

Esta es la razón por la que necesitamos aprender la conversión de bases.


La esencia de las bases: expansión por pesos

El principio de todas las bases es exactamente el mismo:Cada dígito en una posición se multiplica por la potencia de la base, y luego se suman todos.。

Tomemos el número 42 como ejemplo y veamos cómo se interpreta en las tres bases:

SistemaBaseDígitos disponiblesRepresentaciónExpansión por pesos
Decimal100 ~ 9424 x 101 + 2 x 100 = 42
Binario20, 11010101x25+0x24+1x23+0x22+1x21+0x20 = 42
Hexadecimal160~9, A~F2A2 x 161 + 10 x 160 = 42

Regla clave:La «base» del sistema numérico determina el peso de cada posición.。

Base decimal 10, peso de las unidades 10^00=1, decenas 10^11=10, centenas 10^22=100.

Base binaria 2, de derecha a izquierda los pesos son 1, 2, 4, 8, 16, 32, 64, 128.

Base hexadecimal 16, de derecha a izquierda los pesos son 1, 16, 256, 4096.

Una vez que entiendes la «expansión por pesos», todas las conversiones de bases se vuelven simples. Solo hay que recordar una frase: cada dígito x base^número de posición, y luego sumar.


Método 1: convertir de decimal a binario (división sucesiva entre 2)

Supón que quieres convertir el decimal 42 a binario.

El método es muy mecánico:

  1. Divide 42 entre 2, cociente 21, resto0
  2. Divide 21 entre 2, cociente 10, resto1
  3. Divide 10 entre 2, cociente 5, resto0
  4. Divide 5 entre 2, cociente 2, resto1
  5. Divide 2 entre 2, cociente 1, resto0
  6. Divide 1 entre 2, cociente 0, resto1
  7. Lee los restos de abajo hacia arriba:101010
42 ÷ 2 = 21resto0← (bit menos significativo)
21 ÷ 2 = 10resto1
10 ÷ 2 = 5resto0
5 ÷ 2 = 2resto1
2 ÷ 2 = 1resto0
1 ÷ 2 = 0resto1← (bit más significativo)
Resultado: leyendo los restos de abajo hacia arriba =101010

¿Por qué funciona este método?

La esencia del binario es: N = d0x20 + d1x21 + d2x22 + ...

Al dividir N entre 2, el resto es d0(el bit menos significativo), y el cociente se sigue dividiendo entre 2 para obtener la siguiente cifra.

Esta lógica es exactamente igual a la «división entre 10 para obtener las unidades» que aprendiste en la escuela primaria.


Método 2: convertir de binario a decimal (expansión por pesos)

Convertir de binario a decimal es más simple: solo suma según los pesos.

Binario101010(posiciones numeradas de 0 a 5 de derecha a izquierda):

Posición543210
Dígito binario101010
Peso (2^n)32168421
Dígito x peso1x320x161x80x41x20x1

1x32 + 0x16 + 1x8 + 0x4 + 1x2 + 0x1 = 42


Hexadecimal: la «abreviatura» del binario

El mayor problema del binario es quees demasiado largo de escribir。

Un valor de 8 bits requiere escribir 8 dígitos, y uno de 32 bits, 32 dígitos.

Esto no es fácil de leer para los humanos y además es propenso a errores.

El hexadecimal resuelve este problema gracias a una importante coincidencia matemática:

242^4 = 16 → cada 4 bits binarios corresponden exactamente a 1 dígito hexadecimal.

Tabla de correspondencia entre 4 bits binarios y 1 dígito hexadecimal

Binario (4 bits)DecimalHexadecimalBinario (4 bits)DecimalHexadecimal
000000100088
000111100199
001022101010A
001133101111B
010044110012C
010155110113D
011066111014E
011177111115F

Esta tabla es el núcleo del hexadecimal.

Una vez memorizada, cualquier conversión de binario a hexadecimal es una operación mecánica de «consultar la tabla y tomar el carácter».

Ejemplo: convertir el binario 11111111 a hexadecimal

Los 8 bits binarios se dividen en dos grupos de 4 bits cada uno:

1111 = F    1111 = F→ Resultado:0xFF

En programación,0xel prefijo 0x indica hexadecimal (por ejemplo,0xFF),0bel prefijo 0b indica binario (por ejemplo,0b11111111). Estos prefijos le dicen al compilador que este no es un número decimal.


Demostración interactiva: conversor sincronizado de tres columnas

El siguiente conversor te permite observar en tiempo real la correspondencia entre las tres bases.

Introduce un valor en cualquiera de las columnasy las otras dos columnas se actualizarán automáticamente de forma sincronizada.

Presta atención al resaltado de color debajo de la columna binaria: muestrala correspondencia de cada grupo de 4 bits con 1 dígito hexadecimalla relación.

Decimal

Base=10, dígitos=0~9

Binario

Base=2, dígitos=0,1

Hexadecimal

Base=16, dígitos=0~F

Pruébalo: ingresa 255 en la columna decimal y observa el todo 1 en la columna binaria y FF en la columna hexadecimal.

Este es el «valor máximo de un byte»: si lo entiendes, muchos conceptos se aclaran.


Demostración de código: conversión completa de bases

Ejemplo

# Herramienta completa de conversión de bases (demostración de ejemplo)

def decimal_to_binary(n):
    """Convertir de decimal a binario: método de división entre 2 y resto, mostrando todos los pasos"""
    if n == 0:
        return "0"
    steps = []
    original = n
    while n > 0:
        remainder = n % 2
        quotient = n // 2
        steps.append((n, quotient, remainder))
        n = quotient

    result = ''.join(str(r) for _, _, r in reversed(steps))
    print(f"{original} convertido a binario:")
    for val, quot, rem in steps:
        print(f" {val:3d} ÷ 2 = {quot:3d} resto {rem}")
    print(f" → Resultado: {result}")
    return result

def binary_to_decimal(bin_str):
    """Convertir de binario a decimal: método de expansión por pesos"""
    decimal = 0
    length = len(bin_str)
    print(f"Expansión por pesos del binario {bin_str}:")
    for i, ch in enumerate(bin_str):
        power = length - 1 - i
        if ch == '1':
            value = 2 ** power
            decimal += value
            print(f" Posición {power}: 1 x 2^{power} = {value}")
    print(f" → Suma total: {decimal}")
    return decimal

def bin_to_hex(bin_str):
    """Convertir de binario a hexadecimal: agrupar de 4 en 4 bits y consultar la tabla"""
    while len(bin_str) % 4 != 0:
        bin_str = '0' + bin_str
    hex_map = {
        '0000':'0','0001':'1','0010':'2','0011':'3',
        '0100':'4','0101':'5','0110':'6','0111':'7',
        '1000':'8','1001':'9','1010':'A','1011':'B',
        '1100':'C','1101':'D','1110':'E','1111':'F'
    }
    result = ''
    groups = []
    for i in range(0, len(bin_str), 4):
        group = bin_str[i:i+4]
        hex_char = hex_map[group]
        groups.append(f"{group} → {hex_char}")
        result += hex_char
    print(f"Binario {bin_str} a hexadecimal:")
    for g in groups:
        print(f"  {g}")
    print(f"  → 0x{result}")
    return result

def hex_to_bin(hex_str):
    """Convertir de hexadecimal a binario: expandir cada dígito a 4 bits"""
    rev_map = {
        '0':'0000','1':'0001','2':'0010','3':'0011',
        '4':'0100','5':'0101','6':'0110','7':'0111',
        '8':'1000','9':'1001','A':'1010','B':'1011',
        'C':'1100','D':'1101','E':'1110','F':'1111'
    }
    hex_str = hex_str.upper()
    result = ''
    for ch in hex_str:
        expanded = rev_map[ch]
        result += expanded
        print(f"  {ch} → {expanded}")
    # Eliminar los ceros a la izquierda (pero conservar al menos un dígito)
    result = result.lstrip('0') or '0'
    print(f"  → {result}")
    return result

# Prueba integral: centrada en el código ASCII 82 del carácter 'R' de EJEMPLO
print("=" * 50)
print("Valor de prueba: 82 (ASCII 'R' de EJEMPLO)")
print("=" * 50)
bin_result = decimal_to_binary(82)
print(f"82 → Binario: {bin_result}\n")

dec_result = binary_to_decimal(bin_result)
print()

hex_result = bin_to_hex(bin_result)
print()

print("Verificación inversa: hexadecimal → binario")
hex_to_bin(hex_result)

print("\n" + "=" * 50)
print("Valor de prueba: 255 (el valor máximo de un byte)")
print("=" * 50)
bin_255 = decimal_to_binary(255)
print(f"Binario: {bin_255}")
hex_255 = bin_to_hex(bin_255)
print(f"Hexadecimal: 0x{hex_255}")
print("Nota: el binario de 255 es 8 bits todos en 1, y el hexadecimal solo usa 2 dígitos: FF")

Avanzado: conversión rápida de hexadecimal a decimal

Ya conoces dos métodos para convertir a decimal: uno es la expansión por pesos (cada dígito hexadecimal x potencia de 16), y el otro es convertir primero a binario y luego a decimal.

Pero hay un método más práctico:usar el binario como «lenguaje intermedio»。

Cualquier conversión entre bases puede usar el binario como puente:

Decimal ←→ Binario ←→ Hexadecimal

Porque la conversión directa entre decimal y hexadecimal requiere más cálculo, mientras que la conversión de cada uno con binario es muy simple.

Decimal a binario: división entre 2 y tomar el resto.

Hexadecimal a binario: consultar la tabla y expandir (cada dígito se convierte en 4 bits).

Otras extensiones