← Mathématiques

Bases, conversions et calcul binaire

Sommaire

Tout ce qui circule dans une machine est binaire. L'hexadécimal n'est qu'une écriture compacte de ce binaire. Savoir passer de l'un à l'autre, et calculer dedans, est un réflexe de base.

1. Le principe d'une base

En base b, un nombre s'écrit comme une somme de puissances de b, chaque chiffre indiquant combien de fois on prend la puissance correspondante.

BaseNomChiffres utilisésPoids
2Binaire0, 11, 2, 4, 8, 16, 32…
8Octal0 à 71, 8, 64, 512…
10Décimal0 à 91, 10, 100, 1000…
16Hexadécimal0 à 9 puis A à F1, 16, 256, 4096…

Notation : on indique la base en indice, 10112, ou par un préfixe en informatique — 0b1011 pour le binaire, 0x2F pour l'hexadécimal.

La table à connaître par cœur

Déc.Bin.Hex.Déc.Bin.Hex.
000000810008
100011910019
200102101010A
300113111011B
401004121100C
501015131101D
601106141110E
701117151111F

Ces seize lignes sont le seul vrai par-cœur de la fiche. Une fois connues, toutes les conversions binaire ↔ hexadécimal se font de tête, sans passer par le décimal.

2. Convertir vers le décimal

Méthode unique, quelle que soit la base de départ : multiplier chaque chiffre par le poids de sa position, puis additionner. Les positions se numérotent de droite à gauche, en commençant à 0.

Binaire → décimal

Poids1286432168421
Bits10110101
Retenu128—3216—4—1
10110101₂ = 128 + 32 + 16 + 4 + 1 = 181

Astuce : il suffit d'additionner les poids là où il y a un 1. Les zéros ne comptent pas.

Hexadécimal → décimal

2F₁₆ = 2 × 16 + 15 × 1 = 32 + 15 = 47

1A3₁₆ = 1 × 256 + 10 × 16 + 3 × 1 = 256 + 160 + 3 = 419

3. Convertir depuis le décimal

Méthode des divisions successives par la base, en lisant les restes de bas en haut.

Décimal → binaire

DivisionQuotientReste
181 ÷ 2901
90 ÷ 2450
45 ÷ 2221
22 ÷ 2110
11 ÷ 251
5 ÷ 221
2 ÷ 210
1 ÷ 201

Lecture de bas en haut : 181 = 101101012. On vérifie avec la méthode des poids.

Méthode rapide par soustraction

Souvent plus rapide pour un octet : on part du poids le plus fort et on soustrait quand c'est possible.

181 − 128 = 53   → bit 128 : 1
 53 − 64  impossible → bit 64  : 0
 53 − 32  = 21   → bit 32  : 1
 21 − 16  = 5    → bit 16  : 1
  5 − 8   impossible → bit 8   : 0
  5 − 4   = 1    → bit 4   : 1
  1 − 2   impossible → bit 2   : 0
  1 − 1   = 0    → bit 1   : 1     ⇒ 1011 0101

Décimal → hexadécimal

419 ÷ 16 = 26 reste  3  → 3
 26 ÷ 16 =  1 reste 10  → A
  1 ÷ 16 =  0 reste  1  → 1        ⇒ 419 = 1A3₁₆

En pratique, on passe plutôt par le binaire : c'est plus sûr et plus rapide.

4. Binaire ↔ hexadécimal

C'est la conversion la plus utile, et la plus simple : 1 chiffre hexadécimal = exactement 4 bits, puisque 16 = 24.

Binaire → hexadécimal

On groupe les bits par paquets de 4, en partant de la droite, en complétant par des zéros à gauche si nécessaire.

1011 0101₂
 │    │
 B    5          ⇒  B5₁₆

11 1010 1100₂  →  0011 1010 1100
                   3    A    C     ⇒  3AC₁₆

Hexadécimal → binaire

On remplace chaque chiffre par ses 4 bits.

2F₁₆  →  2 = 0010,  F = 1111   ⇒  0010 1111₂

