Converter números e cordas binárias, octais e hexadecimais uns dos outros em Python

O negócio

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 cordasstr.format(), Funções incorporadasformat(), f string
    • Converter um número inteiro negativo num fio no formato de um complemento de dois.
  • Converter cordas em notação binária, octal, e hexadecimal em números.
    • função incorporada (por exemplo, em linguagem de programação)int()
  • 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:0bou0B
  • Octal:0oou0O
  • Número hexadecimal:0xou0X

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 cordasstr.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
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:0bou0B
  • Prefixo de Octal:0oou0O
  • Prefixo hexadecimal:0xou0X
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
Copied title and URL