Objetivo: crear una función en Python para la conversión de decimal a binario y, por extensión, a cualquier otra base.
Convertir a binario un número decimal es algo que no supone ningún misterio en Python:
>>> bin(81)
'0b1010001'
Incluso el proceso inverso, de binario a decimal, es simple:
>>> int('1010001', 2)
81
Pero la gracia, cuando uno aprende a programar, está en tratar de desarrollar el sexto sentido algorítmico, una faceta a menudo descuidada.
De modo que en el artículo de hoy diseñaremos nuestra propia función encargada de convertir un número decimal a binario, que después extenderemos para expresarlo en cualquier otra base.
Con frecuencia, descubrir el algoritmo subyacente implica realizar la tarea a mano prestando mucha atención a nuestros procesos mentales, convertirlos en palabras y transformarlos después en instrucciones propias del lenguaje de programación.
El ejemplo que nos atañe es sencillo, pues existe una correspondencia prácticamente directa entre nuestro proceso mental y el desarrollo formal, pero no siempre la hay y, en esos casos, es preciso atomizar lo que está pasando por nuestra cabeza.
En la escuela nos enseñan (o, al menos, enseñaban) el procedimiento para convertir a binario un número entero positivo en base decimal:
Dividimos el número entre dos y anotamos el resto de la división. Tomamos el cociente y lo dividimos entre dos, anotando el nuevo resto. Cogemos el nuevo cociente y continuamos la misma operación hasta que no podemos seguir adelante, pues el cociente ya es inferior a dos (uno, en las conversiones a binario). Tomamos entonces ese cociente (uno) y le agregamos, en orden inverso de aparición, todos los restos que hemos ido anotando en el camino.
Vamos a convertir, por ejemplo, 81 a binario:
81 : 2 = 40; Resto: 1
40 : 2 = 20; Resto: 0
20 : 2 = 10; Resto: 0
10 : 2 = 5; Resto: 0
5 : 2 = 2; Resto: 1
2 : 2 = 1; Resto: 0
Ya no podemos seguir dividiendo entre dos, pues el cociente es uno. Tomamos este cociente, junto a todos los restos en orden inverso y encontramos 81 expresado en binario:
1010001
Nuestro algoritmo va a hacer exactamente lo mismo.
def binarizar(decimal):
binario = ''
while decimal // 2 != 0:
binario = str(decimal % 2) + binario
decimal = decimal // 2
return str(decimal) + binario
La variable binario es un string que va acumulando cada resto. Observa su construcción, agregando a la izquierda cada nuevo resto.
La variable decimal parte con el número original, pero en cada iteración toma el valor del nuevo cociente resultado de la división entera. El bucle se repetirá continuamente mientras ese cociente sea distinto de cero. En ese momento, el anterior cociente (un uno), será el dígito más significativo del resultado, devuelto con la sentencia return.
Veamos en acción esta función:
def binarizar(decimal):
binario = ''
while decimal // 2 != 0:
binario = str(decimal % 2) + binario
decimal = decimal // 2
return str(decimal) + binario
numero = int(input('Introduce el número a convertir a binario: '))
print(binarizar(numero))
>>>
Introduce el número a convertir a binario: 81
1010001
Para convertir a cualquier otra base el procedimiento es exactamente el mismo, salvo que en lugar de realizar la división entera entre dos la hacemos en la nueva base.
def cambio_base(decimal, base):
conversion = ''
while decimal // base != 0:
conversion = str(decimal % base) + conversion
decimal = decimal // base
return str(decimal) + conversion
numero = int(input('Introduce el número a cambiar de base: '))
base = int(input('Introduce la base: '))
print(cambio_base(numero, base))
>>>
Introduce el número a cambiar de base: 81
Introduce la base: 5
311
Y ahora una conversión a octal:
>>>
Introduce el número a cambiar de base: 81
Introduce la base: 8
121
Para hacer pruebas, evita utilizar bases superiores a 10, pues no disponemos de dígitos suficientes para mostrar el resultado. O bien puedes modificar el programa y crearte tus propios dígitos empleando letras del abecedario, como en el sistema hexadecimal.
Ejercicio propuesto 1: crea una función que convierta un número decimal a base 16 (hexadecimal). Necesitarás una especie de tabla que transforme los resultados del resto 10, 11, 12,…, 15 en A, B, C, …, F, respectivamente.
Ejercicio propuesto 2: crea una función que transforme de binario a decimal.
Ejercicio propuesto 3: crea una función que convierta a decimal un número expresado en cualquier otra base.
Javier Montero Gabarró
http://elclubdelautodidacta.es/wp/2013/01/python-un-programa-para-la-conversion-de-decimal-a-binario/
El texto de este artículo se encuentra sometido a una licencia Creative Commons del tipo CC-BY-NC-ND (reconocimiento, no comercial, sin obra derivada, 3.0 unported)
El Club del Autodidacta
Consulta el índice completo de artículos relacionados con Python.
def cambio_hexa(decimal):
conversion = »
while decimal // 16 != 0:
resto = str(decimal % 16)
if int(resto) > 9:
lista = (‘A’,’B’,’C’,’D’,’E’,’F’)
resto = lista[int(resto)-10]
conversion = resto + conversion
decimal = decimal // 16
return str(decimal) + conversion
numero = int(input(‘Introduce el número a cambiar a hexadecimal: ‘))
print(cambio_hexa(numero))
Mi solución al ejercicio 1.
Hace poco descubrí tu blog y, en concreto este tutorial de Python y lo estoy disfrutando mucho. Soy novato en la programación y deseo aprender un poco.
Saludos y gracias.
Vicente, en efecto, programar se aprende programando, lanzándote a resolver cuantos problemas se crucen en tu camino, por simples que pudieran parecer, pues estos te permiten tratarlos de manera individual, de modo que gradualmente vas haciendo crecer tu colección de «usos idiomáticos».
Haz que esta sea tu práctica habitual.
Yendo al problema en cuestión, puedo intentar intuir la indentación de cada bloque, que se pierde al presentar el código en html. Pero, tal como la imagino, ¿has probado a chequear valores decimales entre 10 y 15?
Saludos
def cambio_hexa(decimal):
….conversion = »
….lista = (‘A’,’B’,’C’,’D’,’E’,’F’)
….if decimal > 9 and decimal 9:
…………….resto = lista[int(resto)-10]
…………conversion = resto + conversion
…………decimal = decimal // 16
……..return str(decimal) + conversion
numero = int(input(‘Introduce el número a cambiar a hexadecimal: ‘))
print(cambio_hexa(numero))
Hola Javier, tenías razón! Había un error en el rango del 10 al 15 que no detecté en su momento. Creo que ahora lo he solucionado y espero que esté hecho de una forma suficientmente elegante.
Te agradecería referencias, recursos, etc sobre Python para ir ampliando conocimientos.
Saludos y muchas gracias por tu tiempo.
Amigo me da un error en la parte que dice: if decimal > 9 and decimal 9:
def cambio_hexa(decimal):
conversion = »
lista = (‘A’,’B’,’C’,’D’,’E’,’F’)
if decimal > 9 and decimal 9:
resto = lista[int(resto)-10]
conversion = resto + conversion
decimal = decimal // 16
return str(decimal) + conversion
Este el código correcto. El anterior se copió mal. Espero haberte ayudado. Saludos,
No hay manera Sergio. Lo tengo todo correcto en pantalla y cuando lo envío se estropea…el código de arriba sigue apareciendo mal.
def cambio_hexa(decimal):
conversion = »
lista = (‘A’,’B’,’C’,’D’,’E’,’F’)
if decimal > 9 and decimal 9:
resto = lista[int(resto)-10]
conversion = resto + conversion
decimal = decimal // 16
return str(decimal) + conversion
numero = int(input(‘Introduce el número a cambiar a hexadecimal: ‘))
print(cambio_hexa(numero))
Lo cuelgo de nuevo porque veo que se han perdido líneas…
No hay forma… Dame alguna indicación de cómo hacerlo sin que se pierdan líneas. Gracias.
Estos editores HTML…
Vamos a hacer lo siguiente: mándamelo por correo electrónico y lo cuelgo por ti.
Saludos
Me gustaria saber si realmente te lo puedo enviar por correo ya que tengo real interes en como ejecuto de forma correcta el ejercicio, aun asi tengo la duda de como se podria realizar el ejercicio con cadenas y no mediante listas. Gracias
Claro! Puedes enviarme tu código en un correo electrónico, pero, a la vez, escríbelo también en el blog. Así, lo que allí comentemos puede ser útil también para otros lectores.
Saludos
Amigos como hago para hacer esto:
Cambios de Base entre base X y base Y. (donde X y Y son variables).
◦ Tomar en cuenta que la solución pueda recibir entradas de números racionales (enteros y
fraccionarios)
Buenos días, Sergio:
Lo primero, asegúrate de entender perfectamente cómo se hace a mano. 😉
Saludos
Estimado blogger, en tu primera linea donde dices que la función nos transformará un entero a binario, no es correcta. Por favor lanza >>>type(bin(81)) , verás que te aparece
y no que si es el tipo binario. Lo que se obtiene es la representacion binaria en un str, al fin y al cabo un str. GRACIAS
Qué tal, Juan:
De eso se trata, precisamente, de calcular matemáticamente el valor binario correspondiente. El programa no pretende hacer otra cosa.
Saludos
Cómo sería el ejercicio propuesto 2?, el de transformar de binario a decimal?
Recorremos el número binario, previamente convertido a string, de derecha a izquierda (para eso uso índices negativos, partiendo de -1). Tomo el valor obtenido y lo multiplico por el peso correspondiente, que es dos elevado a cero, dos elevado a uno, etcétera. Recorro todo el string acumulando el valor:
Saludos
Programa dos funciones, una que permita convertir unidades en m² a Barns, y su inversa
el primero si el 2 nada ayuda
pd: buen aporte
Ambos programas son idénticos, lo único que cambia es el factor de conversión:
Si 1 m2 es igual a 10 elevado a 28 b, a la inversa,
1b es igual a 10 elevado a menos 28 m2
Saludos
Buenas tardes. Estuve la mañana de hoy desarrollando un programa para convertir de decimal a Dinario. Una vez terminado digo» Hora ver que tal esté en google» y me doy cuenta que era mucho mas fácil de lo que pensaba. Acontinuación aqui les comparto mi código: https://repl.it/FYrB/2
def decimalToBinario(numero):
binario = bin(numero) # RESUMEN
print ( binario)
decimales= []
#print (numero)
while numero > 1:
#print(«Dividiendo»)
binarios = str(numero).split(«.»)
if (int(binarios[0])%2) == 0:
decimales.append(0)
#print (» agregado 0″)
if (int(binarios[0])%2) == 1:
decimales.append(1)
#print (» agregado 1″)
numero = numero/2
decimales.reverse()
print (decimales)
decimalToBinario(1998)
Me alegro de que Google te haya traído hasta aquí… 🙂
Gracias por pasarte y saludos.
El ejercicio 1, pasar de decimal a Hexa como se realiza con cadenas? :0
hola buenas noches me intereso mucho el código que hace la conversión de decimal a hexadecimal pero como a muchos he tratado de correlo pero no me funciona me podrias ayudar #Vicente Bataller
Hola como convierto un número. Octal a decimal ? Ayuda por fa
hola que tal , vieras que estoy haciendo un problema , me piden esto , un programa que elimine de una lista todos los elementos de valor par y
muestre por pantalla el resultado (Ejemplo: si trabaja con la lista [1, -2, 1, -5, 0, 3],
esta pasaría a ser [1, 1, -5, 3]).
def lista(lista):
lista1=[1,2,5,8,12]
print(len(lista1))
lista1.pop(1)
lista1.pop(3)
lista1.pop(4)
print(«la nueva lista es:»,lista)
# menu principal
lista(«lista»)
Hola chicos
Me ayudarian con una tarea que me piden lo siguiente.
2) Defina una función que dado un numero decimal entregue este transformado al sistema binario. Es decir, esta función debe de aceptar sólo un parámetro, un número decimal y debe retornar y mostrar por pantalla este mismo número transformado a decimal.
EJ: print(decBin(321325))
Salida : 1001110011100101101
Hola alguien podria ayudarme en una tarea de convertir un numero decimal a hexadecimal con el siglo while
Para este ejercicio quisiera saber como se puede introducir un rango de 0-255 que solo pueda convertir de decimal a binario en ese rango usando este codigo
def binarizar(decimal):
binario = »
while decimal // 2 != 0:
binario = str(decimal % 2) + binario
decimal = decimal // 2
return str(decimal) + binario
Esque ya intente y no me sale me sigue sobrepasando convierte cualquier numero y no dentro del rango establecido