C0A8₁₆ → C=1100  0=0000  A=1010  8=1000
       ⇒ 1100 0000 1010 1000₂   (c'est 192.168 en IPv4)

Erreur classique : grouper à partir de la gauche. Toujours partir de la droite, comme pour les unités en décimal. 110101 se découpe en 0011 0101 (= 3516), pas en 1101 01.

Et l'octal, pour mémoire : 8 = 23, donc 1 chiffre octal = 3 bits. C'est ce qui explique les droits Unix : rwx tient sur 3 bits, donc sur un chiffre octal (chmod 750).

5. Les nombres décimaux

Après la virgule, les poids deviennent des puissances négatives de la base : 2−1 = 0,5 ; 2−2 = 0,25 ; 2−3 = 0,125…

Binaire → décimal

Poids421,0,50,250,125
Bits101,101
101,101₂ = 4 + 1 + 0,5 + 0,125 = 5,625

Décimal → binaire : multiplications successives

On traite séparément la partie entière (divisions par 2) et la partie fractionnaire (multiplications par 2, en lisant les parties entières de haut en bas).

5,625  →  partie entière 5 = 101₂

0,625 × 2 = 1,25   → 1   (on garde 0,25)
0,25  × 2 = 0,5    → 0   (on garde 0,5)
0,5   × 2 = 1,0    → 1   (reste 0 : on s'arrête)

         ⇒ 5,625 = 101,101₂

Attention : le procédé ne se termine pas toujours. 0,1 en décimal donne 0,0001100110011… en binaire, périodique à l'infini.

C'est l'explication du fameux 0.1 + 0.2 == 0.30000000000000004 qu'on rencontre dans tous les langages. Ce n'est pas un bug : 0,1 n'a pas d'écriture binaire finie, la machine en stocke une approximation. D'où la règle de ne jamais comparer deux flottants avec ==, et de stocker les montants monétaires en centimes entiers.

6. Opérations en binaire

Addition

Quatre cas seulement : 0+0=0, 0+1=1, 1+0=1, et 1+1=0 avec 1 de retenue.

    ¹ ¹ ¹ ¹        ← retenues
      1 0 1 1   (11)
   +  0 1 1 1   ( 7)
   -----------
    1 0 0 1 0   (18)  ✓

Cas à connaître : 1 + 1 + 1 (deux bits plus une retenue) donne 1 avec 1 de retenue.

Soustraction

Même principe qu'en décimal, avec des emprunts : 0 − 1 donne 1 en empruntant 1 au rang supérieur.

      1 0 0 1   ( 9)
   -  0 0 1 1   ( 3)
   -----------
      0 1 1 0   ( 6)  ✓

En pratique, les processeurs ne soustraient pas : ils additionnent le complément à deux (section suivante).

Multiplication

Plus simple qu'en décimal : on ne multiplie que par 0 ou par 1.

       1 0 1   (5)
    ×  1 1     (3)
    ---------
       1 0 1
   + 1 0 1 ·
   -----------
     1 1 1 1   (15)  ✓

Cas particulier très utile : multiplier par 2 revient à décaler d'un rang vers la gauche, diviser par 2 à décaler vers la droite — exactement comme multiplier par 10 en décimal.

Addition en hexadécimal

On additionne chiffre par chiffre, avec une retenue dès que le résultat atteint 16.

   2 F
+  1 4
------
   4 3        F + 4 = 15 + 4 = 19 = 16 + 3 → on écrit 3, retenue 1
              2 + 1 + 1 = 4

7. Nombres négatifs : le complément à deux

Une machine ne dispose pas de signe « − ». Pour représenter les entiers négatifs, on réserve le bit de poids fort : 0 = positif, 1 = négatif.

Méthode pour obtenir −n sur 8 bits :

  1. Écrire n en binaire.
  2. Inverser tous les bits (complément à un).
  3. Ajouter 1.
  5      = 0000 0101
  inversé= 1111 1010
  + 1     = 1111 1011     ⇒ −5 = 1111 1011₂

Vérification : 5 + (−5) doit donner 0.

    0000 0101
  + 1111 1011
  -------------
  1 0000 0000   ← la retenue sortante est abandonnée ⇒ 0  ✓

Sur 8 bits, on couvre ainsi −128 à +127 ; sur 16 bits, −32 768 à +32 767. C'est la raison pour laquelle un int déborde : il n'y a plus de bit disponible.

8. Opérations logiques et décalages

Elles s'appliquent bit à bit, indépendamment sur chaque position.

aba AND ba OR ba XOR bNOT a
000001
010111
100110
111100
  1100 1010          1100 1010          1100 1010
& 1111 0000        | 0000 1111        ^ 1111 1111
-----------        -----------        -----------
  1100 0000          1100 1111          0011 0101
 (masquage)         (forçage à 1)       (inversion)
OpérateurUsage typique
ANDMasquer : ne garder que certains bits. C'est l'opération du masque de sous-réseau.
ORForcer à 1 certains bits, combiner des drapeaux
XORInverser des bits, détecter une différence, chiffrement simple
NOTInverser tous les bits (complément à un)

Décalages

0000 1010  (10)   << 1  →  0001 0100  (20)   ×2
0000 1010  (10)   >> 1  →  0000 0101  ( 5)   ÷2

Un décalage de n rangs multiplie ou divise par 2n. C'est beaucoup plus rapide qu'une multiplication pour le processeur.

Propriété remarquable de XOR : a ^ b ^ b = a. Appliquer deux fois la même clé restitue la donnée d'origine. C'est le principe du chiffrement par XOR — et sa faiblesse, si la clé est courte ou réutilisée.

9. Où ça sert

DomaineApplication
Adressage IPLe masque s'applique par un AND bit à bit pour obtenir l'adresse réseau — voir Adressage IP
Adresses MAC48 bits notés en hexadécimal : 00:1B:44:11:3A:B7
IPv6128 bits, notés en hexadécimal par groupes de 16 bits
Couleurs CSS#FF8800 = 3 octets, rouge / vert / bleu
Droits Unixchmod 750 : 3 bits par catégorie, donc un chiffre octal
EncodageUTF-8, Base64, codes d'échappement
Drapeaux et permissionsUn bit par option, combinés par OR, testés par AND

Voir aussi la fiche Logique et calcul booléen pour les tables de vérité et la simplification d'expressions.

À retenir