Convertsseur binaire/decimal aide svp

Messages postés
90
Date d'inscription
mardi 30 décembre 2008
Statut
Membre
Dernière intervention
10 juin 2009
- - Dernière réponse : steph064
Messages postés
90
Date d'inscription
mardi 30 décembre 2008
Statut
Membre
Dernière intervention
10 juin 2009
- 1 janv. 2009 à 12:05
J'ai un problème avec mon convertisseur binaire/décimal et je ne trouve pas pourquoi, théoriquement il devrait marcher:

Sub Bin_Dec() 'convertisseur decimal sur 8 bits
Dim TableauBin(9) As String, dec As Integer, bit As String, cpt As Integer, puiss2 As Integer, variable As Integer
cpt = 1
variable = 0
TableauBin(0) = "rien"
number = "11001011" '=203
bit = Mid(number, 1, 1)

While cpt <> 9 'met chaque 1 et 0 de "number" dans un tableau allant de 1 à 8 (normalement ça marche)
TableauBin(cpt) = Mid(number, cpt, 1)
cpt = cpt + 1
Wend

For cpt = 1 To 8
    If TableauBin(cpt) = "1" Then 'si la valeur dans la case du tableau est 1 alors je la fait correspondre à une puissance de 2 (marche)
    TableauBin(cpt) = 2 ^ (cpt - 1)
    End Ifdec dec + 1 * val(TableauBin(cpt)) 'calcul faisant la conversion qiui me donne: dec 211 et non 203
Next

MsgBox "le nombre decimal est : " & dec
End Sub

Si vous trouvez pourquoi, faites le moi savoir ^^' merci.
Afficher la suite 

15 réponses

Messages postés
14590
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 novembre 2019
137
0
Merci
Bonjour,

Quel est ton pb ?
Tu peux regardes dans la section VB6 de mon site et sur mon profil CS (sources VB6), j'ai fais un convertisseur Binaire (réfléchi et normal), BCD, Octal, Décimal et Hexadécimal.

http://nhen0039.chez-alice.fr/index.php
Commenter la réponse de NHenry
Messages postés
90
Date d'inscription
mardi 30 décembre 2008
Statut
Membre
Dernière intervention
10 juin 2009
0
Merci
J'ai besoin de ce petit programme pour trouver un sous-réseau en fait.
Normalement il ne me reste plus qu'à convertir le binaire en décimal et j'ai mon sous-réseau. Mais mon convertisseur marche mal.
Le truc c'est qu'au lieu de trouver 203 pour 11001011 mon programme
trouve 211, parfois il trouve + d'autrefois il trouve - que ce qu'il
doit trouver. Je trouve ça bizarre.
Commenter la réponse de steph064
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
18
0
Merci
Bonjour,

Juste pour ton information :
 la traduction en binaire de 203 est 1 1 1 0 1 0 0 1 et non 1 1 0 0 1  0 1 1 
Commenter la réponse de jmfmarques
Messages postés
14590
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 novembre 2019
137
0
Merci
Bonjour,

(au code, je suppose que tu es débutant)

Un conseil INDISPENSABLE, mets SYSTEMATIQUEMENT "Option Explicit" en première ligne de tes modules de code, cela t'évitera d'avoir certaines erreurs.

Préfère utiliser des Long à la place des Integer, cela améliorera les performances.

Evite le plus possible les déclaration Dim comme tu l'a fait, cela rend la lecture du code plus difficile.

Indente mieux ton code (tabulations).

Préfère utiliser Do..Loop à While..Wend, plus souple et plus lisible.

Tu dimensionnes ton tableau à 10 élément pour en utiliser 8, change ta déclaration en Dim TableauBin(1 to 8)

Essaye ce code :

Option Explicit

Sub Bin_Dec() 'convertisseur decimal sur 8 bits
Dim lNumber As String
Dim lResult As Long

lNumber = "11001011" '=203

lNumber = Right$(String(8, "0") & lNumber, 8)

lResult = 0
Do While Len(lNumber) > 0
    lResult = lResult * 2 + CInt(Left$(lNumber, 1))
    lNumber = Right$(lNumber, Len(lNumber) - 1)
Loop

MsgBox lResult
End Sub

http://nhen0039.chez-alice.fr/index.php
Commenter la réponse de NHenry
Messages postés
146
Date d'inscription
dimanche 23 janvier 2005
Statut
Membre
Dernière intervention
17 novembre 2009
0
Merci
Salut

Tu rentres les valeurs dans le tableau en commençant par le bit de poids fort et tu calcules en commençant par lui donc avec i=1 tu auras 2^0 cad 1 au lieu de 2^7 = 128 !


Il faut faire : TableauBin(cpt) = 2 ^ (8 - cpt)

Sinon est-tu obligé de passer par un tableau et de faire des tas de calculs inutiles ?

Car il y a plus rapîde

