Percursos
/
Python
Python
/
Programa
/
Binário, octal e hexadecimal
Bi

Binário, octal e hexadecimal em Python

{one: "1 exercício", many: "%{count} exercícios", other: "%{count} exercícios"}

Sobre Binário, octal e hexadecimal

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.

Binário

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

O binário em Python

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

Operações com números binários

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

Converter para e a partir da representação binária

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'

Métodos dos números binários

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
Note

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.

Octal

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.

Converter para e a partir da representação octal

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.

Hexadecimal

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.

Converter para e a partir da representação hexadecimal

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.

Editar via GitHub A ligação abre numa nova janela ou separador