Chez Ptit Gars

Accueil > Informatique > Les différentes bases numériques

Les différentes bases numériques

samedi 5 janvier 2008, par Pti Gars

Introduction

Comme vous avez surement dû déjà en entendre parler, l’unité fondamentale en informatique est le bit. Un bit est une entité qui peut prendre uniquement deux valeurs : 0 ou 1. Cela correspond plus physiquement à un état électrique, nul pour 0 ou non-nul pour 1.

Or un bit n’est pas suffisant pour coder tout les informations que l’on souhaiterait manipuler. On va donc employer des groupement de plusieurs bits. Un octet (en anglais byte, à ne pas confondre avec bit) est un regroupement de 8 bits.

0 0 0 0 0 0 0 0
7 6 5 4 3 2 1 0        

On numérotera les bits de la facon suivante : de la droite vers la gauche, en partant de 0. Le bit 0 est couramment appelé bit de poids faible, le bit le plus à gauche est quant à lui appelé bit de poids fort (low-order bit and high-order bit en anglais).

Un groupe de 16 bits, soit deux bytes, est appelé un mot (word en anglais). Le byte de gauche est appelé byte de poids fort, le byte de droite byte de poids faible.

Un groupe de 32 bits, soit 2 mots, est appelé un mot long. Le mot de gauche est appelé byte de poids fort, le byte de droite byte de poids faible.

Attention : toutes les conversions à suivre se basant sur le binaire ou l’hexadécimal sont valables pour des nombres binaires dont le bit de poids fort est 0, et pour les nombres hexadécimaux dont le premier chiffre est strictement inférieur à 8. Dans le cas contraire, on tombe dans le cas de nombre négatifs, cas que nous détaillerons plus tard.

Notations

Le fait de disposer d’autant de bases a un léger inconvénient : si je vous donne le nombre 10, s’agit-il du nombre 10 en base décimale (10), celui qu’on est habitué à rencontrer, ou bien alors du nombre en base binaire, qui vaut 2 en base décimale ? Pour pallier à ce problème, plusieurs notations sont utilisées. On fait parfois suivre le nombre d’un caractère exprimant la base :

b pour la base 2  (binaire)
o pour la base 8  (octale)
d pour la base 10 (décimale)
h pour la base 16 (hexadécimale)

Notre 10 sera donc écrit en base décimale sous la forme 10d, et 10b sera sa forme finaire. Un autre notation est de placer le nombre entre parenthèse et de spécifier la dimension de la base en indice. En aura ainsi (10)2 et (10)10.

Conversion binaire -> décimal

Nous avons traditionnellement appris à compter en base 10, c’est à dire que les nombres que nous manipulons sont constitués de 10 chiffres allant de 0 à 9. Le binaire est une base 2, et les nombres que nous manipuleront seront constitués de 2 chiffres, le 0 et le 1. Avant d’expliquer les conversions binaire->décimal (base 2 -> base 10), je vais quand même vous faire remarquer quelque chose. Prenons un nombre quelconque, mettons 1429, en base 10. Ce nombre peut-être décomposé de la manière suivante :

1429 = 1000 + 400 + 20 + 9 = 1*103 + 4*102 + 2*101 + 9*100

Un nombre peut donc être décomposé sous la forme de la somme de chacun des chiffres qui le composent, multipliés par la dimension de la base à l’exposant de leur rang. Cette méthode n’est pas valable uniquement pour les nombres décimaux. J’arrive donc à mon système binaire, avec un autre nombre pris au hasard.

01011010

La première chose à faire est de numéroter les bits comme nous l’avons vu un peu plus haut.

0 1 0 1 1 0 1 0
7 6 5 4 3 2 1 0

Et maintenant appliquons la formule trouvée :

01011010 = 1*2^1 + 1*2^3 + 1*2^4 + 1*2^6
            = 2    + 8    + 16   + 64
            = 90

90 est donc l’équivalent de 01011010 en base 10.

Conversion décimal->binaire

La, c’est un peu plus ennuyeux. En fait il faut diviser le nombre décimal en somme de puissances de 2. Par exemple, 149 peut s’écrire 128 + 16 +4 + 1. Il n’y a pas vraiment de secret... les puissances de 2 c’est bien pratique de les savoir par coeur. Retenez quelques valeurs clés, par exemple 28 = 256, 216=65536. Vous retrouverez les autres en divisant ou en multipliant par 2, c’est plus pratique que de passer par 20 si on cherche 29.

