Le code de Gray numérote les entiers de sorte que deux valeurs…
Exercice supplémentaire · niveau 3 (difficile) · NSI (première), chapitre 1 — Représenter les entiers · D'autres bases, d'autres codages
Énoncé
Le code de Gray numérote les entiers de sorte que deux valeurs consécutives ne diffèrent que d'un seul bit. On l'obtient par , où est le « ou exclusif » bit à bit et le décalage à droite. Construire les codes sur bits et vérifier la propriété, y compris entre le dernier et le premier.
Corrigé
def gray(n):
"""Code de Gray de n, sous forme d'entier."""
return n ^ (n >> 1)
codes = [vers_base(gray(n), 2).rjust(4, "0") for n in range(16)]
for i in range(1, 16):
diff = sum(1 for a, b in zip(codes[i - 1], codes[i]) if a != b)
assert diff == 1
assert len(set(codes)) == 16
Les huit premiers codes sont 0000, 0001, 0011, 0010, 0110, 0111, 0101, 0100.
Deux propriétés vérifiées. Un seul bit change à chaque pas (les assertions passent), et les codes sont deux à deux distincts : c'est bien une numérotation des entiers de à , pas seulement une suite. De plus, 1000 (dernier) et 0000 (premier) ne diffèrent aussi que d'un bit : le code est cyclique.
À quoi cela sert. Sur un codeur de position mécanique, lire un compteur binaire au moment exact où plusieurs bits basculent donne une valeur aberrante : entre et , les quatre bits changent, et une lecture mal synchronisée peut rendre n'importe quoi. Avec le code de Gray, un seul bit change : au pire on lit l'ancienne ou la nouvelle valeur, jamais une valeur fantaisiste.
Prolongement : , et sont les opérateurs binaires de Python, hors programme en première mais omniprésents en informatique embarquée.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.