Skip to content

Convertir du binaire, de l’octal, du décimal et de l’hexadécimal en Python

En Python, vous pouvez gérer les nombres et les chaînes en tant que binaire (bin), octal (oct) et hexadécimal (hex) ainsi que décimal. Ils peuvent également être convertis les uns aux autres.

Cet article décrit le contenu suivant.

  • Écrire des nombres entiers en notation binaire, octale et hexadécimale
  • Convertir un nombre en une chaîne binaire, octale et hexadécimale
    • bin(), oct(), hex()
    • format(), str.format(), chaînes f
    • Convertir un entier négatif en une chaîne dans la représentation en complément à deux
  • Convertir une chaîne binaire, octale et hexadécimale en un nombre
  • Exemples d’utilisation
    • Arithmétique des chaînes binaires
    • Convertir entre les nombres binaires, octaux et hexadécimaux

Voir l’article suivant pour les bases de la conversion entre la chaîne (str) et le nombre (int, float).

Écrire des nombres entiers en notation binaire, octale et hexadécimale

En ajoutant les préfixes 0b, 0o et 0x, les nombres int de type entier peuvent être écrits respectivement en binaire, octal et hexadécimal. La sortie de print() sera en notation décimale.

bin_num = 0b10
oct_num = 0o10
hex_num = 0x10

print(bin_num)
print(oct_num)
print(hex_num)
# 2
# 8
# 16

Vous pouvez également utiliser les majuscules 0B, 0O et 0X.

Bin_num = 0B10
Oct_num = 0O10
Hex_num = 0X10

print(Bin_num)
print(Oct_num)
print(Hex_num)
# 2
# 8
# 16

Même avec un préfixe, le type est un entier 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'>

Comme ils sont int, ils peuvent être utilisés comme d’habitude.

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

Dans Python3.6 et versions ultérieures, vous pouvez insérer des traits de soulignement _ dans les nombres. La répétition du trait de soulignement _ génère une erreur, mais vous pouvez en insérer autant que vous le souhaitez s’il n’est pas répété.

Le trait de soulignement _ peut être utilisé comme délimiteur lorsqu’il y a beaucoup de chiffres. Par exemple, il est plus facile à lire si vous entrez _ tous les quatre chiffres.

print(0b111111111111 == 0b1_1_1_1_1_1_1_1_1_1_1_1)
# True

bin_num = 0b1111_1111_1111
print(bin_num)
# 4095

Convertir un nombre en une chaîne binaire, octale et hexadécimale

Vous pouvez utiliser les fonctions suivantes pour convertir un nombre en une chaîne binaire, octale ou hexadécimale.

  • Fonction intégrée bin(), oct(), hex()
  • Fonction intégrée format(), méthode de chaîne str.format(), f-strings

Il décrit également comment obtenir une chaîne dans la représentation du complément à deux pour une valeur négative.

bin(), oct(), hex()

Les fonctions intégrées bin(), oct() et hex() peuvent être utilisées pour convertir un nombre en une chaîne binaire, octale et hexadécimale. Ces fonctions renvoient une chaîne avec les préfixes 0b, 0o et 0x, respectivement.

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 vous n’avez pas besoin du préfixe, utilisez slice [2:] pour extraire les chaînes de fin ou utilisez format() comme décrit ci-après.

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

Si vous souhaitez convertir en une chaîne décimale, utilisez str().

print(str(i))
# 255

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

format(), str.format(), chaînes f

La fonction intégrée format(), la méthode de chaîne str.format() et les chaînes f peuvent également être utilisées pour convertir un nombre en une chaîne binaire, octale et hexadécimale.

En spécifiant b, o et x dans la chaîne de spécification de format du deuxième argument de format(), un nombre peut être converti en une chaîne binaire, octale et hexadécimale, respectivement.

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 vous souhaitez obtenir la chaîne de caractères avec le préfixe 0b, 0o, 0x, ajoutez # à la chaîne de spécification du format.

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

Il est également possible de remplir zéro (0) avec n’importe quel nombre de chiffres. Notez que le nombre de caractères pour le préfixe (deux caractères) doit également être pris en compte lors du remplissage de zéro avec un préfixe.

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

La méthode de chaîne str.format() peut être utilisée pour la même conversion.

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

Dans Python3.6 ou version ultérieure, vous pouvez également utiliser les f-strings (f’xxx’).

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

Convertir un entier négatif en une chaîne dans la représentation en complément à deux

Lors de l’utilisation de bin() ou format(), les entiers négatifs sont convertis en valeurs absolues avec un signe moins.

x = -9

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

En Python, les opérations au niveau du bit sur les entiers négatifs sont effectuées dans la représentation du complément à deux, donc si vous voulez obtenir une chaîne exprimée dans la représentation du complément à deux, prenez le bit à bit et & du nombre maximum de chiffres requis, par exemple, 0b1111 (= 0xf ) pour 4 bits, 0xff pour 8 bits et 0xffff pour 16 bits.

print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

Convertir une chaîne binaire, octale et hexadécimale en un nombre

entier()

Utilisez la fonction intégrée int() pour convertir une chaîne binaire, octale et hexadécimale en nombre.

Vous pouvez convertir une chaîne binaire, octale et hexadécimale en un entier basé sur la base avec int(string, radix). Si radix est omis, il est supposé être un nombre décimal.

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 vous définissez la base sur 0, elle sera convertie en fonction du préfixe (0b, 0o, 0x ou 0B, 0O, 0X).

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

Lorsque la base est 0, une chaîne sans préfixe est convertie en nombre décimal. Dans ce cas, notez qu’une erreur se produira si le début (côté gauche) est complété par 0.

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

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

Dans d’autres cas, la chaîne complétée par 0 peut être convertie.

print(int('010'))
# 10

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

Une erreur est générée si la chaîne ne peut pas être convertie en fonction de la base ou du préfixe spécifié.

# 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’utilisation

Arithmétique des chaînes binaires

Par exemple, si vous souhaitez exploiter une chaîne binaire avec le préfixe 0b, vous pouvez facilement la convertir en entier int, opérer quelque chose, puis la reconvertir en chaîne str.

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

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

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

Convertir entre les nombres binaires, octaux et hexadécimaux

Il est également facile de convertir des chaînes binaires, octales et hexadécimales entre elles. Une fois converti en nombre entier, il peut être converti en une chaîne de n’importe quel format.

Le remplissage à zéro et les préfixes peuvent être contrôlés par la chaîne de spécification de formatage.

a_0b = '0b1110001010011'

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

print(format(int(a, 0), '#010o'))
# 0o00000011