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.
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
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
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
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'
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
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.
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.
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.
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.
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.