Bases, conversions et calcul binaire
Sommaire
Tout ce qui circule dans une machine est binaire. L'hexadécimal n'est qu'une écriture compacte de ce binaire. Savoir passer de l'un à l'autre, et calculer dedans, est un réflexe de base.
1. Le principe d'une base
En base b, un nombre s'écrit comme une somme de puissances de b, chaque chiffre indiquant combien de fois on prend la puissance correspondante.
| Base | Nom | Chiffres utilisés | Poids |
|---|---|---|---|
| 2 | Binaire | 0, 1 | 1, 2, 4, 8, 16, 32… |
| 8 | Octal | 0 à 7 | 1, 8, 64, 512… |
| 10 | Décimal | 0 à 9 | 1, 10, 100, 1000… |
| 16 | Hexadécimal | 0 à 9 puis A à F | 1, 16, 256, 4096… |
Notation : on indique la base en indice, 10112, ou par un préfixe en informatique
— 0b1011 pour le binaire, 0x2F pour l'hexadécimal.
La table à connaître par cœur
| Déc. | Bin. | Hex. | Déc. | Bin. | Hex. |
|---|---|---|---|---|---|
| 0 | 0000 | 0 | 8 | 1000 | 8 |
| 1 | 0001 | 1 | 9 | 1001 | 9 |
| 2 | 0010 | 2 | 10 | 1010 | A |
| 3 | 0011 | 3 | 11 | 1011 | B |
| 4 | 0100 | 4 | 12 | 1100 | C |
| 5 | 0101 | 5 | 13 | 1101 | D |
| 6 | 0110 | 6 | 14 | 1110 | E |
| 7 | 0111 | 7 | 15 | 1111 | F |
Ces seize lignes sont le seul vrai par-cœur de la fiche. Une fois connues, toutes les conversions binaire ↔ hexadécimal se font de tête, sans passer par le décimal.
2. Convertir vers le décimal
Méthode unique, quelle que soit la base de départ : multiplier chaque chiffre par le poids de sa position, puis additionner. Les positions se numérotent de droite à gauche, en commençant à 0.
Binaire → décimal
| Poids | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
|---|---|---|---|---|---|---|---|---|
| Bits | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 |
| Retenu | 128 | — | 32 | 16 | — | 4 | — | 1 |
10110101₂ = 128 + 32 + 16 + 4 + 1 = 181
Astuce : il suffit d'additionner les poids là où il y a un 1. Les zéros ne comptent pas.
Hexadécimal → décimal
2F₁₆ = 2 × 16 + 15 × 1 = 32 + 15 = 47
1A3₁₆ = 1 × 256 + 10 × 16 + 3 × 1 = 256 + 160 + 3 = 419
3. Convertir depuis le décimal
Méthode des divisions successives par la base, en lisant les restes de bas en haut.
Décimal → binaire
| Division | Quotient | Reste |
|---|---|---|
| 181 ÷ 2 | 90 | 1 |
| 90 ÷ 2 | 45 | 0 |
| 45 ÷ 2 | 22 | 1 |
| 22 ÷ 2 | 11 | 0 |
| 11 ÷ 2 | 5 | 1 |
| 5 ÷ 2 | 2 | 1 |
| 2 ÷ 2 | 1 | 0 |
| 1 ÷ 2 | 0 | 1 |
Lecture de bas en haut : 181 = 101101012. On vérifie avec la méthode des poids.
Méthode rapide par soustraction
Souvent plus rapide pour un octet : on part du poids le plus fort et on soustrait quand c'est possible.
181 − 128 = 53 → bit 128 : 1
53 − 64 impossible → bit 64 : 0
53 − 32 = 21 → bit 32 : 1
21 − 16 = 5 → bit 16 : 1
5 − 8 impossible → bit 8 : 0
5 − 4 = 1 → bit 4 : 1
1 − 2 impossible → bit 2 : 0
1 − 1 = 0 → bit 1 : 1 ⇒ 1011 0101
Décimal → hexadécimal
419 ÷ 16 = 26 reste 3 → 3
26 ÷ 16 = 1 reste 10 → A
1 ÷ 16 = 0 reste 1 → 1 ⇒ 419 = 1A3₁₆
En pratique, on passe plutôt par le binaire : c'est plus sûr et plus rapide.
4. Binaire ↔ hexadécimal
C'est la conversion la plus utile, et la plus simple : 1 chiffre hexadécimal = exactement 4 bits, puisque 16 = 24.
Binaire → hexadécimal
On groupe les bits par paquets de 4, en partant de la droite, en complétant par des zéros à gauche si nécessaire.
1011 0101₂
│ │
B 5 ⇒ B5₁₆
11 1010 1100₂ → 0011 1010 1100
3 A C ⇒ 3AC₁₆
Hexadécimal → binaire
On remplace chaque chiffre par ses 4 bits.
2F₁₆ → 2 = 0010, F = 1111 ⇒ 0010 1111₂
C0A8₁₆ → C=1100 0=0000 A=1010 8=1000
⇒ 1100 0000 1010 1000₂ (c'est 192.168 en IPv4)
Erreur classique : grouper à partir de la gauche. Toujours partir de la
droite, comme pour les unités en décimal. 110101 se découpe en
0011 0101 (= 3516), pas en 1101 01.
Et l'octal, pour mémoire : 8 = 23, donc 1 chiffre octal = 3 bits. C'est ce qui
explique les droits Unix : rwx tient sur 3 bits, donc sur un chiffre octal
(chmod 750).
5. Les nombres décimaux
Après la virgule, les poids deviennent des puissances négatives de la base : 2−1 = 0,5 ; 2−2 = 0,25 ; 2−3 = 0,125…
Binaire → décimal
| Poids | 4 | 2 | 1 | , | 0,5 | 0,25 | 0,125 |
|---|---|---|---|---|---|---|---|
| Bits | 1 | 0 | 1 | , | 1 | 0 | 1 |
101,101₂ = 4 + 1 + 0,5 + 0,125 = 5,625
Décimal → binaire : multiplications successives
On traite séparément la partie entière (divisions par 2) et la partie fractionnaire (multiplications par 2, en lisant les parties entières de haut en bas).
5,625 → partie entière 5 = 101₂
0,625 × 2 = 1,25 → 1 (on garde 0,25)
0,25 × 2 = 0,5 → 0 (on garde 0,5)
0,5 × 2 = 1,0 → 1 (reste 0 : on s'arrête)
⇒ 5,625 = 101,101₂
Attention : le procédé ne se termine pas toujours. 0,1 en décimal donne
0,0001100110011… en binaire, périodique à l'infini.
C'est l'explication du fameux 0.1 + 0.2 == 0.30000000000000004 qu'on rencontre dans
tous les langages. Ce n'est pas un bug : 0,1 n'a pas d'écriture binaire finie, la machine en stocke une
approximation. D'où la règle de ne jamais comparer deux flottants avec ==, et de
stocker les montants monétaires en centimes entiers.
6. Opérations en binaire
Addition
Quatre cas seulement : 0+0=0, 0+1=1, 1+0=1, et
1+1=0 avec 1 de retenue.
¹ ¹ ¹ ¹ ← retenues
1 0 1 1 (11)
+ 0 1 1 1 ( 7)
-----------
1 0 0 1 0 (18) ✓
Cas à connaître : 1 + 1 + 1 (deux bits plus une retenue) donne 1 avec
1 de retenue.
Soustraction
Même principe qu'en décimal, avec des emprunts : 0 − 1 donne 1 en empruntant
1 au rang supérieur.
1 0 0 1 ( 9)
- 0 0 1 1 ( 3)
-----------
0 1 1 0 ( 6) ✓
En pratique, les processeurs ne soustraient pas : ils additionnent le complément à deux (section suivante).
Multiplication
Plus simple qu'en décimal : on ne multiplie que par 0 ou par 1.
1 0 1 (5)
× 1 1 (3)
---------
1 0 1
+ 1 0 1 ·
-----------
1 1 1 1 (15) ✓
Cas particulier très utile : multiplier par 2 revient à décaler d'un rang vers la gauche, diviser par 2 à décaler vers la droite — exactement comme multiplier par 10 en décimal.
Addition en hexadécimal
On additionne chiffre par chiffre, avec une retenue dès que le résultat atteint 16.
2 F
+ 1 4
------
4 3 F + 4 = 15 + 4 = 19 = 16 + 3 → on écrit 3, retenue 1
2 + 1 + 1 = 4
7. Nombres négatifs : le complément à deux
Une machine ne dispose pas de signe « − ». Pour représenter les entiers négatifs, on réserve le bit de poids fort : 0 = positif, 1 = négatif.
Méthode pour obtenir −n sur 8 bits :
- Écrire n en binaire.
- Inverser tous les bits (complément à un).
- Ajouter 1.
5 = 0000 0101
inversé= 1111 1010
+ 1 = 1111 1011 ⇒ −5 = 1111 1011₂
Vérification : 5 + (−5) doit donner 0.
0000 0101
+ 1111 1011
-------------
1 0000 0000 ← la retenue sortante est abandonnée ⇒ 0 ✓
Sur 8 bits, on couvre ainsi −128 à +127 ; sur 16 bits, −32 768 à +32 767.
C'est la raison pour laquelle un int déborde : il n'y a plus de bit disponible.
8. Opérations logiques et décalages
Elles s'appliquent bit à bit, indépendamment sur chaque position.
| a | b | a AND b | a OR b | a XOR b | NOT a |
|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 1 |
| 0 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 |
| 1 | 1 | 1 | 1 | 0 | 0 |
1100 1010 1100 1010 1100 1010
& 1111 0000 | 0000 1111 ^ 1111 1111
----------- ----------- -----------
1100 0000 1100 1111 0011 0101
(masquage) (forçage à 1) (inversion)
| Opérateur | Usage typique |
|---|---|
AND | Masquer : ne garder que certains bits. C'est l'opération du masque de sous-réseau. |
OR | Forcer à 1 certains bits, combiner des drapeaux |
XOR | Inverser des bits, détecter une différence, chiffrement simple |
NOT | Inverser tous les bits (complément à un) |
Décalages
0000 1010 (10) << 1 → 0001 0100 (20) ×2
0000 1010 (10) >> 1 → 0000 0101 ( 5) ÷2
Un décalage de n rangs multiplie ou divise par 2n. C'est beaucoup plus rapide qu'une multiplication pour le processeur.
Propriété remarquable de XOR : a ^ b ^ b = a. Appliquer deux fois la même clé restitue
la donnée d'origine. C'est le principe du chiffrement par XOR — et sa faiblesse, si la clé est courte ou
réutilisée.
9. Où ça sert
| Domaine | Application |
|---|---|
| Adressage IP | Le masque s'applique par un AND bit à bit pour obtenir l'adresse réseau — voir Adressage IP |
| Adresses MAC | 48 bits notés en hexadécimal : 00:1B:44:11:3A:B7 |
| IPv6 | 128 bits, notés en hexadécimal par groupes de 16 bits |
| Couleurs CSS | #FF8800 = 3 octets, rouge / vert / bleu |
| Droits Unix | chmod 750 : 3 bits par catégorie, donc un chiffre octal |
| Encodage | UTF-8, Base64, codes d'échappement |
| Drapeaux et permissions | Un bit par option, combinés par OR, testés par AND |
Voir aussi la fiche Logique et calcul booléen pour les tables de vérité et la simplification d'expressions.
À retenir
- 1 chiffre hexadécimal = 4 bits | 1 chiffre octal = 3 bits
- Poids d'un octet : 128 64 32 16 8 4 2 1
- Vers le décimal : additionner les poids là où il y a un 1
- Depuis le décimal : divisions successives, restes lus de bas en haut
- Binaire → hexa : grouper par 4 en partant de la droite
- Partie décimale : multiplications par 2, parties entières lues de haut en bas
- 1 + 1 = 0 avec 1 de retenue
- Négatif = inverser tous les bits, puis ajouter 1 (complément à deux)
- Sur 8 bits : −128 à +127
<< 1= ×2 |>> 1= ÷2 |AND= masquer- 0,1 n'a pas d'écriture binaire finie → ne jamais comparer deux flottants avec
==