Cómo Convertir un Número Binario en Decimal en Python

Cómo convertir de binario a decimal en Python

En diversos casos necesitamos pasar un número que se encuentra en formato binario a decimal. Dicho de otra manera, convertir un número en base 2 a base 10. ¿Cómo podemos lograr esto en Python?

Una forma sencilla de convertir binario en decimal en Python es multiplicar cada dígito del número binario por 2 elevado a la posición del dígito teniendo en cuenta que las posiciones, de derecha a izquierda, son 0, 1, 2, etc. Finalmente se suma el resultado de todas las multiplicaciones.

Pero antes de seguir leyendo… mejor ve al siguiente artículo si lo que quieres hacer es convertir decimal en binario en Python.

En la siguiente imagen te lo aclaro mejor:

Cómo convertir de binario a decimal
Cómo convertir de binario a decimal

Si te paras a pensarlo, realmente esa es la manera universal de convertir un número binario a decimal. Es decir, matemáticamente se puede resolver así. Esto se puede trasladar a cualquier lenguaje de programación. Pero como este blog va de Python, hagámoslo en Python.

Paso 1: Determinar el formato del número binario

Los números enteros o de tipo int en Python se representan en decimal (base 10) que es la manera más natural que tenemos los seres humanos de manejar los números.

De esta forma, si una variable tiene el valor 101, su valor se interpreta exactamente como 101 (en decimal) y no como el número binario 101 que en decimal es 5.

Es por esto que lo normal es que si tomamos un número binario de algún sitio su formato sea de tipo string, es decir, '101'.

Así que vamos a suponer que cualquier número binario que nos llegue estará en formato string. Ahora bien, si no fuese así y lo que tenemos es un número de tipo int que solo tiene ceros y unos y queremos interpretarlo como si fuera un número binario, previamente lo convertiremos a un string y ya podremos trabajar con él de manera más cómoda.

Para convertir un valor numérico a un string podemos usar la función str de la siguiente manera valor_string = str(valor_numerico). Veamos un ejemplo:

valor_numerico = 1010110 #un número que queremos interpretar como si fuera binario

valor_string = str(valor_numerico)
print(valor_string)

El resultado por pantalla será el siguiente, donde, como puedes comprobar, el tipo de la variable es un string como denotan las comillas:

'1010110'

Paso 2: Recorrer los dígitos del número binario

A continuación necesitamos operar con cada uno de los dígitos del número binario. Para ello haremos uso de un bucle que nos permita recorrerlos todos.

Además precisamos convertir cada uno de esos dígitos a un número, ya que son de tipo string, para poder operar con ellos más adelante. Basta con utilizar la función int para ello.

Con un bucle for podemos hacer esto de manera sencilla:

numero_binario = '1010110'

for digito_string in numero_binario:
	digito = int(digito_string)
	print(digito)

Lo que nos dará el siguiente resultado por pantalla:

1
0
1
0
1
1
0

Paso 3: calcular la posición de cada dígito

Para poder multiplicar cada dígito por 2 elevado a su posición, como te decía al comienzo de este artículo, necesitamos calcular la posición de cada uno de ellos.

Hay que tener en cuenta que la posición del dígito binario de la derecha del todo es la posición menos significativa, y por tanto es la posición 0. El dígito de su izquierda está en la posición 1. A su izquierda, posición 2, y así sucesivamente.

Con esto sabemos que la posición del primero de los dígitos por la izquierda es la longitud del número menos 1. Es decir, si tenemos un número de 7 dígitos, la posición del dígito de la izquierda será 6.

Utilizaremos la función len para calcular la posición del primer dígito por la izquierda. Así que en cada vuelta del bucle, solo necesitamos ir restando uno de manera sucesiva para tener todas las demás posiciones.

numero_binario = '1010110'

posicion = len(numero_binario) - 1 #posición del primer dígito por la izquierda

for digito_string in numero_binario:
	digito = int(digito_string)
	print(f'Dígito: {digito}, posición: {posicion}')
	posicion -= 1 # restamos 1 a la posición

El resultado será el siguiente:

Dígito: 1, posición: 6
Dígito: 0, posición: 5
Dígito: 1, posición: 4
Dígito: 0, posición: 3
Dígito: 1, posición: 2
Dígito: 1, posición: 1
Dígito: 0, posición: 0

De todas maneras, esto de ir recorriendo el número al revés puede resultar un poco contraintuitivo. Aunque podría hacerse así sin ningún problema, si variamos la manera de recorrer el número en el bucle y lo hacemos de derecha a izquierda, contando las posiciones desde cero tendremos algo un poco más natural.

Una solución elegante podría ser invertir el número para poder recorrerlo cómodamente. Además, podemos utilizar la función enumerate que nos va devolviendo cada uno de los valores junto con un contador. Precisamente, este valor de contador será la posición del dígito en el número binario original. Te hablo un poco más de la función enumerate en este artículo sobre cómo recorrer dos listas simultáneamente en Python.

Utilizaremos la notación de porciones para darle la vuelta al número binario de la siguiente manera: numero_binario[::-1]. El código nos queda de la siguiente manera:

numero_binario = '1010110'

