Python pode lidar com números e cordas como números binários, octais e hexadecimais, bem como com os habituais números decimais. Também é fácil de converter entre eles.
Nesta secção, será explicado o seguinte conteúdo juntamente com o código da amostra.
- Escrever números inteiros em binário, octal, e hexadecimal.
- Converter números em cordas em notação binária, octal, e hexadecimal.
- função incorporada (por exemplo, em linguagem de programação)
bin()
,oct()
,hex()
- método de cordas
str.format()
, Funções incorporadasformat()
, f string - Converter um número inteiro negativo num fio no formato de um complemento de dois.
- função incorporada (por exemplo, em linguagem de programação)
- Converter cordas em notação binária, octal, e hexadecimal em números.
- função incorporada (por exemplo, em linguagem de programação)
int()
- função incorporada (por exemplo, em linguagem de programação)
- Exemplos de aplicação
- Aritmética de cordas binárias
- Converter entre números binários, octais e hexadecimais
Escrever números inteiros em binário, octal, e hexadecimal.
Ao adicionar os seguintes prefixos, os números inteiros int podem ser escritos em binário, octal, e hexadecimal, respectivamente.
Também se pode usar letras maiúsculas.
- Número binário:
0b
ou0B
- Octal:
0o
ou0O
- Número hexadecimal:
0x
ou0X
A saída da impressão() será em notação decimal.
bin_num = 0b10
oct_num = 0o10
hex_num = 0x10
print(bin_num)
print(oct_num)
print(hex_num)
# 2
# 8
# 16
Bin_num = 0B10
Oct_num = 0O10
Hex_num = 0X10
print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16
Mesmo com o prefixo, o tipo é um número inteiro int.
print(type(bin_num))
print(type(oct_num))
print(type(hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>
print(type(Bin_num))
print(type(Oct_num))
print(type(Hex_num))
# <class 'int'>
# <class 'int'>
# <class 'int'>
Como é um tipo inteiro, pode ser utilizado para operações aritméticas regulares.
result = 0b10 * 0o10 + 0x10
print(result)
# 32
Começando com Python 3.6, é possível inserir sublinhados _ em números. A repetição de um sublinhado _ resultará num erro, mas pode inserir quantos quiser, desde que não o repita.
O _ sublinhado não afecta o número, pelo que pode ser utilizado como separador quando existem muitos dígitos. Por exemplo, a inserção de um sublinhado _ cada quatro dígitos é fácil de ler.
print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True
bin_num = 0b1111_1111_1111
print(bin_num)
# 4095
Converter números em cordas em notação binária, octal, e hexadecimal.
Para converter um número numa cadeia em notação binária, octal, ou hexadecimal, usar as seguintes funções incorporadas.
- função incorporada (por exemplo, em linguagem de programação)
bin()
,oct()
,hex()
- método de cordas
str.format()
, Funções incorporadasformat()
, f string
Esta secção também explica como obter uma cadeia expressa em dois formatos de complemento para valores negativos.
Funções embutidas bin(), oct(), hex()
As seguintes funções integradas podem converter números em cordas binárias, octais, e hexadecimais.
- Número binário:
bin()
- Octal:
oct()
- Número hexadecimal:
hex()
Cada um devolve um fio com os seguintes prefixos
- Número binário:
0b
- Octal:
0o
- Número hexadecimal:
0x
- bin() — Built-in Functions — Python 3.10.0 Documentation
- oct() — Built-in Functions — Python 3.10.0 Documentation
- hex() — Built-in Functions — Python 3.10.0 Documentation
i = 255
print(bin(i))
print(oct(i))
print(hex(i))
# 0b11111111
# 0o377
# 0xff
print(type(bin(i)))
print(type(oct(i)))
print(type(hex(i)))
# <class 'str'>
# <class 'str'>
# <class 'str'>
Se não precisar do prefixo, use fatia[2:] para extrair a corda atrás dela, ou use formato() como explicado a seguir.
print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff
Se quiser convertê-lo para uma corda decimal, pode usar str().
print(str(i))
# 255
print(type(str(i)))
# <class 'str'>
Formato da função embutida(), método string str.format(), f string
A função integrada formato() e os métodos string str.format() e f-string podem também converter números em strings binárias, octal, e hexadecimais.
Ao especificar o segundo argumento de formato() como se segue, pode ser convertido em fios binários, octal e hexadecimais, respectivamente.
- Número binário:
b
- Octal:
o
- Número hexadecimal:
x
print(format(i, 'b'))
print(format(i, 'o'))
print(format(i, 'x'))
# 11111111
# 377
# ff
print(type(format(i, 'b')))
print(type(format(i, 'o')))
print(type(format(i, 'x')))
# <class 'str'>
# <class 'str'>
# <class 'str'>
Se quiser obter uma cadeia com prefixo 0b,0o,0x, adicione # à cadeia de especificação de formatação.
print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff
Também é possível preencher o 0 com qualquer número de dígitos. Note-se que o número de caracteres para o prefixo (dois caracteres) também deve ser tido em conta no preenchimento do zero com um prefixo.
print(format(i, '08b'))
print(format(i, '08o'))
print(format(i, '08x'))
# 11111111
# 00000377
# 000000ff
print(format(i, '#010b'))
print(format(i, '#010o'))
print(format(i, '#010x'))
# 0b11111111
# 0o00000377
# 0x000000ff
O método str.format() também pode ser usado para conversão.
print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff
Começando com Python 3.6, também se pode usar a corda f.f'xxx'
print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff
Converter um número inteiro negativo num fio no formato de um complemento de dois.
Quando um inteiro negativo é convertido para uma cadeia binária ou hexadecimal usando bin() ou formato(), o valor absoluto terá um sinal de menos.
x = -9
print(x)
print(bin(x))
# -9
# -0b1001
Em Python, as operações bitwise sobre inteiros negativos são também realizadas em representação de dois complementos. Portanto, se quiser obter uma cadeia expressa em forma de complemento de dois, pode tomar um OR& bitwise lógico com o número máximo de dígitos de bits necessários, como se segue.
- 4bit:
0b1111(=0xf)
- 8bit:
0xff
- 16bit:
0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7
Converter cordas em notação binária, octal, e hexadecimal em números.
Função embutida int()
Para converter uma string em notação binária, octal, ou hexadecimal num número, usar a função int() incorporada.
Com int(string, radix), uma string string em notação binária, octal, hexadecimal, etc. pode ser convertida para uma int numérica baseada no radix. Se o radix for omitido, o número é considerado decimal.
print(int('10'))
print(int('10', 2))
print(int('10', 8))
print(int('10', 16))
# 10
# 2
# 8
# 16
print(type(int('10')))
print(type(int('10', 2)))
print(type(int('10', 8)))
print(type(int('10', 16)))
# <class 'int'>
# <class 'int'>
# <class 'int'>
# <class 'int'>
Se o radix estiver definido em 0, a conversão é feita com base no seguinte prefixo de corda.
- Prefixo binário:
0b
ou0B
- Prefixo de Octal:
0o
ou0O
- Prefixo hexadecimal:
0x
ou0X
print(int('0b10', 0))
print(int('0o10', 0))
print(int('0x10', 0))
# 2
# 8
# 16
print(int('0B10', 0))
print(int('0O10', 0))
print(int('0X10', 0))
# 2
# 8
# 16
Se o número base for 0 e não houver prefixo, será convertido como um número decimal, mas note-se que se o início (lado esquerdo) for preenchido com 0, ocorrerá um erro.
print(int('10', 0))
# 10
# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'
Noutros casos, as cordas cheias a zero podem ser convertidas como estão.
print(int('010'))
# 10
print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255
Se a corda não puder ser convertida com o radix ou prefixo especificado, ocorre um erro.
# print(int('ff', 2))
# ValueError: invalid literal for int() with base 2: 'ff'
# print(int('0a10', 0))
# ValueError: invalid literal for int() with base 0: '0a10'
# print(int('0bff', 0))
# ValueError: invalid literal for int() with base 0: '0bff'
Exemplos de aplicação
Aritmética de cordas binárias
Por exemplo, para realizar uma operação numa corda em notação binária com o prefixo 0b.
Pode facilmente convertê-lo para um valor numérico (integer type int), realizar operações sobre ele, e depois convertê-lo de novo para uma cadeia de caracteres.
a = '0b1001'
b = '0b0011'
c = int(a, 0) + int(b, 0)
print(c)
print(bin(c))
# 12
# 0b1100
Converter entre números binários, octais e hexadecimais
Também é fácil converter as cordas binárias, octais e hexadecimais umas às outras. Uma vez convertido para uma int numérica, pode ser convertido para uma cadeia de caracteres de qualquer formato.
O preenchimento zero, prefixação, etc., pode ser controlado pela cadeia de especificação de formatação.
a_0b = '0b1110001010011'
print(format(int(a, 0), '#010x'))
# 0x00000009
print(format(int(a, 0), '#010o'))
# 0o00000011