1

Convertidor de sistema decimal a sistema binario en Python

Hola, en este tutorial haremos un programa en Python que convierta de sistema decimal (el que usamos a diario para contar) a sistema binario (el que usan nuestros computadores)

Si no sabes como contar en binario puedes leerlo aqui o buscar en cualquier lugar.

Ahora vamos al codigo 😃

import math

defdecimal_to_binary(number):passif __name__ == '__main__':
	print(decimal_to_binary(13))

Importamos la libreria nativa de python llamada math la cual nos serviara para ultilizar la funcion math.log2(x) la cual nos va a retornar el logaritmo en base 2 de un numero x, ya veremos para que queremos esto.

import math

defdecimal_to_binary(number):if number == 0:
		return'0'
	
	residue = 0while ((math.log2(number)*10)%10) != 0:
		number -= 1
		residue += 1
	
	binary = ['0'for i in range(int(math.log(number)) + 1)]
	binary[0] = '1'if __name__ == '__main__':
	print(decimal_to_binary(13))

Ahora nuesto codigo va cogiendo forma, usamos el logaritmo en base 2 porque necesitamos encontrar un numero al cual podamos elevar a 2 para obtener un numero deseado (en este caso el parametro number). Usamos "(math.log2(number) * 10) % 10) debido a que necestiamos que la potencia a la que elevaremos nuestro 2 sea un numero entero, como
math.log2 siempre retorna floats (8.0 en lugar de 8) usamos esa pequeña operacion para ver si estamos ante un entero

(8.0 x 10 = 80; 80 % 10 = 0 (es divisble por 10 entonces es un entero); (3.4 x 10 = 34; 34 % 10 != 0 (no es divisble por 10 entonces es un flotante)))

enotnces, si el log base 2 de nuestro numero no es entero le iremos restando hasta que encontremos un numero que si nos de entero al calcular su log2, a medida que vamos restando de number, agregamos lo que restamos a residue, la cual guardara el numero que nos falta por convertir. Una vez encontramos un numero que al calcular su log2 da entero creamos una lista cuya longitud sea dicho numero + 1 y la llenamos de ceros, exepto su primer numero el cual si sera uno porque si vamos a usar esa potencia de 2.

import math

defdecimal_to_binary(number):if number == 0:
		return'0'
	
	residue = 0while ((math.log2(number)*10)%10) != 0:
		number -= 1
		residue += 1
	
	binary = ['0'for i in range(int(math.log(number)) + 1)]
	binary[0] = '1'while residue > 0:
		subresidue = 0while ((math.log2(residue)*10)%10) != 0:
			residue -= 1
			subresidue += 1

		binary[(int(math.log2(residue)) + 1) * -1] = '1'if subresidue > 0:
			residue = subresidue
		elif subresidue == 0:
			breakreturn''.join(binary)

if __name__ == '__main__':
	print(decimal_to_binary(13))

Si recuerdas a medida que restabamos numeros los guardamos en residue, ahora falta convertir residue a binario y para eso es nuestro segundo while loop donde hacemos basicamente lo mismo, restamos numeros de residue y los guardamos en subresidue hasta que logremos que math.log2(residue) sea entero y asi saber cual sera la proxima potencia de 2 que usaremos. Una vez encontremos dicho numero llenamos la casilla de dicha potencia con 1, para eso es

binary[(int(math.log2(residue)) + 1) * -1] = '1'

por ejemplo si el residuo que nos queda es 8, log2(8) = 3. Necesitamos 1 en la casilla de la potencia 2**3, por ende usamos negative indexes, le sumamos 1 a log2(8) y eso lo multiplicamos por -1, nos da como resultado -4 que es el index de nuestra lista donde va esa potencia de dos, lo marcamos con 1.

Despues necesitamos ver si hay “subresiduo” es decir si nos aun nos quedan numeros por convertir, si es asi ahora residue es igual a lo que habia en subresidue (esto se hace para que el while continue su loop), si por el contrario no hay subresiduo eso quiere decir que terminamos nuestro trabajo, usamos break para salir del bucle y ya podemos “fusionar” todos los elementos de nuestra lista en un solo string con el metodo join para retornarlo y poder verlo 😃

Ejemplo:
le pasamos a nuestra funcion el numero 7 como parametro,
nuestra funcion hace el siguiente recorrido
log2(7) no es entero, resta 1 a number y suma 1 a residue
log2(6) no es entero, repite el proceso anterior otra vez
log2(5) no es entero
log2(4) si es entero y es 2
hasta ahora residue = 3 (restamos “1” 3 veces)

creamos una lista de 3 (log2(4) + 1) elementos llena de 0, pero seteamos nuestro primer valor como 1
binary = [1, 0, 0] (estas vienen siendo las casillas de las potencias 2** 2, 2** 1, 2**0 respectivamente)

ahora entramos en el segundo while porque residue > 0
log2(3) no es entero, restamos 1 a residue y sumamos 1 a subresidue
log2(2) si es entero, es 1

(log2(2) + 1) * -1 es -2, esa es la casilla que necesitaremos marcar con 1

como subresidue es 1 entonces ahora el loop se repite pero en este caso residue es igual a 1 (se cumple la segunda condicion del if statement). Hacemos el mismo proceso de antes y marcamos la casilla que necesitamos con 1, en este caso es la casilla -1 ((log2(1) + 1) * -1) = -1

ahora binary es [1, 1, 1] y nuestro subresidue es 0 por lo tanto termino la conversion, usamos join y retornamos ‘111’ (el numero 7 en binario)

Espero te haya gustado el tutorial 😃

Escribe tu comentario
+ 2