Programmons☘
Important
Le travail de cette page est facultative.
Le travail de cette page vous permettra:
- de mieux comprendre le principe du complément à deux en codant.
- de vous exercer à la programmation et de réviser des codes python déjà vus (le principe de la division en cascade et la manipulation de chaînes de caractères notamment).
Faisons le point:
le principe du code complément à deux sur n bits permet de représenter les entiers m tels que -2^{n-1} \leqslant m \leqslant 2^{n-1}-1:
- les entiers m tels que 0 \leqslant m \leqslant 2^{n-1}-1 sont représentés par leur écriture binaire usuelle (avec au moins un 0 à gauche)
- les entiers m tels que -2^{n-1} \leqslant m \leqslant -1 sont représentés par l' écriture binaire usuelle de l'entier m + 2^n (le bit de gauche est toujours 1).
Exercice 1☘
Écrire un code possible pour le corps de la fonction python suivante:
def codeComplementA2(entier, longueur):
"""
longueur -- entier naturel au moins égal à 2
entier -- entier relatif représentable en complément à 2 sur longueur bits.
renvoie la chaîne de caractère correspondant au code complément à 2 sur longueur bits
de l'entier.
>>> codeComplementA2(-6, 8)
1111 1010
>>> codeComplementA2(-32767, 16)
1000 0000 0000 0001
>>> codeComplementA2(32767, 16)
0111 1111 1111 1111
>>> codeComplementA2(32768, 16)
AssertionError: Entier non représentable sur 16 bits.
"""
Un code possible
Un code possible.
On a introduit d'autres fonctions pour décomposer le code.
Rappelons que tous vos programmes devront être ainsi décomposés en petites unités fonctionnelles.
def codeBinaire(entier):
"""
entier -- entier naturel
renvoie la chaîne de caractères correspondant
à l'écriture binaire de entier.
"""
if entier == 0: return '0'
chaine = ''
while entier != 0:
chaine = str(entier % 2) + chaine
entier = entier//2
return chaine
def completeCode(entier, longueur):
"""
longueur -- entier > 1.
entier -- entier naturel, de code binaire
ayant au plus longueur chiffre.
renvoie la chaîne du code binaire (de type str) de entier
complétée à gauche par des 0 pour que la longueur
de ce code soit exactement de longueur longueur.
"""
code = codeBinaire(entier)
lg = len(code)
for _ in range(longueur - lg):
code = '0' + code
return code
def augmentLisibilite(code):
"""
code -- chaine de caractères de longueur multiple de 4.
renvoie la chaîne en insérant un blanc tous les 4 caractères.
"""
chaine = ''
for i, c in enumerate(code):
if (i+1)%4 == 0:
chaine = chaine + c + ' '
else:
chaine = chaine + c
return chaine
def codeComplementA2(entier, longueur):
"""
longueur -- entier naturel au moins égal à 2
entier -- entier relatif représentable
en complément à 2 sur longueur bits.
renvoie la chaîne de caractère correspondant
au code complément à 2 sur longueur bits
de l'entier.
>>> codeComplementA2(-6, 8)
'1111 1010 '
>>> codeComplementA2(-32767, 16)
'1000 0000 0000 0001 '
>>> codeComplementA2(32767, 16)
'0111 1111 1111 1111 '
codeComplementA2(32768, 16) donnera:
AssertionError: Entier non représentable sur 16 bits.
"""
assert -2**(longueur-1) <= entier < 2**(longueur-1), f"Entier non représentable sur {longueur} bits."
if -2**(longueur-1) <= entier < 0:
entier = entier + 2**longueur
return augmentLisibilite(completeCode(entier, longueur))