Conversion de nombres et de chaînes de caractères binaires, octaux et hexadécimaux entre eux en Python

Affaires

Python peut traiter les nombres et les chaînes sous forme de nombres binaires, octaux et hexadécimaux, ainsi que les nombres décimaux habituels. Il est également facile de les convertir entre eux.

Dans cette section, les contenus suivants seront expliqués avec un exemple de code.

  • Écrire des nombres entiers en binaire, octal et hexadécimal.
  • Convertir des nombres en chaînes de caractères en notation binaire, octale et hexadécimale.
    • fonction intégrée (par exemple, dans un langage de programmation)bin(),oct(),hex()
    • méthode des chaînesstr.format()Fonctions intégréesformat(), f string
    • Convertit un nombre entier négatif en une chaîne de caractères au format complément à deux.
  • Convertissez les chaînes de caractères en notation binaire, octale et hexadécimale en nombres.
    • fonction intégrée (par exemple, dans un langage de programmation)int()
  • Exemples d'application
    • Arithmétique des chaînes binaires
    • Conversion entre les nombres binaires, octaux et hexadécimaux

Écrire des nombres entiers en binaire, octal et hexadécimal.

En ajoutant les préfixes suivants, les nombres entiers int peuvent être écrits en binaire, octal et hexadécimal, respectivement.
Vous pouvez également utiliser des lettres majuscules.

  • Nombre binaire :0bou0B
  • Octal :0oou0O
  • Nombre hexadécimal :0xou0X

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

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

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

Même avec le 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 il s'agit d'un type entier, il peut être utilisé pour des opérations arithmétiques régulières.

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

À partir de Python 3.6, il est possible d'insérer des underscores _ dans les nombres. La répétition d'un trait de soulignement _ entraînera une erreur, mais vous pouvez en insérer autant que vous le souhaitez, tant que vous ne le répétez pas.

Le trait de soulignement _ n'affecte pas le nombre, il peut donc être utilisé comme séparateur lorsque les chiffres sont nombreux. Par exemple, l'insertion d'un trait de soulignement _ tous les quatre chiffres est facile à lire.

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 des nombres en chaînes de caractères en notation binaire, octale et hexadécimale.

Pour convertir un nombre en une chaîne de caractères en notation binaire, octale ou hexadécimale, utilisez les fonctions intégrées suivantes.

  • fonction intégrée (par exemple, dans un langage de programmation)bin(),oct(),hex()
  • méthode des chaînesstr.format()Fonctions intégréesformat(), f string

Cette section explique également comment obtenir une chaîne exprimée au format complément à deux pour les valeurs négatives.

Fonctions intégrées bin(), oct(), hex()

Les fonctions intégrées suivantes peuvent convertir des nombres en chaînes binaires, octales et hexadécimales.

  • Nombre binaire :bin()
  • Octal :oct()
  • Nombre hexadécimal :hex()

Chacun renvoie une chaîne de caractères avec les préfixes suivants

  • Nombre binaire :0b
  • Octal :0o
  • Nombre hexadécimal :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 vous n'avez pas besoin du préfixe, utilisez slice[2 :] pour extraire la chaîne derrière, ou utilisez format() comme expliqué ci-dessous.

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

Si vous voulez le convertir en une chaîne décimale, vous pouvez utiliser str().

print(str(i))
# 255

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

Fonction intégrée format(), méthode string str.format(), f string

La fonction intégrée format() et les méthodes string str.format() et f-string peuvent également convertir des nombres en chaînes binaires, octales et hexadécimales.

En spécifiant le second argument de format() comme suit, il peut être converti en chaînes binaires, octales et hexadécimales, respectivement.

  • Nombre binaire :b
  • Octal :o
  • Nombre hexadécimal :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 vous voulez obtenir une chaîne avec le préfixe 0b,0o,0x, ajoutez # à la chaîne de spécification de formatage.

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

Il est également possible de remplir le 0 avec un nombre quelconque de chiffres. Notez que le nombre de caractères du préfixe (deux caractères) doit également être pris en compte lorsque vous remplissez le 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 str.format() peut également être utilisée pour la conversion.

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

À partir de Python 3.6, vous pouvez également utiliser la chaîne f.f'xxx'

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

Convertit un nombre entier négatif en une chaîne de caractères au format complément à deux.

Lorsqu'un nombre entier négatif est converti en une chaîne binaire ou hexadécimale à l'aide de bin() ou format(), la valeur absolue sera marquée d'un signe moins.

x = -9

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

En Python, les opérations bit à bit sur les entiers négatifs sont également effectuées dans la représentation en complément à deux. Par conséquent, si vous souhaitez obtenir une chaîne de caractères exprimée sous forme de complément à deux, vous pouvez effectuer un OU logique par bit& avec le nombre maximal de chiffres binaires requis, comme suit.

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

Convertissez les chaînes de caractères en notation binaire, octale et hexadécimale en nombres.

Fonction intégrée int()

Pour convertir une chaîne en notation binaire, octale ou hexadécimale en un nombre, utilisez la fonction intégrée int().

Avec int(string, radix), une chaîne de caractères str en notation binaire, octale, hexadécimale, etc. peut être convertie en un nombre int basé sur le radix. Si le radix est omis, le nombre est considéré comme 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 le radix est fixé à 0, la conversion est effectuée sur la base du préfixe de chaîne suivant.

  • Préfixe binaire :0bou0B
  • Préfixe octal :0oou0O
  • Préfixe hexadécimal :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

Si le nombre de base est 0 et qu'il n'y a pas de préfixe, il sera converti en nombre décimal, mais notez que si le début (côté gauche) est rempli de 0, une erreur se produira.

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

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

Dans d'autres cas, les chaînes de caractères remplies de zéros peuvent être converties telles quelles.

print(int('010'))
# 10

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

Si la chaîne ne peut pas être convertie avec le radix ou le préfixe spécifié, une erreur se produit.

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

Arithmétique des chaînes binaires

Par exemple, pour effectuer une opération sur une chaîne en notation binaire avec le préfixe 0b.

Vous pouvez facilement la convertir en une valeur numérique (de type int), effectuer des opérations sur celle-ci, puis la reconvertir à nouveau en chaîne de caractères.

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

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

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

Conversion 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 un int numérique, il peut être converti en une chaîne de caractères de n'importe quel format.

Le remplissage par des zéros, les préfixes, etc. peuvent être contrôlés par la chaîne de spécification du formatage.

a_0b = '0b1110001010011'

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

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