Convertir números binarios, octales y hexadecimales y cadenas entre sí en Python

Negocio

Python puede manejar números y cadenas como números binarios, octales y hexadecimales, así como los números decimales habituales. También es fácil convertir entre ellos.

En esta sección, se explicarán los siguientes contenidos junto con un código de ejemplo.

  • Escribe números enteros en binario, octal y hexadecimal.
  • Convierte números en cadenas en notación binaria, octal y hexadecimal.
    • función integrada (por ejemplo, en el lenguaje de programación)bin(),oct(),hex()
    • método de cadenastr.format()Funciones incorporadasformat(), f cadena
    • Convierte un entero negativo en una cadena en formato de complemento a dos.
  • Convierte cadenas en notación binaria, octal y hexadecimal a números.
    • función integrada (por ejemplo, en el lenguaje de programación)int()
  • Ejemplos de aplicación
    • Aritmética de cadenas binarias
    • Convertir entre números binarios, octales y hexadecimales

Escribe números enteros en binario, octal y hexadecimal.

Añadiendo los siguientes prefijos, los números enteros int pueden escribirse en binario, octal y hexadecimal, respectivamente.
También puede utilizar mayúsculas.

  • Número binario:0bo0B
  • Octal:0oo0O
  • Número hexadecimal:0xo0X

La salida 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 con el prefijo, el tipo es un int entero.

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'>

Al ser un tipo entero, puede utilizarse para operaciones aritméticas regulares.

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

A partir de Python 3.6, es posible insertar guiones bajos _ en los números. La repetición de un guión bajo _ dará lugar a un error, pero puedes insertar tantos como quieras mientras no lo repitas.

El guión bajo _ no afecta al número, por lo que puede utilizarse como separador cuando hay muchos dígitos. Por ejemplo, insertar un guión bajo _ cada cuatro dígitos es fácil de leer.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

Convierte números en cadenas en notación binaria, octal y hexadecimal.

Para convertir un número en una cadena en notación binaria, octal o hexadecimal, utilice las siguientes funciones incorporadas.

  • función integrada (por ejemplo, en el lenguaje de programación)bin(),oct(),hex()
  • método de cadenastr.format()Funciones incorporadasformat(), f cadena

Esta sección también explica cómo obtener una cadena expresada en formato de complemento a dos para valores negativos.

Funciones incorporadas bin(), oct(), hex()

Las siguientes funciones incorporadas pueden convertir números en cadenas binarias, octales y hexadecimales.

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

Cada uno de ellos devuelve una cadena con los siguientes prefijos

  • 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'>

Si no necesita el prefijo, utilice slice[2:] para extraer la cadena que hay detrás, o utilice format() como se explica a continuación.

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

Si quieres convertirlo en una cadena decimal, puedes utilizar str().

print(str(i))
# 255

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

Función incorporada format(), método string str.format(), f string

La función incorporada format() y los métodos de cadena str.format() y f-string también pueden convertir números en cadenas binarias, octales y hexadecimales.

Especificando el segundo argumento de format() como sigue, se puede convertir a cadenas binarias, octales y hexadecimales, 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'>

Si desea obtener una cadena con el prefijo 0b,0o,0x, añada # a la cadena de especificación de formato.

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

También es posible rellenar el 0 con cualquier número de dígitos. Tenga en cuenta que el número de caracteres para el prefijo (dos caracteres) también debe tenerse en cuenta al rellenar el cero con un prefijo.

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

El método de cadena str.format() puede utilizarse también para la conversión.

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

A partir de Python 3.6, también se puede utilizar la cadena f.f'xxx'

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

Convierte un entero negativo en una cadena en formato de complemento a dos.

Cuando un entero negativo se convierte en una cadena binaria o hexadecimal utilizando bin() o format(), el valor absoluto tendrá un signo menos.

x = -9

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

En Python, las operaciones a nivel de bits sobre enteros negativos también se realizan en representación de complemento a dos. Por lo tanto, si quieres obtener una cadena expresada en forma de complemento a dos, puedes tomar un OR lógico a nivel de bits& con el número máximo de dígitos de bits requerido, como sigue.

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

Convierte cadenas en notación binaria, octal y hexadecimal a números.

Función incorporada int()

Para convertir una cadena en notación binaria, octal o hexadecimal en un número, utilice la función incorporada int().

Con int(string, radix), una cadena de caracteres en notación binaria, octal, hexadecimal, etc. puede convertirse en un int numérico en función del radix. Si se omite el radix, el número se considera 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'>

Si el radix se establece en 0, la conversión se realiza basándose en el siguiente prefijo de cadena.

  • Prefijo binario:0bo0B
  • Prefijo octal:0oo0O
  • Prefijo hexadecimal:0xo0X
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

Si el número base es 0 y no hay prefijo, se convertirá como un número decimal, pero tenga en cuenta que si el principio (lado izquierdo) se rellena con 0, se producirá un error.

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

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

En otros casos, las cadenas rellenas de cero pueden convertirse tal cual.

print(int('010'))
# 10

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

Si la cadena no se puede convertir con el radix o prefijo especificado, se produce un error.

# 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'

Ejemplos de aplicación

Aritmética de cadenas binarias

Por ejemplo, para realizar una operación sobre una cadena en notación binaria con el prefijo 0b.

Puede convertirlo fácilmente en un valor numérico (tipo entero int), realizar operaciones con él y volver a convertirlo en una cadena de caracteres.

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

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

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

Convertir entre números binarios, octales y hexadecimales

También es fácil convertir cadenas binarias, octales y hexadecimales entre sí. Una vez convertido a un int numérico, se puede convertir a una cadena de cualquier formato.

El relleno de ceros, el prefijo, etc. pueden ser controlados por la cadena de especificación del formato.

a_0b = '0b1110001010011'

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

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