Écrire un programme qui demande à l’utilisateur d'entrer un entier relatif ( donc positif ou négatif ) en base 10 et qui le convertit en nombre binaire en complément à deux.
Pour un entier positif :
le bit de signe est à 0, les bits suivants codent la valeur du nombre.
Pour un entier négatif :
on part de la représentation du nombre positif ( avec son bit de signe )
on inverse tous les bits ( 0 -> 1 et 1 -> 0 )
on ajoute 1 au nombre obtenu, en ne tenant pas compte de l'éventuelle dernière retenue
Pour les conversions d'une base en une autre, vous pouvez utiliser les fonctions intégrées à Python.
Mais il ne faut pas oublier que lors de la conversion base 10 → binaire, Python rajoute des caractères au début de la chaîne représentant le nombre binaire, en l'occurrence les caractères '0b', qui vont vous gêner dans votre travail. Pour les enlever, vous utiliserez la syntaxe suivante :
binaire = bin(base_10)[2:]
A l'inverse, lors d'une conversion binaire → base 10, il faut rajouter ces caractères !! Utilisez alors la syntaxe suivante :
base_10 = int('0b'+binaire, 2)
Vous testerez le bon fonctionnement de votre script, en lui faisant, réaliser, par exemple, l'addition du nombre entré par l'utilisateur et de son complément à deux ( que doit-on logiquement obtenir ?? ).
Écrire un programme qui demande à l’utilisateur d'entrer successivement deux valeurs binaires et qui effectue l'addition binaire de ces deux valeurs
Limitez-vous à l'addition de deux nombres binaires ayant le même nombre de bits ( 8 par exemple ).
Il n'est bien entendu pas question de convertir les valeurs pour en faire la somme, mais bien d'appliquer un algorithme bit-à-bit d'addition binaire...
Attention au problème de la retenue ! Réfléchissez bien sur papier à la manière dont vous allez la "traiter" et quels sont les différents cas possibles sur la valeur des deux bits à additionner.
b1 ← entrée utilisateur 1ère valeur binaire
b2 ← entrée utilisateur 2ème valeur binaire
pour chaque bit de b1 et b2, en partant du LSB jusqu'au MSB :
si la retenue précédente est nulle :
alors, selon la valeur des deux bits à additionner, en déduire leur addition et la nouvelle retenue
sinon si la retenue précédente est à 1 :
alors, selon la valeur des deux bits à additionner, en déduire leur addition et la nouvelle retenue
Vous allez devoir parcourir en même temps chaque bit des deux valeurs entrées par l'utilisateur; vous ne pourrez pas utiliser une structure du type for ... in ...
car elle ne "fonctionne" qu'avec
une seule structure itérable à la fois...( et en plus, il faut commencer par la fin...)
Vous allez donc devoir utiliser une boucle for ... in range(...)
, dont le compteur permettra de sélectionner l'index de chaque bit des deux valeurs binaires. A vous de déterminer les paramètres à
utiliser dans la fonction range()
.
Vous pouvez également utiliser une boucle while()
.
Retenue | Bit 1 | Bit 2 | Résultat ( y compris valeur de la retenue ! ) |
---|---|---|---|
0 | 0 | 0 | ? |
0 | 1 | 0 | ? |
0 | 0 | 1 | ? |
0 | 1 | 1 | ? |
1 | 0 | 0 | ? |
1 | 1 | 0 | ? |
1 | 0 | 1 | ? |
1 | 1 | 1 | ? |
Ce genre de figure s'appelle une table de vérité; vous aurez l'occasion d'en faire d'autres.