03 - Bases

Activité

Découverte d’autres systèmes de numération

Introduction

Nous utilisons le système décimal (base 10) dans nos activités quotidiennes. Ce système est basé sur dix symboles, de 0 à 9, avec une unité supérieure (dizaine, centaine, etc.) à chaque fois que dix unités sont comptabilisées. C’est un système positionnel, c’est-à-dire que l’endroit où se trouve le symbole définit sa valeur. Ainsi, le 2 de 523 n’a pas la même valeur que le 2 de 132.

En fait, 523 est l’abréviation de \(5\times10^2 + 2\times10^1 + 3\times10^0\). On peut selon ce principe imaginer une infinité de systèmes numériques fondés sur des bases différentes.

Pourquoi d’autres bases en informatique ? Les ordinateurs fonctionnent grâce à des circuits électroniques qui ne connaissent que deux états : le courant passe (1) ou ne passe pas (0). C’est pourquoi le système binaire (base 2) est à la base de toute l’informatique. Deux symboles suffisent : 0 et 1. Chaque chiffre binaire est appelé un bit (contraction de binary digit). Un groupe de huit bits est appelé un octet.

On utilise aussi très souvent le système hexadécimal (base 16) du fait de sa compacité : il est bien plus lisible que le binaire pour représenter de longues séquences de bits. Il faut alors six symboles supplémentaires : A (qui vaut 10), B (11), C (12), D (13), E (14) et F (15).

Le tableau ci-dessous montre la représentation des nombres de 0 à 15 dans les trois bases :

Décimal01234567
Binaire00000001001000110100010101100111
Hexadécimal01234567
Décimal89101112131415
Binaire10001001101010111100110111101111
Hexadécimal89ABCDEF

À retenir. Pour éviter toute ambiguïté, on note la base en indice : \(1010_2\) est un nombre binaire, \(42_{10}\) un nombre décimal et \(2A_{16}\) un nombre hexadécimal.

Conversion binaire vers décimal

Pour convertir un nombre binaire en décimal, on multiplie chaque bit par la puissance de 2 correspondant à sa position (en partant de la droite, à partir de \(2^0\)), puis on additionne le tout.

Exemple. Convertissons \(01001101_2\) en décimal :

\(2^7\)\(2^6\)\(2^5\)\(2^4\)\(2^3\)\(2^2\)\(2^1\)\(2^0\)
1286432168421
01001101

Le nombre en base 10 est \(0 + 64 + 0 + 0 + 8 + 4 + 0 + 1 = 77\).

Méthode rapide. Il suffit d’additionner les puissances de 2 correspondant aux positions où les bits valent 1. Ici : \(2^6 + 2^3 + 2^2 + 2^0 = 64 + 8 + 4 + 1 = 77\).

Conversion décimal vers binaire

Pour convertir un nombre décimal en binaire, on effectue une suite de divisions euclidiennes par 2. Le résultat se lit en prenant les restes de bas en haut.

Exemple. Écrivons 77 en base 2 :

On lit les restes de bas en haut : 77 s’écrit \(1001101_2\). Sur un octet : \(01001101_2\).

Vérification. On peut toujours vérifier en reconvertissant vers la base 10 : \(64 + 8 + 4 + 1 = 77\). C’est correct.

En Python

Python offre des fonctions intégrées pour les conversions :

# Décimal vers binaire
print(bin(77))      # affiche '0b1001101'

# Binaire vers décimal
print(int('1001101', 2))  # affiche 77

# Décimal vers hexadécimal
print(hex(77))      # affiche '0x4d'

# Hexadécimal vers décimal
print(int('4D', 16))     # affiche 77

Le préfixe 0b indique un nombre binaire et 0x un nombre hexadécimal.

Conversion hexadécimal vers binaire (et réciproquement)

La conversion entre hexadécimal et binaire est particulièrement simple : chaque chiffre hexadécimal correspond exactement à un groupe de quatre bits. C’est précisément cette propriété qui rend l’hexadécimal si pratique en informatique.

Exemple 1 : binaire vers hexadécimal. Convertissons \(1001101_2\) en hexadécimal. On regroupe les bits par quatre en partant de la droite (on complète à gauche avec des zéros si nécessaire) :

Binaire01001101
Pseudo-décimal413
Hexadécimal4D

Donc \(1001101_2 = 4D_{16}\).

Exemple 2 : hexadécimal vers binaire. Convertissons \(A3F_{16}\) en binaire. On convertit chaque chiffre hexadécimal en son équivalent sur quatre bits :

HexadécimalA3F
Binaire101000111111

Donc \(A3F_{16} = 101000111111_2\).

Conversion décimal vers hexadécimal

Le principe est le même que pour le binaire, mais on divise par 16 au lieu de 2.

Exemple. Convertissons 477 en hexadécimal :

  • \(477 = 29 \times 16 + 13\), reste 13 (soit D) ;
  • \(29 = 1 \times 16 + 13\), reste 13 (soit D) ;
  • \(1 = 0 \times 16 + 1\), reste 1.

On lit les restes de bas en haut : \(477_{10} = 1DD_{16}\).

Méthode alternative. On peut aussi passer par le binaire comme étape intermédiaire : décimal \(\to\) binaire \(\to\) hexadécimal (en regroupant les bits par quatre).

Applications courantes

L’hexadécimal est omniprésent en informatique. Voici quelques exemples courants :

  • les couleurs en HTML/CSS : #FF5733 représente une couleur où le rouge vaut FF (255), le vert 57 (87) et le bleu 33 (51) ;
  • les adresses mémoire : 0x7FFF5B2A désigne un emplacement en mémoire ;
  • les adresses MAC des cartes réseau : A4:C3:F0:85:7B:01.

Exercices

Exercice 1

Convertir les nombres binaires suivants en décimal :

  1. \(1011_2\)
  2. \(11110000_2\)
  3. \(10101010_2\)

Exercice 2

Convertir les nombres décimaux suivants en binaire (sur un octet) :

  1. \(42\)
  2. \(100\)
  3. \(255\)

Exercice 3

Complétez le tableau ci-dessous. L’indice indique la base dans laquelle le nombre est écrit.

Bases21016
\(1001010110_2\)\(\phantom{nombre}\)\(\phantom{nombre}\)
\(2002_{10}\)
\(A1C4_{16}\)

Exercice 4

  1. Quel est le plus grand nombre que l’on peut représenter sur un octet (huit bits) ?
  2. Combien de bits sont nécessaires pour coder le nombre \(1000\) ?
  3. Combien de valeurs différentes peut-on représenter avec \(n\) bits ?

Exercice 5

Donner la représentation binaire (sur huit bits) et hexadécimale de chacune des composantes de la couleur HTML #1FA89C.

Exercice 6

Effectuer les additions suivantes en binaire, puis vérifier le résultat en décimal :

  1. \(1011_2 + 0110_2\)
  2. \(11001_2 + 10111_2\)

Exercice 7 (programmation)

Écrivez en Python un programme permettant de convertir un nombre d’une base de départ d vers une base d’arrivée a (avec d et a compris entre 2 et 16).