[Plan du site]
Vous êtes ici ---
> Le Site du Zér0
> Les tutoriels
> Non-Officiels
> Programmation
> Général
> Lecture du tutoriel
Du décimal au binaire
Vous vous apprêtez à lire un tutoriel rédigé par un membre de ce site. Malgré tout le soin que ce membre a pu apporter au tutoriel, nous ne pouvons pas garantir que les informations contenues sur cette page sont exactes à 100%. Merci de garder cela en tête lorsque vous lirez cette page ;o)
Dans ce tutoriel, vous apprendrez à réaliser le codage d'un nombre décimal en binaire ainsi que le décodage d'un nombre binaire en décimal.
Nous aborderons également les systèmes hexadécimal et octal.
Les systèmes décimal, binaire et hexadécimal sont tous trois des systèmes de numération.
Ils sont associés à une base.
La base d'un système de numération est le nombre de symboles différents utilisables dans ce système de numération.
- Le système décimal est associé à la base 10.
En effet, on peut utiliser 10 symboles dans ce système de numération, ce sont les chiffres de 0 à 9.
C'est le système de numération que vous utilisez tous les jours.
- Le système binaire est associé à la base 2.
On peut effectivement utiliser 2 symboles dans ce système de numération, à savoir 0 et 1.
Cela peut correspondre à diverses choses, notamment :
- en électricité, le courant passe (1) ou pas (0) ;
- d'une manière générale, vrai (1) ou faux (0).
C'est ce système de numération qui permet de stocker des informations dans la mémoire de votre ordinateur.
Chaque chiffre d'un nombre binaire est appelé bit, pour BInary digiT, soit chiffre binaire.
8 bits forment un octet.
Avec n bits, on peut former 2n nombres différents.
- Le système hexadécimal est associé à la base 16.
On peut donc y utiliser 16 symboles, il s'agit des chiffres de 0 à 9 et des lettres de A à F.
Ce système de numération permet une écriture raccourcie du système binaire, nous verrons cela lorsque nous parlerons de transcodage.
- Le système octal est associé à la base 8.
On peut y utiliser 8 symboles, qui sont les chiffres de 0 à 7.
Il permet lui aussi une écriture raccourcie du système binaire, il est cependant nettement moins utilisé que le système hexadécimal.
La notation
xbase permet de savoir dans quelle base un nombre
x est donné.
De plus, quand un nombre est précédé d'un $, c'est qu'il est donné en hexadécimal, et d'un % en binaire.
Dans le cas d'un code de couleur donné en hexadécimal, il est souvent précédé d'un #, comme dans le langage de présentation CSS.
Sans précision, il est en général donné en décimal.
Pour compter de 1 en 1 dans une certaine base, il suffit d'appliquer ce que vous avez vu à l'école primaire.
Vous le faites sûrement inconsciemment maintenant, mais voici ce que l'on vous a appris, valable pour la base 10 :
- on part de 0 ;
- on écrit chaque chiffre dans l'ordre qu'on a appris ;
- une fois qu'on est à 9, on a épuisé tous les chiffres, on rajoute 1 dans la colonne des dizaines et on revient à 0.
Si on doit rajouter 1 dans la colonne des dizaines et qu'on a épuisé tous les chiffres, on passe à 0 dans la colonne des dizaines et on rajoute 1 dans la colonne des centaines.
- et ainsi de suite.
Ceci est valable pour toutes les bases, en remplaçant 9 par le dernier symbole dans la base en question.
Les exemples suivants sont à lire de gauche à droite, de haut en bas, en se disant bien qu'une ligne correspond à l'utilisation de chacun des symboles de la base.
Exemple avec la base 10 :
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
| ... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
| 100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
| 110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
| ... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
Exemple avec la base 2 :
| 0 | 1 |
|---|
0 |
1 |
10 |
11 |
100 |
101 |
110 |
111 |
1000 |
1001 |
1010 |
1011 |
1100 |
1101 |
1110 |
1111 |
| 10000 |
10001 |
| 10010 |
10011 |
| ... |
... |
Exemple avec la base 8 :
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
| ... |
... |
... |
... |
... |
... |
... |
... |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
| 100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
| 110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
| ... |
... |
... |
... |
... |
... |
... |
... |
Exemple avec la base 16 :
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
|---|
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
A |
B |
C |
D |
E |
F |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
1A |
1B |
1C |
1D |
1E |
1F |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
2A |
2B |
2C |
2D |
2E |
2F |
| ... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
9A |
9B |
9C |
9D |
9E |
9F |
A0 |
A1 |
A2 |
A3 |
A4 |
A5 |
A6 |
A7 |
A8 |
A9 |
AA |
AB |
AC |
AD |
AE |
AF |
| ... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
| 100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
10A |
10B |
10C |
10D |
10E |
10F |
| 110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
11A |
11B |
11C |
11D |
11E |
11F |
| ... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
... |
Je vous propose un petit tableau récapitulatif avec les nombres de 0 à 15 dans les quatre bases que nous étudions.
| Base 2 | Base 8 | Base 10 | Base 16 |
|---|
0 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
10 |
2 |
2 |
2 |
11 |
3 |
3 |
3 |
100 |
4 |
4 |
4 |
101 |
5 |
5 |
5 |
110 |
6 |
6 |
6 |
111 |
7 |
7 |
7 |
1000 |
10 |
8 |
8 |
1001 |
11 |
9 |
9 |
1010 |
12 |
10 |
A |
1011 |
13 |
11 |
B |
1100 |
14 |
12 |
C |
1101 |
15 |
13 |
D |
1110 |
16 |
14 |
E |
1111 |
17 |
15 |
F |
Un nombre donné dans une certaine base peut se décomposer dans celle-ci, en se mettant sous la forme suivante :
xnbn + xn - 1bn - 1 + ... + x1b1 + x0b0
Où :
- b est la base dans laquelle il est donné, en vert sur la formule.
Remarque : b0 sera toujours égal à 1 ;
- n est le nombre de chiffres du nombre ôté de 1 et correspond au plus grand poids ;
- xy est le chiffre de poids y, en bleu sur la formule.
Le poids d'un chiffre correspond à sa position dans le nombre, en commençant au poids 0 et en lisant de droite à gauche.
Il est en rouge sur la formule.
Pour un nombre donné en binaire, on appelle
MSB ou bit de poids fort le bit ayant le poids le plus grand, et
LSB ou bit de poids faible le bit ayant le poids le plus petit.
Exemple :
dans le nombre
14410, le chiffre de poids
0 est
4, le chiffre de poids
1 est
4 et le chiffre de poids
2 est
1.
Sa décomposition dans sa base est donc :
14410 = 1 x 102 + 4 x 101 + 4 x 100.
En calculant, on retrouve bien 144 : 100 + 40 + 4 = 144.
Et c'est tout.
On appelle décodage le passage d'un nombre donné en une base quelconque vers la base 10.
Si vous avez compris la sous-partie précédente, vous n'aurez aucun mal à réaliser ceci.
En effet, pour effectuer un décodage, il suffit de décomposer le nombre en question dans sa base et de calculer.
Pour vous aider, voici des tableaux des puissances de 2, 8 et 16 :
Puissances de 2
| 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|
| 65 536 |
32 768 |
16 384 |
8 192 |
4 096 |
2 048 |
1 024 |
512 |
256 |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
Puissances de 8
| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|
| 16 777 216 |
2 097 152 |
262 144 |
32 768 |
4 096 |
512 |
64 |
8 |
1 |
Puissances de 16
| 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|---|
| 4 294 967 296 |
268 435 456 |
16 777 216 |
1 048 576 |
65 536 |
4 096 |
256 |
16 |
1 |
Exemple avec la base 2 :
100111112
=
1 x
27 +
0 x
26 +
0 x
25 +
1 x
24 +
1 x
23 +
1 x
22 +
1 x
21 +
1 x
20
=
128 +
0 +
0 +
16 +
8 +
4 +
2 +
1
=
15910
Exemple avec la base 8 :
4578
=
4 x
82 +
5 x
81 +
7 x
80
=
4 x
64 +
5 x
8 +
7
=
256 +
40 +
7
=
30310
Exemple avec la base 16 :
AE216
=
A x
162 +
E x
161 +
2 x
160
=
10 x
162 +
14 x
161 +
2 x
160
=
10 x
256 +
14 x
16 +
2
=
2560 +
224 +
2
=
150610
Rappelez-vous si vous rencontrez des problèmes lors du calcul que poser une addition ne peut pas faire de mal.
On appelle codage le passage d'un nombre en base 10 vers une autre base.
Nous verrons deux manières de le faire.
Codage par divisions entières successives
La première façon consiste à diviser le nombre décimal par la base vers laquelle on veut le coder, jusqu'à obtenir un quotient tenant sur un symbole de cette base.
Le dividende est d'abord le nombre décimal en lui-même, puis le quotient obtenu.
Le diviseur est toujours la base.
Le premier reste trouvé est alors le chiffre de poids faible, et le quotient final le chiffre de poids fort.
Les autres restes forment les autres chiffres.
Il faut donc lire de droite à gauche les chiffres trouvés pour avoir notre nombre dans sa nouvelle base.
Exemple avec la base 2 :
13010 =
100000102
Exemple avec la base 8 :
54710 =
10438
Exemple avec la base 16 :
165810 =
67A16
Codage par soustractions successives
La deuxième méthode consiste à chercher le nombre de fois que l'on retrouve chacune des puissances de la base à l'aide de soustractions.
On cherche la puissance de la base égale ou tout de suite inférieure au nombre à coder, puis on la soustrait, et on recommence avec le résultat jusqu'à obtenir 0.
Alors, le chiffre de poids
p a pour valeur le nombre de fois que l'on a soustrait
bp au nombre décimal.
Cette méthode devient vite compliquée avec une base autre que la base 2, car les puissances deviennent vite de gros chiffres.
Dans les autres cas, on préfèrera donc la méthode par division.
Exemple avec la base 2 :
On veut coder le nombre
13010 en base 2.
La puissance de 2 inférieure ou égale la plus proche est
27 =
128.
130 -
128 =
2
La puissance de 2 inférieure ou égale la plus proche est
21 =
2.
2 -
2 =
0
On a retrouvé
1 x
27 et
1 x
21, donc les bits de poids
1 et
7 seront à
1.
13010 =
100000102
On appelle transcodage le passage d'une base autre que la base 10 à une autre base, elle aussi n'étant pas la base 10.
Je vous avais dit que les systèmes hexadécimal et octal permettaient une écriture raccourcie du système binaire, c'est ce que nous allons voir.
Vous vous souvenez quand je vous ai dit au début qu'avec
n bits, on pouvait former 2
n nombres différents ?
C'est de cela que l'on va se servir.
Transcodage entre binaire et octal
En application de cette formule, avec 3 bits on peut former 2
3 nombres différents, soit 8.
Or, avec un chiffre en octal, on peut également former 8 nombres différents.
Du coup, en regroupant par groupes de trois bits un nombre binaire, chaque groupe de trois bits correspond à un chiffre du nombre en base 8.
Au besoin, c'est-à-dire si l'on n'a pas un nombre de bits multiple de 3, on peut rajouter des zéros à gauche du nombre jusqu'à obtenir uniquement des groupes de 3, ce qui, comme en décimal, ne change rien au nombre.
Exemple : transcodage du nombre
111010012 vers la base 8.
- Séparation en groupes de 3 bits : 011 101 001
- Calcul des chiffres en base 8 correspondant à chaque groupe :
- 0112 = 38
- 1012 = 58
- 0012 = 18
- Remplacement des groupes de 3 bits par leur équivalent en base 8 :
111010012 = 3518
Exemple : transcodage du nombre
7628 vers la base 2.
- Calcul des groupes de 3 bits correspondant à chaque chiffre en base 8 :
- 78 = 1112
- 68 = 1102
- 28 = 0102
- Remplacement des chiffres en base 8 par les groupes de 3 bits équivalents :
7628 = 1111100102
Transcodage entre binaire et hexadécimal
Le transcodage entre les bases 2 et 16 fonctionne de la même façon, mais avec des groupes de 4 bits, qu'on appelle quartets.
Ceci car avec 4 bits, on peut former 2
4 nombres différents, soit 16, et qu'avec un chiffre en hexadécimal, on peut également former 16 nombres différents.
Exemple : transcodage du nombre
111010012 vers la base 16.
- Séparation en quartets de bits : 1110 1001
- Calcul des chiffres en base 16 correspondant à chaque groupe :
- 11102 = 1410 = E16
- 10012 = 910 = 916
- Remplacement des quartets de bits par leur équivalent en base 16 :
111010012 = E916
Exemple : transcodage du nombre
A1816 vers la base 2.
- Calcul des quartets de bits correspondant à chaque chiffre en base 16 :
- A16 = 1010 = 10102
- 116 = 110 = 00012
- 816 = 810 = 10002
- Remplacement des chiffres en base 16 par les quartets de bits équivalents :
A1816 = 1010000110002
Pensez à utiliser le tableau des nombres de 0 à 15 dans les différentes bases vu plus haut au besoin.
Maintenant que vous savez tout cela, il serait bon de pouvoir en profiter dans vos programmes, si vous programmez.
Ce que je vais vous indiquer est valable pour les langages de programmation s'étant inspirés de la notation utilisée en C pour exprimer un nombre en bases 8 et 16.
Cela comprend notamment C, C++, Java, PHP, Python et Ruby.
- Pour indiquer un nombre en décimal, on indique simplement le nombre.
Exemple :
Code : C1 | int nombre = 20; /* nombre vaut 20 en base 10 */
|
- Pour indiquer un nombre en octal, on le fait précéder d'un 0.
Exemple :
Code : C1 | int nombre = 020; /* nombre vaut 20 en base 8, soit 16 en base 10 */
|
- Pour indiquer un nombre en hexadécimal, on le fait précéder d'un 0 et d'un x.
Exemple :
Code : C1 | int nombre = 0x20; /* nombre vaut 20 en base 16, soit 32 en base 10 */
|
En Pascal, on fait précéder un nombre d'un signe $ pour indiquer qu'il est donné en hexadécimal.
C'est bien beau d'avoir appris tout ça, mais on peut se demander à quoi ça sert.
Désolé si je vous déçois, mais le but de tout ceci n'est pas uniquement le plaisir de se triturer le cerveau.
Utilisations de l'octal
L'octal peut être pratique dans le cas d'un système de droits d'accès où les droits se regroupent par trois.
C'est notamment le cas pour les systèmes de droits des systèmes basés sur UNIX (chmod, ça vous dit quelque chose ?).
Ainsi, on y utilise un nombre octal pour stocker les droits, c'est-à-dire un bit par droit :
- si le MSB est à 1, alors le droit en lecture est accordé ;
- si le bit de poids 1 est à 1, alors le droit en écriture est accordé ;
- si le LSB est à 1, alors le droit en éxécution est accordé.
Pour aller plus loin :
Utilisations de l'hexadécimal
Voici dans quels domaine l'hexadécimal peut être utilisé.
- Pour représenter un motif binaire plus facilement qu'en passant par sa représentation décimale.
- Pour indiquer le code d'une couleur, dans les langages de présentation type CSS, et dans les fichiers d'image dits en couleurs vraies.
Une couleur est alors indiquée par 3 octets, soit 6 chiffres hexadécimaux, chaque octet représentant la quantité de rouge, de vert et de bleu utilisée pour former la couleur finale par des nombres allant de 0 à 255.
Pour aller plus loin :
- Vous connaissez peut-être l'Action Replay, il s'agit d'un appareil de triche pour consoles de jeux.
Il permet d'obtenir d'avoir de nombreuses choses telle que de la vie à l'infini, et ce pour la plupart des jeux.
Vous ne vous êtes jamais demandés comment cela peut être possible ?
En fait, les «codes Action Replay» sont composés d'une adresse mémoire et d'une valeur.
Lorsque vous mettez l'interrupteur en position de marche, l'Action Replay modifie l'emplacement mémoire (l'octet, si vous préférez) situé à l'adresse en question en lui mettant la valeur souhaitée.
Exemple avec un code de vie infinie :
- L'Action Replay met l'emplacement correspondant à la vie à 0A16, soit 1010 points de vie.
- Le personnage est touché !
- Le jeu modifie l'emplacement mémoire.
- L'Action Replay le remet à 0A16.
Et ainsi de suite.
Dès lors, vous vous doutez que l'utilisation de l'Action Replay est très risquée.
Si on modifie le mauvais emplacement, les dégâts peuvent être considérables.
Voilà, c'est la fin de cette petite parenthèse.
Il y a, bien entendu, de nombreuses autres utilisations, que vous découvrirez sûrement par vous-mêmes au cours de votre périple dans les contrées de l'informatique.
Vous savez désormais réaliser un codage, un décodage et un transcodage.
J'espère que cela vous servira un jour, et que vous comprenez mieux comment sont stockés les nombres entiers dans la mémoire de votre ordinateur.