Bon je vais quand même essayer de détailler comment je trouve ma décomposition. La puissance de 2 immédiatement inférieure à 149, c’est 128 (-> 27). On aura donc 149 = 128 + quelquechose. On regarde maintenant la puissance de 2 directement inférieure à 128, soit 64. On remarque que si on additionne 128 et 64, on dépasse notre 149, on n’aura donc pas de 64 dans notre décomposition. On cherche donc la puissance de 2 encore immédiatement inférieure, 32, pareil, donc pas de 32. On arrive ensuite à 16, là 128 + 16 = 144 < 149, on rajoute donc 16 à notre somme. Bon, là le reste c’est pareil, enfin là on n’a plus qu’une différence de 5, j’espère que vous savez écrire 5 = 4 + 1 :).

L’hexadécimal

C’est d’ordinaire une base qui semble un peu compliquée. En effet, sa dimension est de 16, c’est à dire qu’il faut 16 chiffres différents pour former un nombre. Et comme notre bon vieux alphabet latin ne nous donne que dix chiffres (il nous en manque donc 6), et bien au lieu de créer 6 nouveaux chiffres on a décidé d’utiliser les lettres. Les chiffres composant le système hexadécimals ont donc 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F.

Mais pourquoi avoir créé un système hexadécimal me direz vous ? Et bien le binaire, c’est bien sympathique, mais à partir du moment où on commence à travailler sur des nombres relativement important, les chaines de 0 et de 1 commencent par ne plus en finir. Le système hexadécimal permet de coder des nombres importants avec très peu de caractères (4 chiffres suffisent à coder 65536 états différents !), et de plus comme nous allons le voir par la suite les conversions binaire->hexadécimal et hexadécimal->binaire sont particulièrement aisées.

Conversion hexadécimal -> décimal

Il faut utiliser la même méthode que pour la conversion binaire->décimal. Je prendra donc juste un rapide exemple :

229A = 2*16^3 + 2*16^2 + 9*16^1 + 10*16^0
        = 2*4096 + 2*256  + 9*16   + 10
        = 8192   + 512    + 144    + 10
        = 8860

Conversion décimal -> hexadécimal

Idem que pour le décimal->binaire, sauf que maintenant il faut décomposer notre nombre en puissance de 16. C’est très chiant, mais attention, à la base l’hexadécimal c’est pas trop fait pour ca... Enfin voici quand même un exemple, mettons 110. 110 c’est 6*16 + 14. Or en hexa, 14 se représente par E. Notre nombre hexadécimal sera donc 6E.

Conversion hexadécimal -> binaire

Noon, ne partez pas :) En fait justement c’est pas compliqué. La mauvaise méthode serait de convertir d’abord de hexadécimal en décimal, puis de décimal en binaire. C’est possible, mais ca ferait pas mal d’opérations assez compliquées. Ce qu’il faut savoir c’est que un chiffre hexadécimal correspond à 4 bits. Il suffit de convertir un à un chaque chiffre hexadécimal en binaire et de les mettre les un à la suite des autres.

Par exemple notre 6E ci dessus, 6h = 0110b, et Eh = 14d = 1110b. 6E donnera donc en binaire 01101110. C’est pas plus compliqué que cela :)

Conversion binaire->hexadécimal

La non plus, c’est pas bien dur. Prenons un mot : 0011011100101101b. Voyons voir combien cela fait en hexadécimal. La première chose à faire est de diviser ce mot en sections de 4 bits chacune -> 1011 0111 0010 1101. Maintenant pour chaque groupe de 4 bits (nibble en anglais) on va associer le chiffre hexadécimal correspondant.

0011b = 3d  = 3h
0111b = 7d  = 7h
0010b = 2d  = 2h
1101b = 13d = Dh

Notre mot 0011011100101101 en binaire vaut donc 372D en hexadécimal :).

L’octal

L’octal est une base 8, composée des chiffres allant de 0 à 7. Je ne détaillerai pas les calculs ici, étant donné que cette base est très rarement utilisée (pour être franc je n’ai jamais eu à y faire appel) et que de plus les conversions se font de la même manière que les autres.