Calculadora de Bases Numericas en Python
"En el mundo de la tecnología y la informática, trabajar con números es una tarea diaria. Sin embargo, a veces es necesario convertir entre diferentes sistemas numéricos para realizar tareas específicas o para interactuar con otros sistemas. Es aquí donde entra en juego el conversor de bases numéricas.
Las bases numéricas son sistemas de representación de números que se basan en una secuencia de dígitos y un conjunto de símbolos. Algunas de las bases numéricas más comunes son el sistema decimal (base 10), el sistema binario (base 2), el sistema octal (base 8) y el sistema hexadecimal (base 16). Cada una de estas bases tiene sus propias aplicaciones y usos específicos.
El conversor de bases numéricas es una herramienta que permite convertir números de un sistema numérico a otro, lo que hace posible la interacción entre diferentes sistemas y plataformas. Esta herramienta es esencial para cualquier persona que trabaje en el campo de la tecnología o la informática, ya que permite realizar tareas más eficientemente y evita errores humanos al convertir manualmente números de un sistema a otro.
Este post de programación en Python presenta un conversor de bases numéricas que puede convertir números entre binario, octal, decimal y hexadecimal. El programa combina conversiones previas como binario a decimal, octal a decimal y hexadecimal a decimal para lograr conversiones entre cualquier base. El conversor se ahorra el programar varias funciones al usar la base decimal como intermediaria. Además, se incluyen pruebas unitarias y un ejemplo de uso.
Funciones de conversión
Todas las conversiones de números las tenemos en un archivo que vamos a importar en el archivo principal:
# Función que regresa el verdadero valor hexadecimal.
# Por ejemplo, si recibe un 15 devuelve f, y si recibe un número menor a 10, devuelve el número sin modificarlo
def obtener_caracter_hexadecimal(valor):
# Lo necesitamos como cadena
valor = str(valor)
equivalencias = {
"10": "a",
"11": "b",
"12": "c",
"13": "d",
"14": "e",
"15": "f",
}
if valor in equivalencias:
return equivalencias[valor]
else:
return valor
def decimal_a_hexadecimal(decimal):
hexadecimal = ""
while decimal > 0:
residuo = decimal % 16
verdadero_caracter = obtener_caracter_hexadecimal(residuo)
hexadecimal = verdadero_caracter + hexadecimal
decimal = int(decimal / 16)
return hexadecimal
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:
# 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)
elevado = 16 ** posicion
equivalencia = elevado * valor
decimal += equivalencia
posicion += 1
return decimal
def decimal_a_octal(decimal):
octal = ""
while decimal > 0:
residuo = decimal % 8
octal = str(residuo) + octal
decimal = int(decimal / 8)
return octal
def octal_a_decimal(octal):
decimal = 0
posicion = 0
# Invertir octal, porque debemos recorrerlo de derecha a izquierda
# pero for in empieza de izquierda a derecha
octal = octal[::-1]
for digito in octal:
valor_entero = int(digito)
numero_elevado = int(8 ** posicion)
equivalencia = int(numero_elevado * valor_entero)
decimal += equivalencia
posicion += 1
return decimal
def decimal_a_binario(decimal):
if decimal <= 0:
return "0"
# Aquí almacenamos el resultado
binario = ""
# Mientras se pueda dividir...
while decimal > 0:
# Saber si es 1 o 0
residuo = int(decimal % 2)
# E ir dividiendo el decimal
decimal = int(decimal / 2)
# Ir agregando el número (1 o 0) a la izquierda del resultado
binario = str(residuo) + binario
return binario
def binario_a_decimal(binario):
posicion = 0
decimal = 0
# Invertir la cadena porque debemos recorrerla de derecha a izquierda
# https://parzibyte.me/blog/2019/06/26/invertir-cadena-python/
binario = binario[::-1]
for digito in binario:
# Elevar 2 a la posición actual
multiplicador = 2**posicion
decimal += int(digito) * multiplicador
posicion += 1
return decimal
El programa principal del conversor en Python consiste en solicitar al usuario los siguientes datos: desde qué base convertir, cuál número convertir y a qué base convertirlo. Luego, la función devuelve estos tres datos como una tupla si son válidos.
def solicitar_datos_a_usuario():
bases_soportadas = ["2", "8", "10", "16", ]
base_origen = input("""
2 - Binario
8 - Octal
10 - Decimal
16 - Hexadecimal
Elige la base desde donde conviertes: [2, 8, 10, 16]: """)
if base_origen not in bases_soportadas:
print("La base que ingresaste no está soportada")
return
numero = input(
f"Ok, vas a convertir desde la base {base_origen}. Ingresa el número a convertir: ")
base_destino = input("""
2 - Binario
8 - Octal
10 - Decimal
16 - Hexadecimal
Elige la base a la que conviertes: [2, 8, 10, 16]: """)
if base_destino not in bases_soportadas:
print("La base de destino no está soportada")
return
return (base_origen, numero, base_destino)
Ahora veamos la función que va a convertir el número a decimal, pues recuerda que todos los números serán convertidos a decimal, y desde decimal, a otras bases. Esto con el fin de ahorrarnos funciones. Entonces la función queda así:
def obtener_numero_decimal(base_origen, numero):
if base_origen == "2":
return conversiones.binario_a_decimal(numero)
elif base_origen == "8":
return conversiones.octal_a_decimal(numero)
elif base_origen == "10":
return int(numero)
elif base_origen == "16":
return conversiones.hexadecimal_a_decimal(numero)
view raw
obtener_numero_decimal.py hosted with ❤ by GitHub
Finalmente veamos la función que hace la conversión de acuerdo a la base:
def convertir(numero, base_destino):
if base_destino == "2":
return conversiones.decimal_a_binario(numero)
elif base_destino == "8":
return conversiones.decimal_a_octal(numero)
elif base_destino == "10":
return int(numero)
elif base_destino == "16":
return conversiones.decimal_a_hexadecimal(numero)
view raw
convertir.py hosted with ❤ by GitHub
Esta función va a devolver la conversión a la base numérica que el usuario haya elegido.
Poniendo todo junto
Así que el programa principal queda de la siguiente manera:
import conversiones
# Si todo va bien, regresa una tupla con la base de origen, el número a convertir y la base de destino
def solicitar_datos_a_usuario():
bases_soportadas = ["2", "8", "10", "16", ]
base_origen = input("""
2 - Binario
8 - Octal
10 - Decimal
16 - Hexadecimal
Elige la base desde donde conviertes: [2, 8, 10, 16]: """)
if base_origen not in bases_soportadas:
print("La base que ingresaste no está soportada")
return
numero = input(
f"Ok, vas a convertir desde la base {base_origen}. Ingresa el número a convertir: ")
base_destino = input("""
2 - Binario
8 - Octal
10 - Decimal
16 - Hexadecimal
Elige la base a la que conviertes: [2, 8, 10, 16]: """)
if base_destino not in bases_soportadas:
print("La base de destino no está soportada")
return
return (base_origen, numero, base_destino)
def obtener_numero_decimal(base_origen, numero):
if base_origen == "2":
return conversiones.binario_a_decimal(numero)
elif base_origen == "8":
return conversiones.octal_a_decimal(numero)
elif base_origen == "10":
return int(numero)
elif base_origen == "16":
return conversiones.hexadecimal_a_decimal(numero)
def convertir(numero, base_destino):
if base_destino == "2":
return conversiones.decimal_a_binario(numero)
elif base_destino == "8":
return conversiones.decimal_a_octal(numero)
elif base_destino == "10":
return int(numero)
elif base_destino == "16":
return conversiones.decimal_a_hexadecimal(numero)
if __name__ == '__main__':
datos = solicitar_datos_a_usuario()
# Comprobamos si los datos son correctos
if datos:
base_origen, numero, base_destino = datos
# Para ahorrarnos código, vamos a convertir el número a decimal (sin importar la base de origen) y luego ese número
# lo convertimos a la base de destino
numero_decimal = obtener_numero_decimal(base_origen, numero)
# Y a ese decimal lo convertimos a la base deseada
resultado = convertir(numero_decimal, base_destino)
print(resultado)
Recuerda que necesitas el archivo de conversiones que ya vimos anteriormente. En mi caso lo he probado con los siguientes tests unitarios:
import conversiones
import conversor
import unittest
class TestConversiones(unittest.TestCase):
def test_binario_decimal(self):
esperado = 7
actual = conversiones.binario_a_decimal("111")
self.assertEqual(actual, esperado)
def test_decimal_binario(self):
esperado = "111"
actual = conversiones.decimal_a_binario(7)
self.assertEqual(actual, esperado)
def test_octal_decimal(self):
esperado = 123
actual = conversiones.octal_a_decimal("173")
self.assertEqual(actual, esperado)
def test_decimal_octal(self):
esperado = "173"
actual = conversiones.decimal_a_octal(123)
self.assertEqual(actual, esperado)
def test_hexadecimal_decimal(self):
esperado = 255
actual = conversiones.hexadecimal_a_decimal("ff")
self.assertEqual(actual, esperado)
def test_decimal_hexadecimal(self):
esperado = "ff"
actual = conversiones.decimal_a_hexadecimal(255)
self.assertEqual(actual, esperado)
def test_obtener_numero_decimal(self):
valores = [
{
"base": "2",
"numero": "111",
"esperado": 7,
},
{
"base": "8",
"numero": "173",
"esperado": 123,
},
{
"base": "16",
"numero": "f",
"esperado": 15,
},
]
for valor in valores:
esperado = valor["esperado"]
actual = conversor.obtener_numero_decimal(
valor["base"], valor["numero"])
self.assertEqual(actual, esperado)
if __name__ == "__main__":
unittest.main()
Recuerda que debes guardar los archivos en la misma carpeta. e instalar pip unittest.
Conversor de bases numéricas (binario, octal, decimal y hexadecimal) en Python
Funciona perfectamente. En este caso ejemplifiqué las conversiones con datos solicitados por teclado, aunque bien podrías ponerlo en una API, agregar una interfaz gráfica con tkinter o Qt, etcétera.
Estoy disponible para trabajar en tu proyecto o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.
Si el post fue de tu agrado muestra tu apoyo compartiéndolo, suscribiéndote al blog, siguiéndome.
En resumen, el conversor de bases numéricas es una herramienta valiosa para cualquiera que trabaje con números en el mundo de la tecnología y la informática. Además, el conocimiento de las diferentes bases numéricas y sus usos específicos es esencial para entender cómo funciona el conversor y cómo puede ser utilizado en diferentes situaciones. Si estás interesado en aprender más sobre este tema, ¡no dudes en explorar más recursos y comenzar a practicar hoy mismo!"
.png)
No hay comentarios.:
Publicar un comentario