Private Function  Bin2Dec(c As String) As Integer  ' ou Long pour des valeurs plus grandes éventuellement
Dim  i%
For i = 1 To Len(c)    If Mid$(c, i, 1) "1" Then Bin2Dec  Bin2Dec + 2 ^ (Len(c) - i)
Next i
End Function

MsgBox Bin2Dec ( "11001011") par exemple -> 203

-> Jmfmarques  203 est bien  1 1 0 0 1  0 1 1  et pas 11101001= 233

@+
Commenter la réponse de Mikaels35
Messages postés
14590
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 novembre 2019
137
0
Merci
Bonjour,

[../auteur/JMFMARQUES/615490.aspx jmfmarques]
ça me donne (calculatrice Windows) : 203 -> 11001011

Erreur de calcul ?

http://nhen0039.chez-alice.fr/index.php
Commenter la réponse de NHenry
Messages postés
14590
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 novembre 2019
137
0
Merci
Bonjour,

[../auteur/MIKAELS35/431079.aspx Mikaels35]
Dim  i%
est moins évident que
Dim i as Integer

Et comme dit dans un post précédent, préfère les Long.

http://nhen0039.chez-alice.fr/index.php
Commenter la réponse de NHenry
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
61
0
Merci
Salut
Le binaire se lit de droite à gauche, voilà ton erreur.
Le bit de poids faible (2^0) est à droite
Commenter la réponse de cs_Jack
Messages postés
90
Date d'inscription
mardi 30 décembre 2008
Statut
Membre
Dernière intervention
10 juin 2009
0
Merci
1_Oui je suis débutant
2_J'ai pas tout compris:

"lNumber = Right$(String(8, "0") & lNumber, 8)"

