Python pot gestionar nombres i cadenes com a nombres binaris, octals i hexadecimals, així com els nombres decimals habituals. També és fàcil convertir entre ells.
En aquesta secció, s’explicarà el contingut següent juntament amb el codi d’exemple.
- Escriu nombres enters en binari, octal i hexadecimal.
- Converteix nombres en cadenes en notació binària, octal i hexadecimal.
- funció integrada (per exemple, en llenguatge de programació)
bin()
,oct()
,hex()
- mètode de cadena
str.format()
, Funcions integradesformat()
, cadena f - Converteix un nombre enter negatiu en una cadena en format de complement a dos.
- funció integrada (per exemple, en llenguatge de programació)
- Converteix cadenes en notació binària, octal i hexadecimal en números.
- funció integrada (per exemple, en llenguatge de programació)
int()
- funció integrada (per exemple, en llenguatge de programació)
- Exemples d’aplicació
- Aritmètica de cadenes binàries
- Converteix entre nombres binaris, octals i hexadecimals
Escriu nombres enters en binari, octal i hexadecimal.
Afegint els prefixos següents, els nombres enters int es poden escriure en binari, octal i hexadecimal, respectivament.
També podeu utilitzar majúscules.
- Número binari:
0b
o0B
- Octal:
0o
o0O
- Número hexadecimal:
0x
o0X
La sortida de print() estarà en notació 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
Fins i tot amb el prefix, el tipus és un enter 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'>
Com que és un tipus enter, es pot utilitzar per a operacions aritmètiques regulars.
result = 0b10 * 0o10 + 0x10
print(result)
# 32
A partir de Python 3.6, és possible inserir guions baixos _ en números. Si repeteixes un guió baix _, es produirà un error, però pots inserir-ne tants com vulguis sempre que no el repeteixis.
El guió baix _ no afecta el número, de manera que es pot utilitzar com a separador quan hi ha molts dígits. Per exemple, inserir un guió baix _ cada quatre dígits és fàcil de llegir.
print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True
bin_num = 0b1111_1111_1111
print(bin_num)
# 4095
Converteix nombres en cadenes en notació binària, octal i hexadecimal.
Per convertir un nombre en una cadena en notació binària, octal o hexadecimal, utilitzeu les següents funcions integrades.
- funció integrada (per exemple, en llenguatge de programació)
bin()
,oct()
,hex()
- mètode de cadena
str.format()
, Funcions integradesformat()
, cadena f
Aquesta secció també explica com obtenir una cadena expressada en format de complement a dos per a valors negatius.
Funcions integrades bin(), oct(), hex()
Les següents funcions integrades poden convertir números en cadenes binàries, octals i hexadecimals.
- Número binari:
bin()
- Octal:
oct()
- Número hexadecimal:
hex()
Cadascun retorna una cadena amb els prefixos següents
- Número binari:
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'>
Si no necessiteu el prefix, utilitzeu slice[2:] per extreure la cadena que hi ha darrere, o utilitzeu format() com s’explica a continuació.
print(bin(i)[2:])
print(oct(i)[2:])
print(hex(i)[2:])
# 11111111
# 377
# ff
Si voleu convertir-lo en una cadena decimal, podeu utilitzar str().
print(str(i))
# 255
print(type(str(i)))
# <class 'str'>
Funció integrada format(), mètode de cadena str.format(), cadena f
La funció integrada format() i els mètodes de cadena str.format() i f-string també poden convertir nombres en cadenes binàries, octals i hexadecimals.
Si especifiqueu el segon argument de format() de la manera següent, es pot convertir en cadenes binàries, octals i hexadecimals, respectivament.
- Número binari:
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 voleu obtenir una cadena amb el prefix 0b,0o,0x, afegiu # a la cadena d’especificació de format.
print(format(i, '#b'))
print(format(i, '#o'))
print(format(i, '#x'))
# 0b11111111
# 0o377
# 0xff
També és possible omplir 0 amb qualsevol nombre de dígits. Tingueu en compte que el nombre de caràcters del prefix (dos caràcters) també s’ha de tenir en compte a l’hora d’emplenar zero amb un prefix.
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ètode de cadena str.format() també es pot utilitzar per a la conversió.
print('{:08b}'.format(i))
print('{:08o}'.format(i))
print('{:08x}'.format(i))
# 11111111
# 00000377
# 000000ff
A partir de Python 3.6, també podeu utilitzar la cadena f.f'xxx'
print(f'{i:08b}')
print(f'{i:08o}')
print(f'{i:08x}')
# 11111111
# 00000377
# 000000ff
Converteix un nombre enter negatiu en una cadena en format de complement a dos.
Quan un nombre enter negatiu es converteix en una cadena binària o hexadecimal mitjançant bin() o format(), el valor absolut tindrà un signe menys.
x = -9
print(x)
print(bin(x))
# -9
# -0b1001
A Python, les operacions bit a bit sobre nombres enters negatius també es realitzen en la representació del complement a dos. Per tant, si voleu obtenir una cadena expressada en forma de complement a dos, podeu prendre un OR& amb el nombre màxim de dígits de bits necessaris, de la manera següent.
- 4bit:
0b1111(=0xf)
- 8bit:
0xff
- 16bit:
0xffff
print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7
Converteix cadenes en notació binària, octal i hexadecimal en números.
Funció integrada int()
Per convertir una cadena en notació binària, octal o hexadecimal en un nombre, utilitzeu la funció integrada int().
Amb int(cadena, radix), una cadena str en notació binària, octal, hexadecimal, etc. es pot convertir en una int numèrica basada en la base. Si s’omet la base, el nombre es 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 la base s’estableix en 0, la conversió es fa en funció del prefix de cadena següent.
- Prefix binari:
0b
o0B
- Prefix octal:
0o
o0O
- Prefix hexadecimal:
0x
o0X
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 és 0 i no hi ha prefix, es convertirà com a nombre decimal, però tingueu en compte que si el principi (costat esquerre) s’omple amb 0, es produirà un error.
print(int('10', 0))
# 10
# print(int('010', 0))
# ValueError: invalid literal for int() with base 0: '010'
En altres casos, les cadenes plenes de zero es poden convertir tal com estan.
print(int('010'))
# 10
print(int('00ff', 16))
print(int('0x00ff', 0))
# 255
# 255
Si la cadena no es pot convertir amb la base o el prefix especificat, es produeix 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'
Exemples d’aplicació
Aritmètica de cadenes binàries
Per exemple, per realitzar una operació sobre una cadena en notació binària amb el prefix 0b.
Podeu convertir-lo fàcilment en un valor numèric (tipus enter int), fer-hi operacions i, a continuació, tornar-lo a convertir en una cadena str.
a = '0b1001'
b = '0b0011'
c = int(a, 0) + int(b, 0)
print(c)
print(bin(c))
# 12
# 0b1100
Converteix entre nombres binaris, octals i hexadecimals
També és fàcil convertir cadenes binàries, octals i hexadecimals entre si. Un cop convertit a un int numèric, es pot convertir a una cadena de qualsevol format.
L’emplenament zero, el prefix, etc. es poden controlar mitjançant la cadena d’especificació de format.
a_0b = '0b1110001010011'
print(format(int(a, 0), '#010x'))
# 0x00000009
print(format(int(a, 0), '#010o'))
# 0o00000011