Ecriture d'un entier positif dans une base $b \geq 2$


Analogie avec la base 10

Nous utilisons tous les jours la base 10 pour compter, c'est la base décimale. Par exemple, le nombre 4097 représente 4 milliers, 0 centaine, 9 dizaines et 7 unités.

$4097 = 4\times 1000 + 0 \times 100 + 9 \times 10 + 7 \times 1$ c'est-à-dire : $4097 = \textbf 4 \times 10^3 + \textbf 0\times 10^2 + \textbf 9 \times 10^1 + \textbf 7 \times 10^0$

On retrouve les chiffres $4$, $0$, $9$ et $7$ dans cette écriture avec des puissances de 10. On peut schématiser cela ainsi :

Puissances de 10 ... $10^6$ $10^5$ $10^4$ $10^3$ $10^2$ $10^1$ $10^0$
Chiffres ... x x x 4 0 9 7

En base 10, chaque chiffre peut prendre 10 valeurs : de $0$ à $9$.

Comment ajouter 1 en base 10 ?

Vous le faites intuitivement, mais analysons ce qui se passe avec les chiffres de la représentation décimale. Il faudra faire exactement la même chose en base 2.

On regarde le chiffre des unités : s'il n'est pas au maximum ($\neq 9$) on ajoute lui ajoute $1$ ; s'il est au maximum, on le met à zéro et on regarde si on peut ajouter 1 au chiffre des dizaines, et ainsi de suite.

Voyons quelques exemples pour fixer les idées :

  • On veut ajouter $1$ à $27$ : comme le chiffre des unités vaut $7$ ($\neq 9$) on lui ajoute directement $1$. On obtient donc $28$ ;
  • On veut ajouter $1$ à $29$ : comme le chiffre des unités est à sa valeur maximale, on le met à $0$ et on regarde le chiffre des dizaines : il n'est pas à sa valeur maximale, on peut donc lui ajouter $1$. On obtient donc $30$.
  • On veut ajouter $1$ à $99$ : comme le chiffre des unités vaut $9$ on le met à $0$ et on passe au chiffre des dizaines; celui-ci vaut aussi $9$ donc on le met aussi à $0$ et on passe au chiffre des centaines; celui-ci vaut $0$ donc on peut lui ajouter $1$. On obtient donc $100$.

Codage en base 2

Vous avez vu que tout machine informatique, en raison de son architecture, ne manipule que des données dont l'unité minimale est le bit 0/1.

  • Comment est-il possible de représenter un nombre entier positif (en base décimale) uniquement avec des 0 et des 1 ?
  • Est-il possible de représenter tous les nombres entiers positifs de cette façon ?
  • Comment ajoute-t-on $1$ en base 2 ?

Activité : J'ai besoin de 8 élèves volontaires ! Règle du jeu : Chaque élève change la position de son bras quand son voisin de gauche baisse le sien.

