Como es que convierto de decimal a binario?

January 22nd, 2007 1 minute reading time.


Recuerdo que esto fue uno de los primeros ejercicios de programacion que me pusieron a hacer en Haskell, convertir de decimal a binario. Aqui una simple implementacion propia en python mientras estaba practicando pal google code jam (que la hice por gusto pq python tiene modulos para convertir de cualquier base a otra)

Juguemos a Python golf, y mandenme implementaciones con menos lineas de codigo, excelente ejercicio para los que estan aprendiendo python, como veran, un lenguaje sin pelos en la lengua, todo full sencillo.

def dec2bin(num):
    if num<0:
        return 0

    if num<=1:
        return num

    coef = num/2
    rem = num%2

    result = str(rem)

    while coef > 0:
        rem = coef%2
        coef = coef/2

        result = str(rem) + result

Envien implementaciones mas cortas, no digo que esta sea la mejor o la mas eficiente, pero me salio de lo que me acorde, parece que funciona fino para numeros positivos:

gubatron@aria:~/tmp$ time python badbinary.py
10000000000000 en binario es 1110100011010100101001010001000000000000

real    0m0.017s
user    0m0.012s
sys     0m0.004s

gubatron@aria:~/tmp$ cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 47
model name      : AMD Athlon(tm) 64 Processor 3200+
stepping        : 0
cpu MHz         : 2010.510
cache size      : 512 KB

Please Donate To Bitcoin Address: [[address]]

Donation of [[value]] BTC Received. Thank You.
[[error]]

5 Responses to “Como es que convierto de decimal a binario?”

  1. RomRod Says:

    en ruby simplemente es una sola línea:

    “%b” % num

    eso te devuelve el binario de num.

    Simple.

    saludos!

  2. gubatron Says:

    Lol, en python tambien se hace en una linea…

    Espero que haya sido un comentario sarcastico, la idea es ver como implementarias tu conversion de decimal a binario, no como lo puedes hacer con el lenguaje.

  3. fpalm Says:

    Antes que nada gracias por el incentivo.

    Aunque chistoso, RomRod hace un llamado de atención sobre el propósito y las restricciones sobre el ejercicio. Revisé en la documentación de python y no hay un %b para dar formato binario a un número. Tampoco hay nada similar en la librería estándar. Ahora bien, una tontería así hace mejor a un lenguaje: no.

    Voy con las implementaciones que utilizan fundamentalmente los operadores de “shift” (corrimiento) y “&” .

    def dec2bin(num):

    count = 0 # contamos el número de dígitos
    aux = num

    while aux > 0:
    aux = aux >> 1
    count += 1

    bin = ”
    for y in range(count-1, -1, -1): # para cada posición en orden inverso
    aux = str((num >> y) & 1) # devuelve 1 si es impar, 0 en caso contrario
    bin = bin + aux

    return bin

    Y captando el hecho que podemos verificar cual es el digito hacia adelante pero ir concatenando el resultado hacia atrás, tenemos.

    def dec2bin(num):

    bin = ”

    while num > 0:
    aux = num & 1
    bin = str(aux) + bin
    num >>= 1

    return bin

    Je je, este es el tuyo mi pueblo.

    Aunque estas dos soluciones hacen un poco de trampa porque los operadores “>>” y “&” ya ven la variable como un binario. Debe ser por despiste que no hay métodos directos para obtener el binario correspondiente.

    Algo del tipo:

    num.__bin__()

    Por cierto, la solución correcta es:

    10010001100001001110011100101010000000000000

    Saludos

    F. Palm

  4. Rolando Ismael Says:

    De la siguiente forma se puede convertir cualquier numero ya sea entero o con fraccionario a binario:

    def es_fraccion(numero)
    (numero.to_s).include? ‘.’
    end

    def bin_entero(numero)
    numero = numero.to_i
    return “0″ if numero == 0
    respuesta = “”
    while(numero != 0)
    respuesta += String(numero % 2 )
    numero = numero / 2
    end
    return respuesta;
    end

    def obtener_fraccion(numero)
    if es_fraccion(numero)
    return (“.” + numero.to_s.split(‘.’)[1]).to_f
    else
    return 0
    end
    end

    def bin_fraccion(numero)
    numero = (‘.’ + numero).to_f
    array_auxiliar = []
    respuesta = “”
    while true
    numero = numero * 2
    respuesta += String(numero.to_i)
    if array_auxiliar.include?(numero)
    return respuesta += “nRepresentacion infinita desde la posicion ” + (array_auxiliar.index(numero) + 1).to_s + ” despues de la coma.”
    else
    array_auxiliar << numero
    numero = obtener_fraccion(numero)
    return respuesta if numero == 0
    end
    end
    end

    def dec_a_bin(numero)
    return bin_entero(numero) if !es_fraccion(numero)
    array = numero.to_s.split('.')
    return bin_entero(array[0]) + "," + bin_fraccion(array[1])
    end

    puts dec_a_bin 6.83

    #011,11010100011110101110000
    #Representacion infinita desde la posicion 3 despues de la coma.

    Saludos
    Rolo Ismael

  5. Rolando Ismael Says:

    Existe un error en el metodo “bin_entero(numero)”

    La linea 5 esta con:
    respuesta += String(numero % 2 )
    pero tiene que ser:
    respuesta = String(numero % 2 ) + respuesta

    perdon, es mi mala costrumbre de simplificar todo, en este caso el orden si es MUY importante

    Saludos
    Rolo Ismael

Leave a Reply