Complément à 2⚓︎
Fonctions intermédiaires⚓︎
Pourquoi des fonctions intermédiaires ?
Afin de pouvoir implémenter l’addition et le complément à 2, il faut d’abord réaliser quelques fonctions qui seront nécessaires.
Le complément à 2 est effectué en plusieurs étapes. Découper ces étapes pour en faire des fonctions spécifiques permet d'avoir un code plus modulaire et lisible.
Exercice 3 : complément à 1
Écrire une fonction complement_a_1
qui prend en paramètre un texte nb_bin
correspondant à un nombre binaire et qui renvoie le complément à 1 de nb_bin
, c’est-à -dire l’inverse bit à bit.
>>> complement_a_1("0111")
'1000'
>>> complement_a_1("1011")
'0100'
>>> complement_a_1("00101110")
"11010001"
# Tests
(insensible Ă la casse)(Ctrl+I)
Parcourir une chaîne de droite à gauche
Pour faire les additions, on est obligé de parcourir les bits de droite à gauche. Voici différentes façons de parcourir une chaîne de droite à gauche :
def copie_inverse1(nb_bin):
res = ""
i = len(nb_bin) # (1)!
while i > 0: # (2)!
i = i - 1 # (3)!
res = nb_bin[i] + res # (4)!
return res
- On part avec l'indice après le dernier élément du texte.
- On continue tant que n'a pas atteint
0
. - On diminue tout de suite l'indice. Comme cela, on ira de
len(nb_bin)-1
Ă0
. - Le symbole que l'on regarde est
nb_bin[i]
.
def copie_inverse2(nb_bin):
res = ""
for i in range(len(nb_bin)-1, -1, -1): # (1)!
res = nb_bin[i] + res # (2)!
return res
- On va partir de
len(nb_bin)-1
pour aller jusqu'Ă-1
en s'arrĂŞtant juste avant (donc Ă0
) en diminuant de 1 Ă chaque tour de boucle. - Le symbole que l'on regarde est
nb_bin[i]
.
def copie_inverse2(nb_bin):
res = ""
for i in range(len(nb_bin)): # (1)!
res = nb_bin[len(nb_bin)-1-i] + res # (2)!
return res
i
va aller de0
Ălen(nb_bin)-1
.- Le symbole que l'on regarde est
nb_bin[len(nb_bin)-1-i]
. Les indices vont donc aller delen(nb_bin)-1
Ă0
.
Exercice 4 : plus 1
Écrire une fonction ajouter_1
qui prend en paramètre un texte nb_bin
correspondant Ă un nombre binaire et qui renvoie le nombre binaire correspondant Ă nb_gin + 1
. Le nombre de bits du résultat n’est pas augmenté par rappor à nb_bin
. S’il reste une retenue à la fin, elle n’est pas ajoutée à gauche. Il faut parcourir les bits de droite à gauche.
Indications
- Vous pouvez utiliser une variable
retenue
que vous initialiserez Ă"1"
avant de rentrer dans la boucle. - On peut remarquer que tant qu’il y a une retenue, il faut modifier les bits de
nb_bin
, alors qu’on ne change plus rien dès qu’il n’y a plus de retenue.
>>> ajouter_1("0000")
'0001'
>>> ajouter_1("1011")
'1100'
>>> ajouter_1("1111")
'0000'
# Tests
(insensible Ă la casse)(Ctrl+I)
# Tests
(insensible Ă la casse)(Ctrl+I)
Complément à 2⚓︎
Exercice 5 : complément à 2
Écrire une fonction complement_a_2
qui prend en paramètre un texte nb_bin
correspondant à un nombre binaire et qui renvoie le nombre binaire correspondant au complément à 2 de ce nombre.
Indications
- Vous pouvez décommenter les deux lignes de
print
pour tester votre fonction. - Il faut utiliser
complement_a_1
etajouter_1
.
>>> complement_a_2("0011")
'1101'
>>> complement_a_2("1101")
'0011'
# Tests
(insensible Ă la casse)(Ctrl+I)
# Tests
(insensible Ă la casse)(Ctrl+I)
Exercice 6 : complément à 2 vers entier relatif
Écrire une fonction compl_a_2_vers_entier
qui prend en paramètre un texte nb_bin
correspondant à un nombre binaire en complément à 2 et qui renvoie l'entier relatif correspondant.
Indications
Il faut utiliser complement_a_2
et bin_vers_entier
.
>>> compl_a_2_vers_entier("0011")
3
>>> compl_a_2_vers_entier("1101")
-3
>>> compl_a_2_vers_entier("01001111")
79
>>> compl_a_2_vers_entier("10001101")
-115
# Tests
(insensible Ă la casse)(Ctrl+I)
# Tests
(insensible Ă la casse)(Ctrl+I)
Exercice 7 : entier relatif vers complément à 2
Écrire une fonction entier_compl_a_2_vers
qui prend en paramètres un entier relatif nb_entier
et un entier taille
, et qui renvoie le texte nb_bin
correspondant au nombre nb_entier
exprimé en complément à 2 sur taille
bits
Indications
- Puisqu'on veut un nombre de
taille
bits, on va fairetaille
tours de boucles qui qu'il arrive. - Vous pouvez vous inspirer de
entier_vers_bin
.
>>> entier_vers_compl_a_2(3, 4)
"0011"
>>> entier_vers_compl_a_2(-3, 4)
"1101"
# Tests
(insensible Ă la casse)(Ctrl+I)
# Tests
(insensible Ă la casse)(Ctrl+I)
# Tests
(insensible Ă la casse)(Ctrl+I)