Python: Un programa para la conversión de decimal a binario

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.

29 opiniones en “Python: Un programa para la conversión de decimal a binario”

  1. 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.

    1. 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

  2. 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.

      1. 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,

        1. 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.

  3. 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…

      1. 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

        1. 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

  4. 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)

  5. 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

    1. 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:

      def decimalizar(binario):
      
          decimal = 0
          numero_de_bits = len(str(binario))
      
          for n in range(numero_de_bits):
              decimal = decimal + int(str(binario)[-(n+1)]) * 2 ** n
              //Ojo si wordpress parte la línea
      
          return decimal

      Saludos

  6. 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

    1. 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

  7. 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)

  8. 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

  9. 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]).

  10. 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»)

  11. 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

  12. Hola alguien podria ayudarme en una tarea de convertir un numero decimal a hexadecimal con el siglo while

  13. 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

Deja un comentario

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies