O binário, o octal e o hexadecimal (também conhecido como hex) são sistemas de numeração diferentes, com bases diferentes. O binário é base 2, o octal é base 8 e o hexadecimal é base 16. Os números inteiros normais são base 10 em Python. O binário, o octal e o hexadecimal são todos representações de números inteiros. Isto significa que representam números positivos e negativos (incluindo o zero) sem frações nem números decimais, e que suportam todas as operações que podemos fazer com números inteiros.
O binário é um sistema de numeração de base 2, que usa apenas os algarismos 0 e 1. Representa habitualmente os estados 0 («desligado») e 1 («ligado») do fluxo elétrico através dos transístores e dos interruptores nos computadores, bem como as cargas positivas e negativas nos suportes de armazenamento magnético. O binário consegue representar todos os números inteiros que se usam em base 10.
Um fragmento do sistema de base 2 tem este aspeto, embora continue infinitamente e não pare em 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 |
Por isso, se quisermos representar o número 6 em binário, teríamos 110.
| Valor posicional | 4 | 2 | 1 |
|---|---|---|---|
| Número binário | 1 | 1 | 0 |
E a operação seria: 4 + 2 + 0 = 6
Outro exemplo: 19
| Valor posicional | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|
| Número binário | 1 | 0 | 0 | 1 | 1 |
O número binário seria: 10011
E a operação seria: 16 + 0 + 0 + 2 + 1 = 19
Em Python, podemos representar literais binários com o prefixo 0b.
Se escrevermos 0b10011, o Python interpreta-o como um número binário e converte-o para base 10.
>>> 0b10011
19
>>> type(0b10011)
<class 'int'>
O binário em Python é apenas uma forma diferente de escrever um número inteiro, pelo que a representação binária é um número inteiro para todas as operações matemáticas.
Se escreveres um número com o prefixo 0b que não esteja no sistema binário, é lançado um SyntaxError.
Traceback (most recent call last):
File "c:\binary.py", line 1, in <module>
0b10211
SyntaxError: invalid digit '2' in binary literal
Como os números binários são números inteiros, podemos fazer com eles todas as operações que fazemos com números inteiros.
# addition
>>> 0b10011 + 0b10011
38
# multiplication
>>> 0b10011 * 0b10011
361
Também podemos fazer operações entre representações binárias e representações inteiras.
No entanto, aplicam-se as regras habituais dos operadores matemáticos: dividir dois números binários ou dois números inteiros devolve um float, mesmo que a divisão não dê origem a uma parte decimal.
>>> 0b10011 + 19
38
>>> 0b10011/0b10011
1.0
>>> 0b10011/3
6.333333333333333
O Python converte automaticamente um literal binário num int.
Para converter um int numa representação binária, usa a função [bin()][bin] incorporada.
A bin() devolve uma str com o equivalente binário e o prefixo 0b .
>>> bin(19)
'0b10011'
Para converter um literal binário num número inteiro, podemos usar a função int() incorporada, passando uma string com a representação binária e um argumento com a base:
>>> int("0b10011", 2)
19
Se indicares a base errada (ou uma representação binária inválida), é lançado um 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'
Há também alguns métodos especiais que podemos usar com números binários.
<int>.bit_length() devolve o número de bits necessários para representar o número:
>>> 0b11011.bit_length()
5
<int>.bit_count() devolve o número de uns no número binário.
Por exemplo, bit_count() sobre '0b11011' devolve 4:
>>> 0b11011.bit_count()
4
Se estiveres a trabalhar localmente, a bit_count() exige pelo menos o Python 3.10.
O editor online do Exercism suporta atualmente todas as funcionalidades até ao Python 3.11.
O octal é um sistema de numeração de base 8. Usa os algarismos 0, 1, 2, 3, 4, 5, 6 e 7.
Em Python, podemos representar números octais com o prefixo 0o.
Tal como no binário, o Python converte automaticamente uma representação octal num int.
>>> 0o123
83
Tal como no binário, os números octais são ints e suportam todas as operações com números inteiros.
Colocar o prefixo 0o num número que não pertença ao sistema octal lança um SyntaxError.
Para converter um int numa representação octal, podes usar a função [oct()][oct] incorporada.
Funciona de forma semelhante à função bin(), devolvendo uma string:
>>> oct(83)
'0o123'
Para converter um número octal num número inteiro, podemos usar a função int(), passando uma string com a representação octal e a base (8) como argumentos:
>>> int("0o123", 8)
83
Tal como no binário, se indicares a base errada é lançado um ValueError.
O hexadecimal é um sistema de numeração de base 16. Usa os algarismos 0 a 9 e as letras A, B, C, D, E e F. A é 10, B é 11, C é 12, D é 13, E é 14 e F é 15.
Podemos representar números hexadecimais em Python com o prefixo 0x.
Tal como no binário e no octal, o Python converte automaticamente os literais hexadecimais em ints.
>>> 0x123
291
Tal como no binário e no octal, os literais hexadecimais são ints e podes fazer com eles todas as operações com números inteiros.
Colocar o prefixo 0x num número que não seja hexadecimal lança um SyntaxError.
Para converter um int numa representação hexadecimal, podes usar a função [hex()][hex] incorporada.
Funciona de forma semelhante à função bin(), devolvendo uma string:
>>> hex(291)
'0x123'
Para converter uma representação hexadecimal num número inteiro, podemos usar a função int(), passando uma string hexadecimal e a base (16) como argumentos:
>>> int("0x123", 16)
291
Tal como no binário e no octal, se indicares a base errada é lançado um ValueError.