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
en ruby simplemente es una sola lÃnea:
“%b” % num
eso te devuelve el binario de num.
Simple.
saludos!
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.
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
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
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