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 KBDid this help you? Tip $1 Tip $2 Tip $5
January 23rd, 2007 at 3:55 am
en ruby simplemente es una sola lÃnea:
“%b” % num
eso te devuelve el binario de num.
Simple.
saludos!
January 23rd, 2007 at 10:57 am
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.
January 23rd, 2007 at 10:47 pm
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
September 14th, 2011 at 3:06 pm
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
September 14th, 2011 at 3:10 pm
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