Tracks
/
Python
Python
/
Temario
/
Binario, octal y hexadecimal
Bi

Binario, octal y hexadecimal en Python

{one: "1 ejercicio", many: "%{count} ejercicios", other: "%{count} ejercicios"}

Acerca de Binario, octal y hexadecimal

El binario, el octal y el hexadecimal (también conocido como hex) son distintos sistemas de numeración con bases distintas. El binario es base 2, el octal es base 8 y el hexadecimal es base 16. Los enteros normales son base 10 en Python. El binario, el octal y el hexadecimal son representaciones de números enteros. Eso significa que representan números positivos y negativos (incluido el cero) sin fracciones ni decimales, y admiten todas las operaciones que podemos hacer con números enteros.

Binario

El binario es un sistema de numeración de base 2 que usa únicamente los dígitos 0 y 1. Normalmente representa los estados 0 («apagado») y 1 («encendido») del flujo eléctrico a través de transistores e interruptores en los ordenadores, así como las cargas positivas y negativas de los medios de almacenamiento magnético. El binario puede representar todos los números enteros que se usan en base 10.

Un fragmento del sistema de base 2 tiene este aspecto, aunque continúa infinitamente y no se detiene en 128:

128 64 32 16 8 4 2 1
2 ** 7 2 ** 6 2 ** 5 2 ** 4 2 ** 3 2 ** 2 2 ** 1 2 ** 0

Así que, si queremos representar el número 6 en binario, sería 110.

Valor posicional 4 2 1
Número binario 1 1 0

Y la operación sería: 4 + 2 + 0 = 6

Otro ejemplo: 19

Valor posicional 16 8 4 2 1
Número binario 1 0 0 1 1

El número binario sería: 10011 Y la operación sería: 16 + 0 + 0 + 2 + 1 = 19

El binario en Python

En Python, podemos representar literales binarios con el prefijo 0b. Si escribimos 0b10011, Python lo interpretará como un número binario y lo convertirá a base 10.

>>> 0b10011
19

>>> type(0b10011)
<class 'int'>

El binario en Python no es más que otra forma de escribir un número entero, así que la representación binaria es un número entero para todas las operaciones matemáticas.

Si escribes un número con el prefijo 0b que no esté en el sistema binario, se lanzará un SyntaxError.

Traceback (most recent call last):
  File "c:\binary.py", line 1, in <module>
    0b10211
SyntaxError: invalid digit '2' in binary literal

Operaciones con números binarios

Como los números binarios son enteros, podemos realizar con ellos todas las operaciones que hacemos con los enteros.

# addition
>>> 0b10011 + 0b10011
38

# multiplication
>>> 0b10011 * 0b10011
361

También podemos realizar operaciones entre representaciones binarias y entre representaciones enteras. Sin embargo, se aplican las reglas habituales de los operadores matemáticos: dividir dos números binarios o dos números enteros devolverá un float, aunque la división no dé como resultado una parte decimal.

>>> 0b10011 + 19
38

>>> 0b10011/0b10011
1.0

>>> 0b10011/3
6.333333333333333

Conversión desde y hacia la representación binaria

Python convertirá automáticamente un literal binario en int. Para convertir un int en una representación binaria, usa la función integrada [bin()][bin]. bin() devolverá un str con el equivalente binario y el prefijo 0b .

>>> bin(19)
'0b10011'

Para convertir un literal binario en un número entero, podemos usar la función integrada int() y pasarle un string con la representación binaria y un argumento de base:

>>> int("0b10011", 2)
19

Si se da la base incorrecta (o una representación binaria no válida), se lanzará un ValueError:

Traceback (most recent call last):
  File "c:\binary.py", line 4, in <module>
    int("0b10011", 3)
ValueError: invalid literal for int() with base 3: '0b10011'

Métodos del binario

También hay algunos métodos especiales que podemos usar con los números binarios.

<int>.bit_length() devolverá el número de bits que se necesitan para representar el número:

>>> 0b11011.bit_length()
5

<int>.bit_count() devolverá el número de unos que hay en el número binario. Por ejemplo, bit_count() sobre «0b11011» devolverá 4:

>>> 0b11011.bit_count()
4
Note

Si trabajas en local, bit_count() requiere al menos Python 3.10. El editor en línea de Exercism admite actualmente todas las funcionalidades hasta Python 3.11.

Octal

El octal es un sistema de numeración de base 8. Usa los dígitos 0, 1, 2, 3, 4, 5, 6 y 7.

En Python, podemos representar números octales con el prefijo 0o. Al igual que con el binario, Python convierte automáticamente una representación octal en un int.

>>> 0o123
83

Al igual que con el binario, los números octales son enteros y admiten todas las operaciones con enteros. Poner el prefijo 0o a un número que no esté en el sistema octal lanzará un SyntaxError.

Conversión desde y hacia la representación octal

Para convertir un int en una representación octal, puedes usar la función integrada [oct()][oct]. Actúa de forma similar a la función bin() y devuelve un string:

>>> oct(83)
'0o123'

Para convertir un número octal en un número entero, podemos usar la función int(), pasándole un string con la representación octal y la base (8) como argumentos:

>>> int("0o123", 8)
83

Al igual que con el binario, si se da la base incorrecta se lanzará un ValueError.

Hexadecimal

El hexadecimal es un sistema de numeración de base 16. Usa los dígitos del 0 al 9 y las letras A, B, C, D, E y F. A es 10, B es 11, C es 12, D es 13, E es 14 y F es 15.

Podemos representar números hexadecimales en Python con el prefijo 0x. Al igual que con el binario y el octal, Python convertirá automáticamente los literales hexadecimales en int.

>>> 0x123
291

Igual que con el binario y el octal, los literales hexadecimales son enteros, y puedes realizar con ellos todas las operaciones con enteros. Poner el prefijo 0x a un número que no sea hexadecimal lanzará un SyntaxError.

Conversión desde y hacia la representación hexadecimal

Para convertir un int en una representación hexadecimal, puedes usar la función integrada [hex()][hex]. Actúa de forma similar a la función bin() y devuelve un string:

>>> hex(291)
'0x123'

Para convertir una representación hexadecimal en un número entero, podemos usar la función int(), pasándole un string hexadecimal junto con la base (16) como argumentos:

>>> int("0x123", 16)
291

Al igual que con el binario y el octal, si se da la base incorrecta se lanzará un ValueError.

Editar en GitHub El enlace se abre en una nueva ventana o pestaña