NSI · 1ère Spécialité · Numération

Écrire un entier naturel en base b ≥ 2

Cours complet — Python exécutable — Exercices progressifs — QCM interactif

📄 Télécharger le doc élève (Word) 🖥️ Mode présentation (diaporama)
01 — Introduction

Pourquoi le binaire ?

Vus de l'extérieur, les ordinateurs manipulent des nombres, du texte, des images, du son. Mais à l'intérieur, chaque circuit électronique n'a que deux états possibles : le courant passe, ou il ne passe pas.

📋 Définition
Un système de numération en base b est un moyen de représenter les nombres avec b symboles. Selon sa place, chaque symbole « pèse » une valeur particulière : le système est dit de position.

Pour représenter des nombres, du texte ou des images avec seulement deux états, il faut donc les écrire comme des suites de 0 et de 1 : c'est la base 2, ou système binaire.

🐍 Sur cette page
Certains blocs de code sont modifiables et exécutables directement dans le navigateur (grâce à Pyodide, un vrai interpréteur Python). Repère le bouton ▶ Exécuter dans l'en-tête du bloc.
02 — Vocabulaire

Bit, octet, mot

🔑 À connaître
  • bit (binary digit) : la plus petite unité d'information, elle vaut 0 ou 1.
  • mot : une suite finie de bits, l'état d'un ensemble de circuits mémoire.
  • octet (byte) : un groupe de 8 bits. 1 octet = 1 o = 8 b.

Exemple : le mot 100 représente l'état d'un circuit composé de 3 circuits mémoire un bit, dont les états sont 1, 0 et 0.

📋 Convention d'écriture
Dans un mot, par convention on groupe les bits par 4 avec un espace entre chaque groupe. Exemple : 1010 1010 (plus facile à lire que 10101010).
03 — Compter en binaire

Le même principe qu'en base 10

Quand un rang est plein, on passe au rang suivant — exactement comme en base 10, sauf qu'un rang binaire n'accepte que 0 ou 1.

DécimalBinaire
00
11
210
311
4100
5101
6110
7111
81000
⚠ Combien de valeurs sur n bits ?
Avec n bits, on peut coder exactement 2ⁿ valeurs différentes, c'est-à-dire les entiers de 0 à 2ⁿ − 1. Avec 1 bit : 2 valeurs. Avec 8 bits (1 octet) : 256 valeurs, de 0 à 255.
04 — Binaire → Décimal

Convertir un binaire en décimal

Comme en base 10 où 352 = 3×10² + 5×10¹ + 2×10⁰, en base 2 chaque position vaut une puissance de 2.

Exemple guidé

2⁷2⁶2⁵2⁴2³2²2¹2⁰
1286432168421
01001101

64 + 8 + 4 + 1 = 77, donc (01001101)₂ = (77)₁₀.

