Decimal relatif vers binaire
RésoluBonjour,
j'ai donc essayé de compléter mon 3ème programme.
Voici la consigne :
Compléter la fonction dec_to_bin_relatif permettant de convertir un nombre décimal entier relatif en nombre binaire relatif.
- On se limitera aux entiers relatifs codés sur 4 bits !
- il est fortement conseillé d'utliser la méthode du complément à 2 donnée dans le cours.
- vous pouvez appeler (utiliser) les fonctions que vous avez codées au-dessus.
- la valeur absolue d'un nombre (nombre sans le signe) s'obtient par la méthode abs() : par exemple abs(-6) renvoie 6
- le nombre au format binaire sera déclaré par une chaîne de caractères
Voici le programme à compléter :
def dec_to_bin_relatif(relatif):
# si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut.
if ... :
...
# sinon (relatif est un négatif) j'utilise la méthode complément à DEUX.
else:
# calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut.
binaire=...
# ecriture du complément à UN (on inverse les bits)
inverse=""
for i in binaire :
if i == "0" :
inverse=...
else:
inverse=...
# écriture du complémént à DEUX (on fait +1)
binaire=""
retenue="1" # c'est notre +1
for j in range(...): # attention, parcours de droite à gauche !!!
if inverse[j]=="0":
binaire=...
retenue=...
elif inverse[j]=="1" and retenue=="1":
binaire=...
retenue=...
else:
binaire=...
retenue=...
return binaire
# Les lignes ci-dessous testent votre code... n'y touchez pas !
# Si une AssertionError apparaît... c'est que votre code n'est pas bon...
assert dec_to_bin_relatif(-6) == '1010'
assert dec_to_bin_relatif(-1) == '1111'
assert dec_to_bin_relatif(3) == '0011'
Et voici ce que j'ai pu faire :
def dec_to_bin_relatif(relatif):
relatif=-10
# si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut.
if relatif > 0 :
binaire = dec_to_bin(relatif)
# sinon (relatif est un négatif) j'utilise la méthode complément à DEUX.
else:
# calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut.
binaire = dec_to_bin(abs(relatif))
print(binaire)
# ecriture du complément à UN (on inverse les bits)
inverse=""
for i in binaire :
if i == "0" :
inverse= i + inverse
else:
inverse= "1" + i + inverse
print(binaire)
# écriture du complémént à DEUX (on fait +1)
binaire=""
retenue="1" # c'est notre +1
for j in range(len(binaire),-1): # attention, parcours de droite à gauche !!!
if inverse[j]=="0":
binaire=binaire+"1"
retenue="0"
elif inverse[j]=="1" and retenue=="1":
binaire=binaire+"0"
retenue="1"
else:
binaire=binaire+"1"
retenue="0"
print(binaire)
return binaire
# Les lignes ci-dessous testent votre code... n'y touchez pas !
# Si une AssertionError apparaît... c'est que votre code n'est pas bon...
assert dec_to_bin_relatif(-6) == '1010'
assert dec_to_bin_relatif(-1) == '1111'
assert dec_to_bin_relatif(3) == '0011'
Je sais que j'ai un problème au niveau de la ligne 20 et 22, quand je veux inverser mon binaire, je ne comprends pourquoi on vient mettre notre valeur dans la variable inverse et comment cela va faire évoluer notre variable binaire, pour l'inversion que j'ai pu faire je me suis aidée d'une aide qu'on avait au-dessus de l'exercice disant :
Inversion d'une chaine de caractère "abcdef" → "fedcba" :
- Parcours de gauche à droite :
txt="abcdef"
inverse=""
for i in txt :
inverse = i + inverse
txt
>> "fedcba"
- Parcours de droite à gauche :
txt="abcdef"
inverse=""
for i in range(len(txt)-1,-1,-1) :
inverse = inverse + txt[i]
txt
>> "fedcba"
Je sais aussi qu'il y a un ou des problèmes au niveau de mon complément à deux de la ligne 29 à 38, je ne comprends pas vraiment la notation inverse [j], je l'ai comprise dans le sens de si dans inverse j'ai un 0 alors je lui rajoute la retenue, sinon si dans inverse j'ai un 1 et ma retenue est de 1 alors le binaire donne 0 (1+1) et la retenue donne 1 et sinon le binaire donne 1 et la retenue 0 mais je ne suis vraiment pas sur de cela. Et aussi je ne comprends pas pourquoi lorsque je veux afficher la valeur de mon binaire après le complément à deux, je n'y arrive pas.
Merci beaucoup de votre aide
Windows / Edge 107.0.1418.26
4 réponses
Conversion d'un entier relatif en binaire sur 4 bits en utilisant le complément à deux, avec des exemples pour -6, -1 et 3. Plusieurs propositions expliquent que le positif peut appeler directement une fonction dec_to_bin, tandis que le négatif nécessite d'inverser les bits puis d'ajouter 1, en veillant à une longueur de 4 bits. Des difficultés portent sur l'ordre de concaténation lors de l'inversion, l'usage de l'indice inverse[j], et la gestion de la retenue dans la boucle d'addition finale. Des échanges portent également sur des corrections et des tests unitaires, notamment pour vérifier les cas -6, -1 et 3 avec des résultats attendus comme 1010, 1111 et 0011.
-
Modérateur
Bonjour,
Comme la fois précédente, tu devrais essayer de convertir le décimal relatif en binaire relatif à la main, avant d'écrire le code. Voir ce message où je faisais un exemple hier : https://forums.commentcamarche.net/forum/affich-37721776-nombre-binaire#7 Par ailleurs, tu es partie sur une mauvaise piste pour l'inversion des bits, on ne change pas leur position comme dans l'inversion des caractères d'une chaine, on change juste la valeur de chaque bit 1==>0, 0==>1, 1010 ==> 0101 ; 0100 ==> >1011
J'ai vu que tu as mis des print ;-) plutôt de dans la fonction mettre relatif=-10 tu devrais, pour les tests, avant les assert (moi je les mets en commentaire), mettre un print(dec_to_bin_relatif(-10))
-
J'ai bien commencé à convertir mon décimal à la main mais je n'ai pas dû réussir à le retranscrire au niveau du code.
Pour ce qui est de l'inversion j'aurai mis cela du coup:
# ecriture du complément à UN (on inverse les bits) inverse="" for i in binaire : if i == "0" : inverse= "1" else: inverse= "0"je l'aurais vu comme si c'est un 0 on mets un 1 sinon on met un 0 mais je vois que ça ne marche pas.
Pour ce qui est du print(dec_to_bin_relatif(-10)) j'ai essayé de le mettre mais il ne marche pas, je n'ai sûrement pas dû faire de la bonne manière.
def dec_to_bin_relatif(relatif): # si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut. if relatif > 0 : binaire = dec_to_bin(relatif) # sinon (relatif est un négatif) j'utilise la méthode complément à DEUX. else: # calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut. binaire = dec_to_bin(abs(relatif)) # ecriture du complément à UN (on inverse les bits) inverse="" for i in binaire : if i == "0" : inverse= "1" else: inverse= "0" # écriture du complémént à DEUX (on fait +1) binaire="" retenue="1" # c'est notre +1 for j in range(len(binaire),-1): # attention, parcours de droite à gauche !!! if inverse[j]=="0": binaire=binaire+"1" retenue="0" elif inverse[j]=="1" and retenue=="1": binaire=binaire+"0" retenue="1" else: binaire=binaire+"1" retenue="0" return binaire print(dec_to_bin_relatif(-10)) # Les lignes ci-dessous testent votre code... n'y touchez pas ! # Si une AssertionError apparaît... c'est que votre code n'est pas bon... assert dec_to_bin_relatif(-6) == '1010' assert dec_to_bin_relatif(-1) == '1111' assert dec_to_bin_relatif(3) == '0011'
-
-
Modérateur
Attention, sur 4 bits, on ne peut pas coder -10, sur 4 bits on va de -8 à +7, donc tester -6
Pour l'inverse, il ne faut pas oublier de cumuler : inverse=inverse+"1"
print(dec_to_bin_relatif(-6)) fonctionne pour moi, c'est peut être ton environnement ? essaye
result=dec_to_bin_relatif(-6) print(result)
-
J'ai copié ce que vous avez écrit à la fin de mon programme et la seule donnée que j'ai à la fin c'est l'erreur.
def dec_to_bin_relatif(relatif): # si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut. if relatif > 0 : binaire = dec_to_bin(relatif) # sinon (relatif est un négatif) j'utilise la méthode complément à DEUX. else: # calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut. binaire = dec_to_bin(abs(relatif)) # ecriture du complément à UN (on inverse les bits) inverse="" for i in binaire : if i == "0" : inverse= "1" else: inverse= "0" # écriture du complémént à DEUX (on fait +1) binaire="" retenue="1" # c'est notre +1 for j in range(len(binaire),-1): # attention, parcours de droite à gauche !!! if inverse[j]=="0": binaire=binaire+"1" retenue="0" elif inverse[j]=="1" and retenue=="1": binaire=binaire+"0" retenue="1" else: binaire=binaire+"1" retenue="0" return binaire result=dec_to_bin_relatif(-6) print(result) # Les lignes ci-dessous testent votre code... n'y touchez pas ! # Si une AssertionError apparaît... c'est que votre code n'est pas bon... assert dec_to_bin_relatif(-6) == '1010' assert dec_to_bin_relatif(-1) == '1111'Traceback (most recent call last): File "<input>", line 41, in <module> AssertionError
-
Modérateur@Lilou
je pense que c'est ton environnement de développement, mets les assert en commentaire, ou
met un print de binaire avant le return
tu devrais aussi faire un print de j dans ta boucle, tu verras un soucis
-
@jee pee
d'accord merci beaucoup je regarde ceci dans les jours à venir.
-
@jee pee
Bonjour,
J'ai pu retravailler mon programme et voici ce que ça donne. Il reste toujours faux mais je ne comprends pas pourquoi mon binaire n'évolue pas et je ne suis pas sûr de ce que j'ai pu faire pour l'inverse.
Merci
def dec_to_bin_relatif(relatif): binaire=-6 # si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut. if relatif > 0 : binaire = dec_to_bin(relatif) # sinon (relatif est un négatif) j'utilise la méthode complément à DEUX. else: # calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut. binaire = dec_to_bin(abs(relatif)) # ecriture du complément à UN (on inverse les bits) inverse="" for i in binaire : if i == "0" : inverse= "1" + inverse else: inverse= "0" + inverse print("inverse :",inverse) # écriture du complémént à DEUX (on fait +1) binaire="" retenue="1" # c'est notre +1 for j in range(len(binaire),-1,-1): # attention, parcours de droite à gauche !!! if inverse[j]=="0": binaire= retenue + binaire retenue="0" elif inverse[j]=="1" and retenue=="1": binaire="0"+ binaire retenue="1" else: binaire="1"+ binaire retenue="0" print("binaire :",binaire) return binaire # Les lignes ci-dessous testent votre code... n'y touchez pas ! # Si une AssertionError apparaît... c'est que votre code n'est pas bon... assert dec_to_bin_relatif(-6) == '1010' assert dec_to_bin_relatif(-1) == '1111' assert dec_to_bin_relatif(3) == '0011'inverse : 1001 binaire : 0
Traceback (most recent call last): File "<input>", line 42, in <module> AssertionError
-
Modérateur@Lilou
déjà ta ligne 3 n'a pas de sens ;-) peut être relatif ?
en 26, binaire initialisé 2 lignes au dessus vaut "", donc il ne se passe rien
en 15 et 17 la concaténation n'est pas dans le bon sens
-
-
Malheureusement il doit y avoir encore une autre faute quelque part car mon binaire pour -6 est bien 1010 mais j'ai quand même une erreur.
def dec_to_bin_relatif(relatif): relatif=-6 # si relatif est un positif alors j'utilise directement la fonction dec_to_bin() définie plus haut. if relatif > 0 : binaire = dec_to_bin(relatif) # sinon (relatif est un négatif) j'utilise la méthode complément à DEUX. else: # calcul du binaire de la valeur absolue en utilisant la fonction dec_to_bin() définie plus haut. binaire = dec_to_bin(abs(relatif)) # ecriture du complément à UN (on inverse les bits) inverse="" for i in binaire : if i == "0" : inverse= inverse + "1" else: inverse= inverse + "0" print("inverse :",inverse) # écriture du complémént à DEUX (on fait +1) binaire="" retenue="1" # c'est notre +1 for j in range(len(inverse)-1,-1,-1): # attention, parcours de droite à gauche !!! if inverse[j]=="0": binaire= retenue + binaire retenue="0" elif inverse[j]=="1" and retenue=="1": binaire="0"+ binaire retenue="1" else: binaire="1"+ binaire retenue="0" print("binaire :",binaire) return binaire # Les lignes ci-dessous testent votre code... n'y touchez pas ! # Si une AssertionError apparaît... c'est que votre code n'est pas bon... assert dec_to_bin_relatif(-6) == '1010' assert dec_to_bin_relatif(-1) == '1111' assert dec_to_bin_relatif(3) == '0011'inverse : 1001 binaire : 1010 inverse : 1001 binaire : 1010
Traceback (most recent call last): File "<input>", line 42, in <module> AssertionError
-
-
@jee pee
ah oui c'est vrai merci beaucoup de l'aide
-
-
6 = 110 qui devrait être 0110 pour être positif.
Tu devras donc ajouter "0" à la gauche de la chaîne.
Son complément à 1 est donc 1001 qui est bien négatif.Si on fait la somme à partir des bits les moins significatifs: 1001 + 1 = 1010