Le binaire
D’où vient il ?
Les processeurs et microcontrôleurs qui nous entourent utilisent entre plusieurs centaines et plusieurs milliers de milliards de transistors. Un transistor et un composant à 3 broches (collecteur, base et émetteur), qui se contente de retenir le courant entre le collecteur et l’émetteur, tant que la base n’atteint pas un seuil de tension caractéristique. Cela a permis de développer des portes logiques, qui assemblées entre-elles, constituent les unités principales de calcul des processeurs.
Le concept même du transistor impose donc l’utilisation d’opération sur un ensemble binaire ; le courant passe ou ne passe pas, la valeur est 1 ou 0. Cela conduit donc à définir au sein des processeurs, des ensembles de uns et de zéros. Un chiffre binaire (0 ou 1) est appelé un bit.
Comment le lire ?
Un nombre binaire va se lire comme un nombre décimal, le chiffre le plus à gauche est le plus important. Pour retrouver la valeur décimal d’un nombre binaire de forme où chaque
est un bit, il faut appliquer la formule suivante :
Par exemple, le nombre va se convertir en décimal ainsi :
Soit :
Rassurez-vous il est très rare que l’on ait besoin de convertir un nombre binaire en décimal et vice versa. Par contre la conversion entre binaire et hexadécimal est une pratique courante.
L’hexadécimal
Pourquoi utiliser l’hexadécimal ?
Les suites de 0 et de 1 que forment les bits d’un nombre binaire n’est pas du tout pratique pour un œil humain habitué à un système décimal. De la même façon, les nombres décimaux ne sont pas manipulables sous cette forme par des processeurs qui ne sont capables d’identifier que deux états.
La meilleure alternative est donc d’utiliser une base, dont le nombre de chiffres est une puissance de deux. On a d’abord pensé à utilisé l’octal (en base 8, les chiffres de 0 à 7), mais cette base n’utilise 3 bits, ce qui implique d’être en décalage permanent avec la base 2 ; par exemple 3 chiffres octaux représentent 9 bits, ce qui dépasse d’un bit pour un système 8 bits, et gaspille de la mémoire.
Le choix s’est donc fixé sur l’écriture en base 16, l’hexadécimal, qui en plus d’être relativement proche de 10, permet de lire les bits par groupe de 4 de façon commode.
Comment l’écrire ?
Un quartet, appelé aussi nibble en anglais, est un ensemble de 4 bits que l’on peut écrire avec un seul chiffre hexadécimal. Voici les 16 formes possibles d’un quartet :
Binaire | Hexadécimal |
---|---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
Quel est le bénéfice dans notre cas ?
Ainsi, 8 bits peuvent se lire sur deux chiffres hexadécimaux, ce qui est un confort indiscutable comparé aux écritures décimale et octale. Il suffit par exemple d’écrire [cci]FF[/cci] pour s’assurer que tous les bits d’un registre passe à un.
Dans mon code, comment différencier le binaire, le décimal, l’octal et l’hexadécimal ?
Il existe des conventions pour chaque langage. Puisqu’ici on va utiliser principalement du C, voici les conventions :
- Un nombre binaire commence par [cci]0b[/cci] et est suivi des bits (0 ou 1). Vu que l’on travaille avec une architecture au moins égale à 8 bits, il est conseillé de faire des paquets de 8 bits. Cela facilite la lecture.
- Un nombre décimal s’écrit de façon naturelle, mais ne doit pas commencer par 0.
- Un nombre octal doit s’écrire avec un [cci]0[/cci] devant. Vu que cette écriture est peu utilisée, nous n’en parlerons plus dans la suite des tutoriels.
- Un nombre hexadécimal est précédé de [cci]0x[/cci]. Comme pour les nombres binaires, il est plus naturel d’écrire ces nombres par paquet de deux chiffres.
Binaire | Décimal | Octal | Hexadécimal |
---|---|---|---|
[cci]0b11000101[/cci] | [cci]197[/cci] | [cci]0305[/cci] | [cci]0xC5[/cci] |
[cci]0b00001101[/cci] | [cci]13[/cci] | [cci]015[/cci] | [cci]0x0D[/cci] |
[cci]0b11111111[/cci] | [cci]255[/cci] | [cci]0377[/cci] | [cci]0xFF[/cci] |
Bonjour et merci pour ce site qui est vraiment bien.
Je crois que pour bien comprendre l’aspect,disons, Booléen des microcontrôleurs il est crucial d’expliquer la notion de masque:
Par exemple: 1<<7 c'est 0b10000000 en binaire (NB: 0b = notation en langage C de binaire, 0x=Hexadecimal) soit un 1 en septième position. C'est ce qu'on appelle un masque.
Note: J'ai bien peur que sans cette explication, il soit très difficile de comprendre le texte ci-dessus, au même titre qu'il fut difficile pour moi de comprendre le texte de brownsofa sur l'attiny13 en anglais.
Ensuite, tous les termes technique du style PB0, portb1, PIN4 …etc… ne sont que des chiffres au même titre que le 7 ci-dessus (Sauf qu'ils sont définis comme des sortes de raccourcis dans les routines C du compilateur directement). Par exemple PB0=0, Portb1 c'est 1 ou encore PIN4=4. Ce qui permet de construire des masques intuitivement.
Je comptais faire, moi aussi un site d'explication, mais vraiment, au vues du votre, c'est a présent inutile.
Cordialement,
Olivier
Lire Ob01000000 ci-dessus, s’il vous plait.