Como es que convierto de decimal a binario?

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

5 Comments

  1. en ruby simplemente es una sola línea:

    “%b” % num

    eso te devuelve el binario de num.

    Simple.

    saludos!

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

Submit a comment