Converte números e cadeas binarios, octais e hexadecimais entre e entre si en Python

Negocios

Python pode manexar números e cadeas como números binarios, octais e hexadecimais, así como os números decimais habituais. Tamén é fácil converter entre eles.

Nesta sección, explicaranse os seguintes contidos xunto co código de exemplo.

  • Escribe números enteiros en binario, octal e hexadecimal.
  • Converte números en cadeas en notación binaria, octal e hexadecimal.
    • función integrada (por exemplo, en linguaxe de programación)bin(),oct(),hex()
    • método de cadeastr.format(), Funcións integradasformat(), cadea f
    • Converte un enteiro negativo nunha cadea en formato de complemento a dous.
  • Converte cadeas en notación binaria, octal e hexadecimal en números.
    • función integrada (por exemplo, en linguaxe de programación)int()
  • Exemplos de aplicacións
    • Aritmética de cadeas binarias
    • Converte entre números binarios, octais e hexadecimais

Escribe números enteiros en binario, octal e hexadecimal.

Engadindo os seguintes prefixos, os números enteiros int poden escribirse en binario, octal e hexadecimal, respectivamente.
Tamén podes usar maiúsculas.

  • Número binario:0bou0B
  • Octal:0oou0O
  • Número hexadecimal:0xou0X

A saída de print() estará en notación 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

Incluso co prefixo, o tipo é un enteiro 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 é un tipo enteiro, pódese usar para operacións aritméticas regulares.

result = 0b10 * 0o10 + 0x10
print(result)
# 32

A partir de Python 3.6, é posible inserir guións baixos _ en números. Ao repetir un guión baixo _ producirase un erro, pero podes inserir tantos como queiras sempre que non o repitas.

O guión baixo _ non afecta ao número, polo que se pode usar como separador cando hai moitos díxitos. Por exemplo, inserir un guión baixo _ cada catro díxitos é 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

Converte números en cadeas en notación binaria, octal e hexadecimal.

Para converter un número nunha cadea en notación binaria, octal ou hexadecimal, use as seguintes funcións integradas.

  • función integrada (por exemplo, en linguaxe de programación)bin(),oct(),hex()
  • método de cadeastr.format(), Funcións integradasformat(), cadea f

Esta sección tamén explica como obter unha cadea expresada en formato de complemento a dous para valores negativos.

Funcións integradas bin(), oct(), hex()

As seguintes funcións integradas poden converter números en cadeas binarias, octais e hexadecimais.

  • Número binario:bin()
  • Octal:oct()
  • Número hexadecimal:hex()

Cada un devolve unha cadea cos seguintes prefixos

  • Número binario: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 non precisa o prefixo, use slice[2:] para extraer a cadea detrás del, ou use format() como se explica a continuación.

print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff

Se queres convertelo nunha cadea decimal, podes usar str().

print(str(i))
# 255

print(type(str(i)))
# <class 'str'>

Función integrada format(), método de cadea str.format(), cadea f

A función integrada format() e os métodos de cadea str.format() e f-string tamén poden converter números en cadeas binarias, octais e hexadecimais.

Ao especificar o segundo argumento de format() como segue, pódese converter en cadeas binarias, octais e hexadecimais, respectivamente.

  • Número binario: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 queres obter unha cadea co prefixo 0b,0o,0x, engade # á cadea de especificación de formato.

print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff

Tamén é posible encher 0 con calquera número de díxitos. Teña en conta que o número de caracteres para o prefixo (dous caracteres) tamén se debe ter en conta ao encher cero cun 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 de cadea str.format() tamén se pode usar para a conversión.

print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff

Comezando con Python 3.6, tamén podes usar a cadea f.f'xxx'

print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff

Converte un enteiro negativo nunha cadea en formato de complemento a dous.

Cando un enteiro negativo se converte nunha cadea binaria ou hexadecimal usando bin() ou format(), o valor absoluto terá un signo menos.

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

En Python, as operacións bit a bit sobre enteiros negativos tamén se realizan na representación do complemento a dous. Polo tanto, se queres obter unha cadea expresada en forma de complemento a dous, podes tomar un OR& co número máximo de díxitos de bit necesarios, como segue.

  • 4bit:0b1111(=0xf)
  • 8bit:0xff
  • 16bit:0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

Converte cadeas en notación binaria, octal e hexadecimal en números.

función integrada int()

Para converter unha cadea en notación binaria, octal ou hexadecimal nun número, use a función integrada int().

Con int(cadea, radix), unha cadea str en notación binaria, octal, hexadecimal, etc. pódese converter nun int numérico baseado na base. Se se omite a base, o número considérase 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 a base está definida en 0, a conversión realízase baseándose no seguinte prefixo de cadea.

  • Prefixo binario:0bou0B
  • Prefixo 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 é 0 e non hai prefixo, converterase en número decimal, pero teña en conta que se o principio (lado esquerdo) se enche con 0, producirase un erro.

print(int('10', 0))
# 10

# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'

Noutros casos, as cadeas de contido cero pódense converter tal e como están.

print(int('010'))
# 10

print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255

Se a cadea non se pode converter coa base ou o prefixo especificado, prodúcese un 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 aplicacións

Aritmética de cadeas binarias

Por exemplo, para realizar unha operación sobre unha cadea en notación binaria co prefixo 0b.

Podes convertelo facilmente nun valor numérico (tipo enteiro int), realizar operacións sobre el e, a continuación, convertelo de novo nunha cadea str.

a = '0b1001'
b = '0b0011'

c = int(a, 0) + int(b, 0)

print(c)
print(bin(c))
# 12
# 0b1100

Converte entre números binarios, octais e hexadecimais

Tamén é fácil converter cadeas binarias, octais e hexadecimais entre si. Unha vez convertido nun int numérico, pódese converter nunha cadea de calquera formato.

O recheo cero, o prefixo, etc. pódense controlar mediante a cadea de especificación de formato.

a_0b = '0b1110001010011'

print(format(int(a, 0), '#010x'))
# 0x00000009

print(format(int(a, 0), '#010o'))
# 0o00000011
Copied title and URL