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 cadea
str.format()
, Funcións integradasformat()
, cadea f - Converte un enteiro negativo nunha cadea en formato de complemento a dous.
- función integrada (por exemplo, en linguaxe de programación)
- Converte cadeas en notación binaria, octal e hexadecimal en números.
- función integrada (por exemplo, en linguaxe de programación)
int()
- función integrada (por exemplo, en linguaxe de programación)
- 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:
0b
ou0B
- Octal:
0o
ou0O
- Número hexadecimal:
0x
ou0X
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 cadea
str.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
- 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 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:
0b
ou0B
- Prefixo 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 é 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