à quoi correspond le $ après le Right (je connais la fonction right) ?
Pourquoi mettre 8 "0" devant la valeur de 1Number ? (j'ai supprimé "lNumber = Right$(String(8, "0") & lNumber, 8)", le résultat est le même)

Expliquez moi votre calcul svp:
"    lResult = lResult * 2 + CInt(Left$(lNumber, 1))
     lNumber = Right$(lNumber, Len(lNumber) - 1)  "

3_Je retiendrai vos précieux conseils ^^, mais à quoi correspond: "Option Explicit"
lapin compris ???
Merci
(Je sais je suis lourd mais j'aime comprendre ce que j'écris ^^)
Commenter la réponse de steph064
Messages postés
146
Date d'inscription
dimanche 23 janvier 2005
Statut
Membre
Dernière intervention
17 novembre 2009
0
Merci
NHenry
 c'est juste pour l'exemple, après chacun fait comme il veut !

On n'est pas là pour polémiquer sur la façon d'écrire mais pour aider les gens !

Je lui ai indiqué l'erreur qu'il commettait dans son programme et montré un exemple simplifié pour obtenir le même résultat avec la possibilité de traiter éventuellement les nombres binaires de plus de 15 bits avec un Long justement !

Amicalement

Jack  c'est bien l'erreur que je lui précisais !

@+
Commenter la réponse de Mikaels35
Messages postés
90
Date d'inscription
mardi 30 décembre 2008
Statut
Membre
Dernière intervention
10 juin 2009
0
Merci
Hum, bon vu que des posts ce sont rajoutés entre le moment où j'ai écris ^^', je v mettre à jour ma réponse.


1_Oui je suis débutant et je sais pas si il y a plus court, si il y a
plus cour tant mieux, je ne demande qu'à apprendre, je fais mon prog
avec les petites connaissances que j'ai déjà.



2_NHenry, ton code marche, mais je n'ai pas tout compris:



"lNumber = Right$(String(8, "0") & lNumber, 8)"



à quoi correspond le $ après le Right (je connais la fonction right) ?


Pourquoi
mettre 8 "0" devant la valeur de 1Number ? (j'ai supprimé "lNumber =
Right$(String(8, "0") & lNumber, 8)", le résultat est le même)



Expliquez moi ton calcul stp:


"    lResult = lResult * 2 + CInt(Left$(lNumber, 1))


     lNumber = Right$(lNumber, Len(lNumber) - 1)  "



3_Je retiendrai vos précieux conseils ^^, mais à quoi correspond: "Option explicit " ?
lapin compris ???
Merci

(je sais je suis lourd mais j'aime comprendre ce que j'écris)
Commenter la réponse de steph064
Messages postés
14590
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 novembre 2019
137
0
Merci
Bonjour,

[../auteur/MIKAELS35/431079.aspx Mikaels35]
Pas de mal, c'était pour info.

[../auteur/STEPH064/1566158.aspx steph064]
Le $ force à avoir un String en sortie, c'est plus "propre".

lNumber = Right$(String(8, "0") & lNumber, 8)

Force à avoir uniquement 8 caractères, en complétant ou supprimant des caractères au besoin.

Le calcul :
"    lResult = lResult * 2 + CInt(Left$(lNumber, 1))
     lNumber = Right$(lNumber, Len(lNumber) - 1)  "

En clair, on prend les chiffres du plus significatif (MSB) au moins significatif (LSB), donc pour avoir la valeur, on fait, ValeurPrecedente=ValeurPrecedente*2 + BitLePlusSignificatif DeLaChaine
Et ensuite, on retire le caractère le plus significatif de la chaine, comme ça jusqu'à plus soif.

En Debug :

lNumber="11001011"
Valeur=0

Etape 1 :


Valeur=Valeur*2+"1"


Valeur=0*2+1=1


lNumber="1001011"


Etape 2 :


Valeur=Valeur*2+"1"


Valeur=1*2+1=3


lNumber="001011"

Etape 3 :


Valeur=Valeur*2+"0"


Valeur=3*2+0=6


lNumber="01011"


Etape 4 :


Valeur=Valeur*2+"0"


Valeur=6*2+0=12


lNumber="1011"


Etape 5 :


Valeur=Valeur*2+"1"


Valeur=12*2+1=25


lNumber="011"


Etape 6 :


Valeur=Valeur*2+"0"


Valeur=25*2+0=50


lNumber="11"


Etape 7 :


Valeur=Valeur*2+"1"


Valeur=50*2+1=101


lNumber="1"


Etape 8 :


Valeur=Valeur*2+"1"


Valeur=101*2+1=203


lNumber=""

et pour finir : Option Explicit te force à déclarer les variables, cela limite les erreurs dû à des fautes de frappes.

http://nhen0039.chez-alice.fr/index.php
Commenter la réponse de NHenry
Messages postés
90
Date d'inscription
mardi 30 décembre 2008
Statut
Membre
Dernière intervention
10 juin 2009
0
Merci
En fait:
lResult = lResult * 2 + CInt(Left$(lNumber, 1))
lNumber = Right$(lNumber, Len(lNumber) - 1)

donne:
boucle 1: 1Result = 0*2 + 1
boucle 2: 1Result = 1 * 2 + 1
boucle 3: 1Result = 3 *2 + 0
...
C'est pas supposé être fait avec des puissances de 2 additionées ???
ex: 1101 donne: 1*2^0 + 0*2^1 + 1*2^2 + 1*2^3 soit 1*1 + 0*2 + 1*4 + 1*8

La pin compris ????
Commenter la réponse de steph064
Messages postés
14590
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
11 novembre 2019
137
0
Merci
Bonjour,

Si ça le fait, mais de manière implicite :
11001011 :
((((((((1)*2+1)*2+0)*2+0)*2+1)*2+0)*2+1)*2+1)
(((((((3)*2+0)*2+0)*2+1)*2+0)*2+1)*2+1)
((((((6)*2+0)*2+1)*2+0)*2+1)*2+1)

(((((12)*2+1)*2+0)*2+1)*2+1)


((((25)*2+0)*2+1)*2+1)




(((50)*2+1)*2+1)







((101)*2+1)











(203)

Etand la première ligne et tu verra, ça aura la forme en ^2 comme tu le veux.

Autre exemple d'implémentation :

En version récursive :


Function Bin2Dec(byval pValBin as string) as long

if len(pValBin )=0 then

    Bin2Dec=0

else

    Bin2Dec=cint(right$(pvalbin,1))+Bin2Dec(left$(pValBin,len(pValBin)-1))*2

end if

End Function


Plus concis que le précédent, mais un peu plus difficile à comprendre
pour un novice (exécutes le en pas à pas, tu verra ce que ça fait).

ça fonctionne sur le même principe :

11001011 :
On l'inverse (sens de lecture) : 11010011
(1+2*(1+2*(0+2*(1+2*(0+2*(0+2*(1+2*(1))))))))
(1+2*(1+2*(0+2*(1+2*(0+2*(0+2*(3)))))))

(1+2*(1+2*(0+2*(1+2*(0+2*(6))))))



(1+2*(1+2*(0+2*(1+2*(12)))))






(1+2*(1+2*(0+2*(25))))










(1+2*(1+2*(50)))















(1+2*(101))





















(203)

Essaye de faire le calcul à la main, peut être que tu comprendra mieux.

http://nhen0039.chez-alice.fr/index.php
Commenter la réponse de NHenry
Messages postés
90
Date d'inscription
mardi 30 décembre 2008
Statut
Membre
Dernière intervention
10 juin 2009
0
Merci
Ok, merci !!!! j'ai quand même gardé mon ancien code, je le comprends mieux et mon prof le comprendra mieux aussi certainement, mais je le garde pour pouvoir l'étudier plus tard ^^, mes codes sont ptet long mais je débute et je sais pas comment les raccourcir, mes connaissances ne sont pas suffisantes encore.

Merci à tous.
Commenter la réponse de steph064