🌟 Une même valeur, plusieurs représentations
77, 1001101₂ et 4D₁₆ désignent exactement le même nombre. Changer de base change la représentation (l'écriture), pas l'information elle-même.

En Python — prédis, puis exécute

print(int('1101', 2))
print(int('01001101', 2))
▶ Voir la sortie attendue

Sortie attendue : 13 puis 77. int(chaîne, 2) interprète la chaîne comme un nombre écrit en base 2.

À toi, convertis à la main : 1₂, 10₂, 100₂, 1110₂, 101010₂.

▶ Voir la correction

1₂ = 1 · 10₂ = 2 · 100₂ = 4 · 1110₂ = 14 · 101010₂ = 42

→ Fiche d'exercices : exercices 4 à 7.

05 — Décimal → Binaire

Convertir un décimal en binaire

On effectue une succession de divisions euclidiennes par 2, jusqu'à obtenir un quotient nul. Le résultat est la juxtaposition des restes, lus du dernier au premier.

DivisionQuotientReste
77 ÷ 2381
38 ÷ 2190
19 ÷ 291
9 ÷ 241
4 ÷ 220
2 ÷ 210
1 ÷ 201

Restes lus de bas en haut : 1001101, donc (77)₁₀ = (1001101)₂.

▶ 📘 Jamais fait de Python ? Mini-mémo (variables, if, while, for, listes...)
Variables et affectation — on stocke une valeur dans un nom avec =.
n = 10
n = n - 1   # n vaut maintenant 9
Test if / elif / else — exécute un bloc selon une condition (bloc indenté de 4 espaces) :
if n == 0:
    print("zero")
elif n > 0:
    print("positif")
else:
    print("negatif")
Boucle while — répète tant qu'une condition est vraie. C'est celle utilisée dans ce chapitre, car on ne connaît pas à l'avance le nombre de divisions :
n = 13
while n > 0:
    print(n)
    n = n - 1   # affiche 13, 12, 11, ... jusqu'a 1
Boucle for — répète un nombre de fois connu à l'avance, souvent avec range() :
for i in range(5):
    print(i)   # affiche 0, 1, 2, 3, 4
Modulo % et division entière // — les deux opérateurs au cœur de ce chapitre :
13 % 2    # reste de 13 / 2  ->  1
13 // 2   # quotient de 13 / 2  ->  6
Listes — [] liste vide, .append(x) ajoute à la fin, .reverse() inverse sur place :
chiffres = []
chiffres.append('1')
chiffres.append('0')
print(chiffres)      # ['1', '0']
chiffres.reverse()
print(chiffres)      # ['0', '1']
Assembler une liste en chaîne — ''.join(liste) colle les éléments ensemble :
''.join(['1', '0', '1'])   # '101'
Fonctions — def définit une fonction, return renvoie son résultat :
def double(x):
    return x * 2

print(double(5))   # 10

Trace d'exécution — suis la boucle pas à pas

Avant d'écrire la fonction, vérifie que tu comprends bien ce que fait la boucle while : trace son exécution pour n = 13 (une ligne du tableau = un tour de boucle).

Tourn (avant)n > 0 ?reste = n % 2n (après n // 2)
113Vrai??
2?Vrai??
3?Vrai??
4?Vrai??
5??——
▶ Voir la correction
Tourn (avant)n > 0 ?reste = n % 2n (après n // 2)
113Vrai16
26Vrai03
33Vrai11
41Vrai10
50Faux——

Liste chiffres obtenue (dans l'ordre d'ajout) : 1, 0, 1, 1 → après chiffres.reverse() : 1, 1, 0, 1. Donc entier_vers_binaire(13) affiche 1101.

À toi de coder — complète la fonction

Clique sur ▶ Exécuter pour lancer ton code.
▶ Indice

Le reste de n divisé par 2, c'est n % 2 (à ajouter avec .append()). Le quotient, c'est n // 2. Pour remettre les chiffres dans le bon ordre, une liste a une méthode .reverse().

▶ Voir la correction
def entier_vers_binaire(n):
    if n == 0:
        return '0'
    chiffres = []
    while n > 0:
        chiffres.append(str(n % 2))
        n = n // 2
    chiffres.reverse()
    return ''.join(chiffres)
06 — Hexadécimal

Le système hexadécimal (base 16)

La base 16 a besoin de 16 symboles : les 10 chiffres 0 à 9, puis A, B, C, D, E, F pour 10 à 15.

Même principe que pour le binaire, avec des divisions successives par 16 :

DivisionQuotientReste
335 ÷ 162015 (=F)
20 ÷ 1614
1 ÷ 1601

Donc (335)₁₀ = (14F)₁₆.

À toi : convertis 965 en base 16.

▶ Voir la correction

965 ÷ 16 = 60 reste 5 ; 60 ÷ 16 = 3 reste 12 (C) ; 3 ÷ 16 = 0 reste 3 → 965 = 3C5₁₆

→ Fiche d'exercices : exercices 12 et 13.

07 — Base b généralisée

Généraliser à une base b quelconque

En base b, on a besoin de b symboles. Un nombre écrit (aₙ₋₁ ... a₁ a₀) en base b se lit comme une somme de puissances de b :

🧮 Formule générale
(aₙ₋₁ aₙ₋₂ … a₁ a₀)b = aₙ₋₁ × bn-1 + aₙ₋₂ × bn-2 + … + a₁ × b¹ + a₀ × b⁰

7.1 — De la base 10 vers la base b

On effectue une succession de divisions euclidiennes par b, jusqu'à un quotient nul. Le résultat est la juxtaposition des restes, lus du dernier au premier (même méthode qu'en base 2 ou en base 16, avec b au lieu de 2 ou 16).

DivisionQuotientReste
50 ÷ 3162
16 ÷ 351
5 ÷ 312
1 ÷ 301

Donc (50)₁₀ = (1212)₃.

⚠ Généralisation
Avec n positions en base b, on peut coder bⁿ valeurs, de 0 à bⁿ − 1. C'est la généralisation du cas b = 2 vu en partie 3 (2ⁿ valeurs, de 0 à 2ⁿ − 1).

7.2 — De la base b vers la base 10

On applique directement la formule ci-dessus : chaque chiffre est multiplié par la puissance de b correspondant à sa position, puis on additionne.

16²16¹16⁰
256161
72C

7×256 + 2×16 + 12×1 = 1792 + 32 + 12 = 1836, donc (72C)₁₆ = (1836)₁₀ (rappel : C₁₆ = 12₁₀).

→ Fiche d'exercices : exercice 14.

Coder la généralisation

Tout ce qu'on a vu se code aussi : divisions successives par b.

⭐ NIVEAU FACILE — base b ≤ 10

Clique sur ▶ Exécuter pour lancer ton code.
▶ Indice

La structure est identique à entier_vers_binaire : seul le 2 devient b, à trois endroits.

▶ Voir la correction
def entier_vers_base(n, b):
    if n == 0:
        return '0'
    chiffres = []
    while n > 0:
        chiffres.append(str(n % b))
        n = n // b
    chiffres.reverse()
    return ''.join(chiffres)

⭐⭐ NIVEAU INTERMÉDIAIRE — gérer la base 16

Pour b = 16, un reste peut valoir jusqu'à 15 : il faut le traduire en symbole. La chaîne "0123456789ABCDEF" indexée par le reste donne directement le bon caractère.

Clique sur ▶ Exécuter pour lancer ton code.
▶ Indice

Remplace str(n % b) par symboles[n % b] : ça pioche directement le bon caractère (chiffre ou lettre).

▶ Voir la correction
def entier_vers_base(n, b):
    symboles = "0123456789ABCDEF"
    if n == 0:
        return '0'
    chiffres = []
    while n > 0:
        chiffres.append(symboles[n % b])
        n = n // b
    chiffres.reverse()
    return ''.join(chiffres)

⭐⭐⭐ NIVEAU AVANCÉ — vérifier avec les outils natifs

print(hex(335))
print(format(335, 'X'))
print(int('14F', 16))
▶ Voir la sortie attendue

Sortie attendue : 0x14f, puis 14F, puis 335. hex() ajoute le préfixe 0x ; format(n, 'X') donne des majuscules.

08 — Binaire ↔ Hexa

La méthode courte : paquets de 4 bits

Sur 4 bits, on représente exactement 2⁴ = 16 valeurs : chaque chiffre hexadécimal correspond donc exactement à un groupe de 4 bits.

Tableau de référence (à connaître par cœur, à terme)

DécimalBinaireHexadécimal
000000
100011
200102
300113
401004
501015
601106
701117
810008
910019
101010A
111011B
121100C
131101D
141110E
151111F
Binaire01001101
Décimal413
Hexadécimal4D

Donc (0100 1101)₂ = (4D)₁₆.

🔑 Notations Python
Python reconnaît nativement des écritures littérales pour changer de base : 0b pour le binaire (0b1101), 0x pour l'hexadécimal (0x1F), et — bonus — 0o pour l'octal / base 8 (0o17).
n = 0b01001101
print(format(n, 'X'))
print(format(0xB931, 'b'))
▶ Voir la sortie attendue

Sortie attendue : 4D puis 1011100100110001. 0b… et 0x… sont des écritures littérales reconnues directement par Python.

→ Fiche d'exercices : exercices 15 et 16.

09 — Exercices

Exercices progressifs

3 exercices de difficulté croissante. Réfléchis avant de consulter la correction !

⭐ Niveau 1 · Exercice 1
Conversions de base

Convertis en binaire : 9, 20, 50. Convertis en décimal : 1010₂, 11111₂.

▶ Voir la correction

9 = 1001₂ · 20 = 10100₂ · 50 = 110010₂
1010₂ = 10 · 11111₂ = 31

⭐⭐ Niveau 2 · Exercice 2
Prédire puis vérifier

Prédis puis exécute pour vérifier. Complète aussi la question sur 60 en binaire sur 8 bits.

Clique sur ▶ Exécuter pour lancer ton code.
▶ Voir la correction

format(45, '08b') → 00101101 · int('101010', 2) → 42
Et 60 = 00111100₂ (sur 8 bits).

⭐⭐⭐ Niveau 3 · Exercice 3
Poids binaire et puissances de 2

Complète poids_binaire(n) (nombre de bits à 1) puis est_puissance_de_deux(n), sans utiliser bin() ni format().

Clique sur ▶ Exécuter pour lancer ton code.
▶ Indice

entier_vers_binaire(n).count('1') compte directement les bits à 1. Une puissance de 2 s'écrit toujours avec un seul bit à 1.

▶ Voir la correction
def poids_binaire(n):
    return entier_vers_binaire(n).count('1')

def est_puissance_de_deux(n):
    return n > 0 and poids_binaire(n) == 1
10 — Checklist DST

Ce que tu dois maîtriser pour le DST

Coche une case par ligne — ta progression est enregistrée automatiquement sur cet appareil. Pour une notion « à revoir », reprends l'exemple guidé correspondant puis refais un exercice sans aide.

CompétenceSeulAvec aideÀ revoir
Convertir un binaire en décimal (somme des puissances de 2 où il y a un 1)
Convertir un décimal en binaire (divisions successives par 2, lecture des restes)
Savoir combien de valeurs on code avec n bits (2ⁿ), et l'intervalle (0 à 2ⁿ−1)
Convertir décimal ↔ hexadécimal (divisions/puissances de 16, symboles A-F)
Convertir binaire ↔ hexadécimal par paquets de 4 bits
Généraliser à une base b quelconque (formule Σ aᵢ × bⁱ, divisions successives par b)
Reconnaître et utiliser les notations Python 0b, 0x, 0o
Distinguer bin()/format(n,'b') (avec/sans préfixe 0b) et int(chaîne, base)
Écrire une fonction Python de conversion sans bin() ni format()
Expliquer pourquoi représentation et information ne sont pas la même chose

Mon prochain objectif :

🚨 Erreurs classiques à éviter
  • ❌ Oublier qu'un bit à 1 en position k pèse 2^k, pas k.
  • ❌ Confondre bin(n) (avec le préfixe 0b) et format(n, 'b') (sans préfixe).
  • ❌ Oublier de tester le dépassement de capacité sur un nombre de bits fixé.
  • ❌ Oublier d'inverser (lire de bas en haut) les restes obtenus par divisions successives.
  • ❌ Confondre la valeur d'un chiffre hexadécimal (A=10, F=15) avec sa position.
11 — Bonus

Convertisseur interactif

Entre un nombre dans une base, il se convertit automatiquement dans les autres — utile pour vérifier tes calculs à la main.

⇄
⇄

Modifie n'importe quel champ, les deux autres se mettent à jour automatiquement.

12 — QCM

Quiz interactif — Entiers naturels en base b

Banque de 52 questions. Choisissez le nombre de questions et lancez le tirage.

Nombre de questions :