Vous venez de découvrir comment on peut représenter les entiers naturels en base 2 (c'est-à-dire uniquement avec deux chiffres : 0 et 1).

Exercice 1 :

  1. Combien de valeurs peut-on coder sur 1 bit ?
  2. Combien de valeurs peut-on coder sur 2 bits ?
  3. Combien de valeurs peut-on coder sur 3 bits ?
  4. Combien de valeurs peut-on coder sur $n$ bits ?

Exercice 2 :

  1. Quelle est la valeur maximale que l'on peut coder sur 8 bits ?
  2. Complétez le tableau suivant avec l'écriture binaire de chaque entier. Pour cela, il suffit d'ajouter $1$ exactement de la même manière que ce qui a été vu un peu plus haut pour la base 10.
Nombre décimal Nombre en binaire
0 0
1 1
2
3
4
5
6
7
8
9
10

Tout cela est un peu pénible, et heureusement que je ne vous ai pas demandé de convertir 2019 en binaire... Il y a bien entendu une méthode pour convertir un nombre décimal en binaire.

Algorithme de conversion en binaire par suite de divisions

En divisant le nombre par 2, on obtient comme premier reste, le nombre d'unités. Si on recommence, on obtient les chiffres suivants de l'écriture en base 2. On s'arrête lorsque le quotient vaut 0.

Exemple en base 2 : Codage de 42 en base 2

42 / 2 -> 21 reste 0
21 / 2 -> 10 reste 1
10 / 2 -> 5  reste 0
5 / 2 -> 2 reste 1
2 / 2 -> 1 reste 0
1 / 2 -> 0 reste 1

On obtient le code en écrivant les restes de gauche à droite à partir du dernier reste obtenu. On a donc : $42 = (101010)_2$

On peut calculer l'écriture en binaire avec la fonction Python bin.

In [1]:
bin(42)
Out[1]:
'0b101010'

Exercice 3 :

Convertissez (à la main) en base 2 les nombres décimaux suivants : 63, 257, 2019. Vous vérifierez vos résultats avec Python en utilisant la fonction bin.

Conversion binaire --> décimale

La conversion binaire vers décimal est plus simple.

De la même manière que les chiffres de l'écriture décimale représentent des puissances de 10, les chiffres de l'écriture binaire représentent des puissances de 2.

Prenons l'exemple du nombre binaire $11010111$ :

Puissances de 2 $2^7$ $2^6$ $2^5$ $2^4$ $2^3$ $2^2$ $2^1$ $2^0$
Chiffres 1 1 0 1 0 1 1 1

Ainsi, pour convertir $(11010111)_2$ en décimal, on multiplie le premier chiffre (celui de droite) par $2^0$, le second par $2^1$, le troisième par $2^2$, etc. On calcule ensuite la somme de ces valeurs pour obtenir le nombre en décimal.

On obtient : $$(11010111)_2 = \textbf 1 \times 2^0 + \textbf 1 \times 2^1 + \textbf 1 \times 2^2 + \textbf 0 \times 2^3 + \textbf 1 \times 2^4 + \textbf 0 \times 2^5 + \textbf 1 \times 2^6 + \textbf 1 \times 2^7$$ c'est-à-dire : $$(11010111)_2 = 1 + 2 + 4 + 0 + 16 + 0 + 64 + 128 = 215.$$

Attention à bien commencer par le chiffre des unités !

On peut aussi directement saisir un nombre en binaire en préfixant son écriture par 0b.

In [12]:
0b11010111
Out[12]:
215

On comme cela :

In [15]:
int('11010111', 2) # le '2' pour indiquer que la chaine de caractères est un nombre en base 2
Out[15]:
215

Exercice 4 :

Convertissez en décimal les nombres binaires suivants : $(11011)_2$ et $(1100011011)_2$. Vous vérifierez ensuite vos résultats avec Python comme indiqué juste avant.

Codage en base 16

Cette base est appelée base hexadécimale (hexa = 6 + décimale = 10). Nous allons passer plus rapidement cette partie car les méthodes restent les mêmes qu'avec la base 2.

  • En base 10 : chaque chiffre peut être codé par 10 valeurs ($0,1,2,3,4,5,6,7,8,9$).
  • En base 2 : chaque chiffre peut être codé par 2 valeurs ($0,1$).
  • En base 16 : sans surprise, chaque chiffre peut être codé par 16 valeurs ($0,1,2,3,4,5,6,7,8,9,...$ et après ?). Après le $9$, on va utiliser les lettres de l'alphabet pour arriver à 16 valeurs en tout.

Ainsi, en base 16, chaque "chiffre" est codé par : $0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F$ avec la correspondance suivante :

Base 10 Base 16 Base 2
0 0 0
1 1 1
2 2 10
3 3 11
4 4 100
5 5 101
6 6 110
7 7 111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111

Pourquoi la base 16 ? L'avantage de la base 16 réside dans sa facilité de conversion de et vers la base 2. Un chiffre en base 16 remplace 4 bits (chiffres en base 2). Elle est donc un compromis entre le code binaire des machines et une base de numération pratique à utiliser pour les ingénieurs. L'hexadécimal a été utilisé la première fois en 1956 par les ingénieurs de l'ordinateur Bendix G-15.

Pour plus d'informations sur le système hexadécimal : Système hexadécimal - Wikipédia

Conversion en hexadécimal

L'algorithme est exactement le même que pour la conversion en binaire. Il suffit juste de diviser successivement par 16 et non par 2.

Exemple : Conversion de 215 en base 16

215 / 16 -> 13 reste 7
13 / 16 -> 0 reste 13 (D)

On obtient le code en écrivant les restes de gauche à droite à partir du dernier reste obtenu. On a donc : $215 = (D7)_{16}$

On peut expérimenter en Python le codage en base 16 grace à la fonction hex.

In [16]:
hex(215)
Out[16]:
'0xd7'

Pourquoi la base 16 ? (bis)

  • Grâce au tableau ci-dessus, on sait que $(D)_{16}=(1101)_2$ et que $(7)_{16}=(0111)_2$ donc on peut convertir très rapidement $(D7)_{16}$ en base 2 : $(11010111)_2$.
  • Réciproquement si on connait un nombre binaire $(11000011)_2$, on convertit les bits par blocs de 4 : $(1100)_2=(C)_{16}$ et $(0011)_2=(3)_{16}$ et on a très rapidement : $(11000011)_2 = (C3)_{16}$.

Conversion hexadécimale --> décimale

Même principe que la conversion binaire --> décimale.

Plutôt qu'un long discours, un exemple :

Exemple : conversion de $(4E8)_{16}$ en base 10 :

Puissances de 16 $16^2$ $16^1$ $16^0$
Chiffres 4 E 8

Donc : $(4E8)_{16}=8\times 16^0 + E\times 16^1 + 4 \times 16^2 = 8 \times 1 + 14 \times 16 + 4 \times 256 = 8 + 224 + 1024 = 1256$.

On peut vérifier avec Python en préfixant son écriture par 0x.

In [17]:
0x4e8
Out[17]:
1256
In [18]:
# ou aussi 
int('4e8', 16)
Out[18]:
1256

Exercice 5

  1. Convertissez $457$ en base 16.
  2. Convertissez $(876)_{16}$ en base 10.

Ecriture d'un entier positif dans une base $b\geq 2$ quelconque

Généralisation

Dans une base $b\geq 2$ quelconque, on procède exactement de la même façon mais avec des puissances de $b$ !

Exemple : Ecriture de l'entier 38 en base 5. $$38 = \textbf 1 \times 5^2 + \textbf 2 \times 5^1 + \textbf 3 \times 5^0.$$ Le nombre 38 s'écrit donc $(123)_5$ en base 5.

Écriture d’un entier positif dans une base $b \geq 2$ :

Si $x = a_n\times b^n + a_{n-1}\times b^{n-1} + ... + a_2\times b^2 + a_1\times b^1 + a_0\times b^0$

où les $a_i$ sont des chiffres entre 0 et $b-1$

Dans ce cas, $a_n a_{n-1}... a_2 a_1 a_0$ est l'écriture en base $b$ de $x$.

On note cela : $$ x = (a_n a_{n-1}... a_2 a_1 a_0)_b .$$

Ressources :


Germain BECKER & Sébastien POINT, Lycée Mounier, ANGERS Licence Creative Commons