Siguiendo con los tutoriales de programación en Python y la conversión de números hoy vamos a ver cómo convertir un número hexadecimal a decimal. Es decir, convertir un número en base 16 como FF
a 255
en base 10.
Para esto vamos a programar la función, y no vamos a usar métodos que el lenguaje ya incorpore. Al final tendremos un código propio que realiza la conversión de hexadecimal a decimal.
Antes de pasar al verdadero código, veamos cómo funciona el algoritmo. Este programa va a trabajar de la misma manera que los otros que convierten entre bases numéricas (octal a decimal, binario a decimal) salvo por una cosa extra, que son las letras de hexadecimal.
Como sabes, hexadecimal maneja 16 caracteres que son los números del 0 al 9 pero además las letras de la A a la F, por lo que tendremos que crear una función que nos devuelva el valor numérico de cada letra (10 para A, 11 para B).
Después de eso, el algoritmo es simple. Invertimos la cadena porque la debemos recorrer de derecha a izquierda, y como los ciclos solo van de izquierda a derecha, la invertimos para que el recorrido sea de derecha a izquierda según la cadena original.
En cada iteración del ciclo vamos a elevar 16 a la posición del carácter en el que vamos, luego tomamos el dígito hexadecimal, obtenemos su valor numérico y lo multiplicamos por el resultado anteriormente obtenido.
Finalmente vamos acumulando este resultado en el valor decimal que vamos a regresar al final del ciclo. Básicamente el programa ejecuta los siguientes pasos para, por ejemplo, el número FF
:
Ingresa un número hexadecimal: FF
Decimal es 0
El verdadero valor de f es 15
Elevamos 16 a la potencia 0, el resultado es 1
Multiplicamos el número elevado por el valor del carácter actual: 15
Ahora decimal es 15
Decimal es 15
El verdadero valor de f es 15
Elevamos 16 a la potencia 1, el resultado es 16
Multiplicamos el número elevado por el valor del carácter actual: 240
Ahora decimal es 255
El hexadecimal FF equivale a 255 en decimal
En caso de que el número sea mayor, se hacen más iteraciones. Ahora que he explicado el funcionamiento y un ejemplo de la ejecución veamos el código.
He escrito dos funciones. La primera devuelve el valor numérico a partir de un carácter hexadecimal, y la segunda es la que realmente hace la conversión. Ambas funciones quedan así:
def obtener_valor_real(caracter_hexadecimal):
equivalencias = {
"f": 15,
"e": 14,
"d": 13,
"c": 12,
"b": 11,
"a": 10,
}
if caracter_hexadecimal in equivalencias:
return equivalencias[caracter_hexadecimal]
else:
return int(caracter_hexadecimal)
def hexadecimal_a_decimal(hexadecimal):
# Convertir a minúsculas para hacer las cosas más simples
hexadecimal = hexadecimal.lower()
# La debemos recorrer del final al principio, así que la invertimos
hexadecimal = hexadecimal[::-1]
decimal = 0
posicion = 0
for digito in hexadecimal:
print(f"Decimal es {decimal}")
# Necesitamos que nos dé un 10 para la A, un 9 para el 9, un 11 para la B, etcétera
valor = obtener_valor_real(digito)
print(f"El verdadero valor de {digito} es {valor}")
elevado = 16 ** posicion
print(
f"Elevamos 16 a la potencia {posicion}, el resultado es {elevado}")
equivalencia = elevado * valor
print(
f"Multiplicamos el número elevado por el valor del carácter actual: {equivalencia}")
decimal += equivalencia
print(f"Ahora decimal es {decimal}")
posicion += 1
return decimal
A continuación te enseñaré el modo de uso.
Puedes invocar a las funciones desde cualquier lugar. Yo haré que se le solicite al usuario un número en base 16 y este programa en Python lo convierta a base 10, es decir, de hexadecimal a decimal. El código completo queda así:
"""
https://parzibyte.me/blog
"""
def obtener_valor_real(caracter_hexadecimal):
equivalencias = {
"f": 15,
"e": 14,
"d": 13,
"c": 12,
"b": 11,
"a": 10,
}
if caracter_hexadecimal in equivalencias:
return equivalencias[caracter_hexadecimal]
else:
return int(caracter_hexadecimal)
def hexadecimal_a_decimal(hexadecimal):
# Convertir a minúsculas para hacer las cosas más simples
hexadecimal = hexadecimal.lower()
# La debemos recorrer del final al principio, así que la invertimos
hexadecimal = hexadecimal[::-1]
decimal = 0
posicion = 0
for digito in hexadecimal:
print(f"Decimal es {decimal}")
# Necesitamos que nos dé un 10 para la A, un 9 para el 9, un 11 para la B, etcétera
valor = obtener_valor_real(digito)
print(f"El verdadero valor de {digito} es {valor}")
elevado = 16 ** posicion
print(
f"Elevamos 16 a la potencia {posicion}, el resultado es {elevado}")
equivalencia = elevado * valor
print(
f"Multiplicamos el número elevado por el valor del carácter actual: {equivalencia}")
decimal += equivalencia
print(f"Ahora decimal es {decimal}")
posicion += 1
return decimal
hexadecimal = input("Ingresa un número hexadecimal: ")
decimal = hexadecimal_a_decimal(hexadecimal)
print(f"El hexadecimal {hexadecimal} equivale a {decimal} en decimal")
Al ejecutarlo, la salida es correcta. He comprobado el resultado con mi otro conversor de bases numéricas:
En caso de que te guste Python, te invito a leer más posts sobre este lenguaje.
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Ayer estaba editando unos archivos que son servidos con el servidor Apache y al visitarlos…
Esta web usa cookies.