for posicion, digito_string in enumerate(numero_binario[::-1]):
	digito = int(digito_string)
	print(f'Dígito: {digito}, posición: {posicion}')

El código anterior genera el siguiente resultado, donde puedes ver que ahora los dígitos se recorrer de derecha a izquierda:

Dígito: 0, posición: 0
Dígito: 1, posición: 1
Dígito: 1, posición: 2
Dígito: 0, posición: 3
Dígito: 1, posición: 4
Dígito: 0, posición: 5
Dígito: 1, posición: 6

Paso 4: multiplicar cada dígito por 2 elevado a su posición

Ya tenemos lo más difícil, que es hacer el recorrido conociendo la posición de cada dígito. Ahora nos toca multiplicar cada uno de los dígitos por 2 elevando a su posición. Recuerda que el operador de potencia en Python es **:

numero_binario = '1010110'

for posicion, digito_string in enumerate(numero_binario[::-1]):
	digito = int(digito_string)
	multiplicacion = digito * 2 ** posicion;
	print(f'Dígito: {digito}, posición: {posicion}, multiplicación: {multiplicacion}')

El resultado que vas a obtener al ejecutar este código es el siguiente:

Dígito: 0, posición: 0, multiplicación: 0
Dígito: 1, posición: 1, multiplicación: 2
Dígito: 1, posición: 2, multiplicación: 4
Dígito: 0, posición: 3, multiplicación: 0
Dígito: 1, posición: 4, multiplicación: 16
Dígito: 0, posición: 5, multiplicación: 0
Dígito: 1, posición: 6, multiplicación: 64

Paso 5: sumar el resultado de todas las multiplicaciones

Si te fijas, solo queda ir sumando el valor de las multiplicaciones en una variable. Cuando hayamos terminado de sumar todo, en esa variable tendremos el número decimal que buscamos.

Voy a aprovechar para simplificar un poco el código que ya tenemos para evitar algunas variables intermedias innecesarias. Verás lo compacta que queda la solución:

numero_binario = '1010110'

numero_decimal = 0 #aquí iremos sumando el resultado de cada multiplicación

for posicion, digito_string in enumerate(numero_binario[::-1]):
	numero_decimal += int(digito_string) * 2 ** posicion

print(f'El número decimal que buscamos es {numero_decimal}')

El resultado por pantalla será:

El número decimal que buscamos es 86

Paso 6 (opcional): creamos una función

Si ponemos nuestro código dentro de una función que reciba un número binario por parámetro (formato string) y devuelva un número decimal podremos usarla cuantas veces queramos y cuando la necesitemos:

def binario_a_decimal(numero_binario):
	numero_decimal = 0 

	for posicion, digito_string in enumerate(numero_binario[::-1]):
		numero_decimal += int(digito_string) * 2 ** posicion

	return numero_decimal


#ejemplos de uso

print(binario_a_decimal('101'))
print(binario_a_decimal('100011'))
print(binario_a_decimal('101011100011101'))

El resultado de los ejemplos de uso del código de arriba es el siguiente:

5
35
22301

¡Cuidado! En esta solución no hago ningún tipo de comprobación de que los dígitos solo tomen valores 0 o 1. Si le vas a pedir el número binario al usuario, revisa este artículo dónde te explico cómo comprobar la entrada del usuario y asegurarse de que sea válida.

Infografía de resumen

Aquí te dejo una infografía con el resumen de todo este proceso para que te quede perfectamente claro.

Infografía sobre cómo convertir un número de binario a decimal

Alternativa

Si lo que quieres no es aprender como hacer la conversión tú por tu cuenta y lo que necesitas es una forma cómoda de que Python haga por ti esa conversión, debes usar la función int.

La función int permite convertir un número contenido en un string, en cualquier base, en un número decimal. Solo tenemos que darle como primer parámetro el número a convertir y, como segundo parámetro, la base en la que se encuentra el número.

De esta manera, si queremos convertir, por ejemplo el número 11101 a decimal haremos lo siguiente:

numero = int('11101', 2) #donde el 2 indica la base en la que se encuentra el número a convertir
print(numero)

Y el resultado por pantalla será 29.

Para más información acerca de la conversión contraria, lee el siguiente artículo sobre cómo pasar de decimal a binario en Python.

La Hoja de Referencia de Python – ¡Gratis!

La Hoja de Referencia de Python - Código Pitón
Consigue trucos, consejos y actualizaciones y, por supuesto, la Hoja de Referencia de Python gratis.



Antes de suscribirte consulta aquí la Información Básica sobre Protección de Datos. Responsable de los datos: Laura Otero Moreira. Finalidad de la recogida y tratamiento de los datos personales: enviarte boletín informativo de Python y comunicaciones comerciales. Legitimación: tu consentimiento. Destinatarios: no se ceden a terceros. Los datos se almacenan en los servidores de marketing (MailRelay). Derechos: podrás ejercer tus derechos de acceso, rectificación, limitación y supresión de datos en info @ codigopiton.com así como presentar una reclamación ante una autoridad de control. Más información en nuestra política de privacidad, encontrarás información adicional sobre la recopilación y el uso de tu información personal, incluida información sobre acceso, conservación, rectificación, eliminación, seguridad y otros temas.