Bases¤
Il y a 10 types de personnes dans le monde, celles qui comprennent le binaire, et celles qui ne le comprennent pas.
Une base désigne la valeur dont les puissances successives interviennent dans l'écriture des nombres dans la numération positionnelle, laquelle est un procédé par lequel l'écriture des nombres est composée de chiffres ou symboles reliés à leur position voisine par un multiplicateur, appelé base du système de numération.
Sans cette connaissance à priori du système de numération utilisé, il vous est impossible d'interpréter les nombres suivants :
En effet, au-delà de l'ordre des symboles (de gauche à droite), la base du système utilisé est cruciale pour interpréter ces nombres. Cette base détermine le nombre de symboles distincts qui peuvent être employés pour chaque position, et par conséquent, elle régit la structure même du nombre. Par exemple, une base dix (décimale) utilise dix symboles (0-9), tandis qu'une base deux (binaire) n'en utilise que deux (0 et 1). Sans cette compréhension, les nombres demeurent incompréhensibles et dépourvus de signification.
Exercice 1 : Symboles binaires
Dans la notation binaire, composés de 1 et de 0, combien de symboles existent et combien de positions y-a-t-il dans le nombre 11001
?
Solution
Le nombre 11001
est composé de 5 positions et de deux symboles possibles par position : 1
et 0
. La quantité d'information est donc e 5 bits.
Système décimal¤
Le système décimal est le système de numération utilisant la base dix et le plus utilisé par l'humanité au vingt et unième siècle, ce qui n'a pas toujours été le cas. Par exemple, les anciennes civilisations de Mésopotamie (Sumer ou Babylone) utilisaient un système positionnel de base sexagésimale (60) toujours utilisé pour la représentation des heures ou des angles, la civilisation maya utilisait un système de base 20 encore ancrée dans la culture française de même que certaines langues celtiques dont il reste aujourd'hui quelques traces en français avec la dénomination quatre-vingts.
L'exemple suivant montre l'écriture de 1506 en écriture hiéroglyphique de :
Il s'agit d'une numération additive.
Notre système de représentation des nombres décimaux est le système de numération indo-arabe qui emploie une notation positionnelle et dix chiffres (ou symboles) allant de zéro à neuf et un nombre peut se décomposer en puissances successives :
Nous l'avons vu au chapitre précédent, la base dix n'est pas utilisée dans les ordinateurs, car elle nécessite la manipulation de dix états, ce qui est difficile avec les systèmes logiques à deux états ; le stockage d'un bit en mémoire étant généralement assuré par des transistors.
Exercice 2 : Deux mains
Un dessin représentant deux mains humaines (composées chacune de cinq doigts) est utilisé pour représenter un chiffre. Les doigts peuvent être soit levés, soit baissés mais un seul doigt peut être levé. Quelle est la base utilisée ?
Solution
Deux mains de cinq doigts forment une paire composée de 10 doigts. Il existe donc dix possibilités, la base est donc décimale : 10.
Si plusieurs doigts peuvent être levés à la fois, il faut réduire le système à l'unité de base « le doigt » pouvant prendre deux états : levé ou baissé. Avec dix doigts (dix positions) et 2 symboles par doigts, un ombre binaire est ainsi représenté.
Système binaire¤
Le système binaire est similaire au système décimal, mais utilise la base deux. Les symboles utilisés pour exprimer ces deux états possibles sont d'ailleurs empruntés au système indo-arabe :
En termes techniques ces états sont le plus souvent représentés par des signaux électriques dont souvent l'un des deux états est dit récessif tandis que l'autre est dit dominant. Par exemple si l'état 0
est symbolisé par un verre vide et l'état 1
par un verre contenant du liquide. L'état dominant est l'état 1
. En effet, si le verre contient déjà du liquide, en rajouter ne changera pas l'état actuel, il y aura juste plus de liquide dans le verre.
Un nombre binaire peut être également décomposé en puissances successives :
Le nombre de possibilités pour un nombre de positions \(E\) et une quantité de symboles (ou base) \(b\) de 2 est simplement exprimé par :
Avec un seul bit
il est donc possible d'exprimer 2 valeurs distinctes.
Exercice 3 : Base 2
Combien de valeurs décimales peuvent être représentées avec 10-bits ?
Solution
Avec une base binaire 2 et 10 bits, le total représentable est :
Soit les nombres de 0 à 1023.
Système octal¤
Inventé par Charles XII de Suède , le système de numération octal utilise 8 symboles empruntés au système indo-arabe. Ce système pourrait avoir été utilisé par l'homme en comptant soit les jointures des phalanges proximales (trous entre les doigts), ou les doigts différents des pouces.
Notons que l'utilisation des 8 premiers symboles du système indo-arabe est une convention d'usage bien pratique, car tout humain occidental est familier de ces symboles. L'inconvénient est qu'un nombre écrit en octal pourrait être confondu avec un nombre écrit en décimal. Comme pour le système décimal, un nombre octal peut également être décomposé en puissances successives :
Au début de l'informatique, la base octale fut très utilisée, car il est très facile de la construire à partir de la numération binaire, en regroupant les chiffres par triplets :
En C, un nombre octal est écrit en préfixant la valeur à représenter d'un zéro. Attention donc à ne pas confondre :
- La valeur
042
est un nombre octal, soit \(4 \cdot 8^1 + 2 \cdot 8^0 = 34\) en décimal. En C un nombre octal est préfixé par un zéro.
Il est également possible de faire référence à un caractère en utilisant l'échappement octal dans une chaîne de caractère :
Important
N'essayez pas de préfixer vos nombres avec des zéros lorsque vous programmer car ces nombres seraient alors interprétés en octal et non en décimal.
Système hexadécimal¤
Ce système de numération positionnel en base 16 est le plus utilisé en informatique pour exprimer des grandeurs binaires. Il utilise les dix symboles du système indo-arabe, plus les lettres de A à F. Il n'y a pas de réel consensus quant à la casse des lettres qui peuvent être soit majuscules ou minuscules. Veillez néanmoins à respecter une certaine cohérence, ne mélangez pas les casses (majuscules/minuscules) dans un même projet.
Comme pour les autres bases, l'écriture peut également être décomposée en puissances successives :
La notation hexadécimale est très pratique en électronique et en informatique, car chaque chiffre hexadécimal représente un quadruplet de bits, soit deux caractères hexadécimaux par octet :
Tout ingénieur devrait connaître par cœur la correspondance hexadécimale de tous les quadruplets aussi bien que ses tables de multiplication (qu'il connaît d'ailleurs parfaitement, n'est-ce pas ?). La table suivante vous aidera à convertir rapidement un nombre hexadécimal en décimal :
Binaire | Hexadécimal | Octal | Décimal |
---|---|---|---|
0b0000 |
0x0 |
00 |
0 |
0b0001 |
0x1 |
01 |
1 |
0b0010 |
0x2 |
02 |
2 |
0b0011 |
0x3 |
03 |
3 |
0b0100 |
0x4 |
04 |
4 |
0b0101 |
0x5 |
05 |
5 |
0b0110 |
0x6 |
06 |
6 |
0b0111 |
0x7 |
07 |
7 |
0b1000 |
0x8 |
10 |
8 |
0b1001 |
0x9 |
11 |
0 |
0b1010 |
0xA |
12 |
10 |
0b1011 |
0xB |
13 |
11 |
0b1100 |
0xC |
14 |
12 |
0b1101 |
0xD |
15 |
13 |
0b1110 |
0xE |
16 |
14 |
0b1111 |
0xF |
17 |
15 |
Le fichier albatros.txt
(rédigé avec ed
, rappelez-vous) contient un extrait du poème de Baudelaire. Un ingénieur en proie à un bogue lié à de l'encodage de caractère cherche à le résoudre et utilise le programme hexdump
pour lister le contenu hexadécimal de son fichier. Il obtient la sortie suivante sur son terminal :
$ hexdump -C albatros.txt
0000 53 6f 75 76 65 6e 74 2c 20 70 6f 75 72 20 73 27 |Souvent, pour s'|
0010 61 6d 75 73 65 72 2c 20 6c 65 73 20 68 6f 6d 6d |amuser, les homm|
0020 65 73 20 64 27 c3 a9 71 75 69 70 61 67 65 0d 0a |es d'..quipage..|
0030 50 72 65 6e 6e 65 6e 74 20 64 65 73 20 61 6c 62 |Prennent des alb|
0040 61 74 72 6f 73 2c 20 76 61 73 74 65 73 20 6f 69 |atros, vastes oi|
0050 73 65 61 75 78 20 64 65 73 20 6d 65 72 73 2c 0d |seaux des mers,.|
0060 0a 51 75 69 20 73 75 69 76 65 6e 74 2c 20 69 6e |.Qui suivent, in|
0070 64 6f 6c 65 6e 74 73 20 63 6f 6d 70 61 67 6e 6f |dolents compagno|
0080 6e 73 20 64 65 20 76 6f 79 61 67 65 2c 0d 0a 4c |ns de voyage,..L|
0090 65 20 6e 61 76 69 72 65 20 67 6c 69 73 73 61 6e |e navire glissan|
00a0 74 20 73 75 72 20 6c 65 73 20 67 6f 75 66 66 72 |t sur les gouffr|
00b0 65 73 20 61 6d 65 72 73 2e 0d 0a 0d 0a 2e 2e 2e |es amers........|
00c0 0d 0a 0d 0a 43 65 20 76 6f 79 61 67 65 75 72 20 |....Ce voyageur |
00d0 61 69 6c 65 cc 81 2c 20 63 6f 6d 6d 65 20 69 6c |aile.., comme il|
00e0 20 65 73 74 20 67 61 75 63 68 65 20 65 74 20 76 | est gauche et v|
00f0 65 75 6c 65 e2 80 af 21 0d 0a 4c 75 69 2c 20 6e |eule...!..Lui, n|
0100 61 67 75 c3 a8 72 65 20 73 69 20 62 65 61 75 2c |agu..re si beau,|
0110 20 71 75 27 69 6c 20 65 73 74 20 63 6f 6d 69 71 | qu'il est comiq|
0120 75 65 20 65 74 20 6c 61 69 64 e2 80 af 21 0d 0a |ue et laid...!..|
0130 4c 27 75 6e 20 61 67 61 63 65 20 73 6f 6e 20 62 |L'un agace son b|
0140 65 63 20 61 76 65 63 20 75 6e 20 62 72 c3 bb 6c |ec avec un br..l|
0150 65 2d 67 75 65 75 6c 65 2c 0d 0a 4c 27 61 75 74 |e-gueule,..L'aut|
0160 72 65 20 6d 69 6d 65 2c 20 65 6e 20 62 6f 69 74 |re mime, en boit|
0170 61 6e 74 2c 20 6c 27 69 6e 66 69 72 6d 65 20 71 |ant, l'infirme q|
0180 75 69 20 76 6f 6c 61 69 74 e2 80 af 21 |ui volait...!|
018d
Il lit à gauche sur la première colonne l'offset mémoire de chaque ligne, au milieu le contenu hexadécimal, chaque caractère encodé sur 8 bits étant symbolisés par deux caractères hexadécimaux, et à droite le texte où chaque caractère non imprimable est remplacé par un point. On observe notamment ici que :
é
de équipage est encodé avec\xc3\xa9
ce qui est le caractère Unicode 0065é
de ailé est encodé avece\xcc\x81
, soit le caractère e suivi du diacritique´
0301- Une espace fine insécable
\xe2\x80\xaf
est utilisée avant les!
, ce qui est le caractère Unicode 202F, conformément à la recommandation de l'Académie française.
Ce fichier est donc encodé en UTF-8 quant au bogue de notre ami ingénieur, il concerne très probablement les deux manières distinctes utilisées pour encoder le é
. La saisie du poème manque donc de cohérence et le diable est dans les détails.
Par cet exercice, on observe néanmoins l'élégance de l'encodage hexadécimal qui permet de visualiser facilement, par groupe de 8 bits, le contenu du fichier, ce qui aurait été beaucoup moins évident en binaire.
Exercice 4 : Les chiffres hexadécimaux
Calculez la valeur décimale des nombres suivants et donnez le détail du calcul :
Exercice 5 : Albatros
Tentez de récupérer vous même le poème l'Albatros de Baudelaire et d'afficher le même résultat que ci-dessus depuis un terminal de commande Linux.
Si vous n'avez pas les outils wget
ou hexdump
, tentez de les installer ia la commande apt-get install wget hexdump
sous Ubuntu.
Conversions de bases¤
La conversion d'une base quelconque en système décimal utilise la relation suivante :
où :
- \(n\)
-
Le nombre de chiffres (ou positions)
- \(b\)
-
La base du système d'entrée (ou nombre de symboles)
- \(h_i\)
-
La valeur du chiffre à la position \(i\)
Ainsi, la valeur AP7
exprimée en base tritrigesimale (base 33) et utilisée pour représenter les plaques des véhicules à Hong Kong peut se convertir en décimales après avoir pris connaissance de la correspondance d'un symbole tritrigesimal vers le système décimal :
Tritrigesimal -> Décimal :
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 10 11 12 13 14 15
G H I K L M N P R S T U V W X Y Z
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
Conversion :
AP7 -> 10 * pow(33, 2) + 23 * pow(33, 1) + 7 * pow(33, 0) -> 11'656
La conversion d'une grandeur décimale vers une base quelconque est malheureusement plus compliquée et nécessite d'appliquer un algorithme.
La conversion d'un nombre du système décimal au système binaire s'effectue simplement par une suite de divisions pour lesquelles on notera le reste.
Pour chaque division par 2, on note le reste et tant que le quotient n'est pas nul, on itère l'opération. Le résultat en binaire est la suite des restes lus dans le sens inverse :
n = 209
209 / 2 == 104, 209 % 2 == 1 ^ sens de lecture des restes
104 / 2 == 52, 104 % 2 == 0 |
52 / 2 == 26, 52 % 2 == 0 |
26 / 2 == 13, 26 % 2 == 0 |
13 / 2 == 6, 13 % 2 == 1 |
6 / 2 == 3, 6 % 2 == 0 |
3 / 2 == 1, 3 % 2 == 1 |
1 / 2 == 0, 1 % 2 == 1 |
209 == 0b11010001
Exercice 6 : La numération Shadock
Les Shadocks ne connaissent que quatre mots : GA
, BU
, ZO
, MEU
. La vidéo éducative comment compter comme les Shadocks en explique le principe. Ils utilisent par conséquent une base quaternaire.
Convertir −⨼○◿○
(BU ZO GA MEU GA
) en décimal.
Solution
Le système Shadock est un système quaternaire similaire au système du génome humain basé sur quatre bases nucléiques. Assignons donc aux symboles Shadocks les symboles du système indo-arabe que nous connaissons mieux :
Le nombre d'entrée −⨼O◿O
peut ainsi s'exprimer :
En appliquant la méthode du cours, on obtient :
Notons que depuis un terminal Python vous pouvez simplement utiliser :
Autres bases¤
Une autre base couramment utilisée est la base64, qui utilise les 26 lettres de l'alphabet latin (majuscules et minuscules), les 10 chiffres et deux symboles additionnels. Cette base est souvent utilisée pour encoder des données binaires en ASCII, par exemple pour les pièces jointes des courriels.
Elle n'est pas à proprement parler une base fondamentale, mais plutôt une méthode de codage qui utilise 64 caractères imprimables.
On peut transmettre de l'information en binaire, mais cela implique de pouvoir gérer un contenu arbitraire qui n'est pas toujours évident dans des environnements prévus pour des caractères imprimables. On pourrait se dire qu'on utilise la représentation ASCII des caractères, mais de nombreux caractères ne sont pas imprimables. La base64 est une solution élégante pour encoder des données binaires en ASCII.
Prenons l'exemple de la phrase suivante :
Si l'on affiche le contenu hexadécimal de cette phrase, on obtient :
$ echo -ne 'La fleur en bouquet fâne... et jamais ne renait !' | hexdump -C
0000 4c 61 20 66 6c 65 75 72 20 65 6e 20 62 6f 75 71 |La fleur en bouq|
0010 75 65 74 20 66 c3 a2 6e 65 2e 2e 2e 20 65 74 20 |uet f..ne... et |
0020 6a 61 6d 61 69 73 20 6e 65 20 72 65 6e 61 69 74 |jamais ne renait|
0030 20 21 | !|
0032
En base64, le message est découpé en mot de 6 bits, soit 64 valeurs possibles. Chaque mot de 6 bits est ensuite converti en un caractère ASCII avec la table de codage suivante :
0 000000 A 17 010001 R 34 100010 i 51 110011 z
1 000001 B 18 010010 S 35 100011 j 52 110100 0
2 000010 C 19 010011 T 36 100100 k 53 110101 1
3 000011 D 20 010100 U 37 100101 l 54 110110 2
4 000100 E 21 010101 V 38 100110 m 55 110111 3
5 000101 F 22 010110 W 39 100111 n 56 111000 4
6 000110 G 23 010111 X 40 101000 o 57 111001 5
7 000111 H 24 011000 Y 41 101001 p 58 111010 6
8 001000 I 25 011001 Z 42 101010 q 59 111011 7
9 001001 J 26 011010 a 43 101011 r 60 111100 8
10 001010 K 27 011011 b 44 101100 s 61 111101 9
11 001011 L 28 011100 c 45 101101 t 62 111110 +
12 001100 M 29 011101 d 46 101110 u 63 111111 /
13 001101 N 30 011110 e 47 101111 v
14 001110 O 31 011111 f 48 110000 w (complément) =
15 001111 P 32 100000 g 49 110001 x
16 010000 Q 33 100001 h 50 110010 y
Ainsi le message commence par 4c612
ou en binaire 01001100 01100001 0010
. Découpé en paquet de 6 bits
010011 000110 000100 10
, on utilise selon la table de codage TGE
. Comme il s'agit d'un encodage courant,
il existe des outils pour le faire automatiquement :
echo -ne 'La fleur en bouquet fâne... et jamais ne renait !' | base64
TGEgZmxldXIgZW4gYm91cXVldCBmw6JuZS4uLiBldCBqYW1haXMgbmUgcmVuYWl0ICE=
Si le message n'est pas un multiple de \(4\times 6\) bits, il est complété avec des zéros et le caractère =
est ajouté à la fin du message pour indiquer le nombre de zéros ajoutés. Notre message à une longueur de 50 caractères, ou bien 400 bits, qui n'est pas divisible par 24. On complète donc avec =
.