Convertsseur binaire/decimal aide svp

steph064 Messages postés 90 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 10 juin 2009 - 31 déc. 2008 à 11:32
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.

15 réponses

NHenry Messages postés 15129 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 juin 2024 159
31 déc. 2008 à 12:12
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
0
steph064 Messages postés 90 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 10 juin 2009
31 déc. 2008 à 12:18
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.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
31 déc. 2008 à 12:29
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 
0
NHenry Messages postés 15129 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 juin 2024 159
31 déc. 2008 à 12:36
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Mikaels35 Messages postés 146 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 17 novembre 2009 2
31 déc. 2008 à 12:38
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

@+
0
NHenry Messages postés 15129 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 juin 2024 159
31 déc. 2008 à 12:38
Bonjour,

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

Erreur de calcul ?

http://nhen0039.chez-alice.fr/index.php
0
NHenry Messages postés 15129 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 juin 2024 159
31 déc. 2008 à 12:40
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
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
31 déc. 2008 à 12:50
Salut
Le binaire se lit de droite à gauche, voilà ton erreur.
Le bit de poids faible (2^0) est à droite
0
steph064 Messages postés 90 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 10 juin 2009
31 déc. 2008 à 12:55
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 ^^)
0
Mikaels35 Messages postés 146 Date d'inscription dimanche 23 janvier 2005 Statut Membre Dernière intervention 17 novembre 2009 2
31 déc. 2008 à 12:56
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 !

@+
0
steph064 Messages postés 90 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 10 juin 2009
31 déc. 2008 à 13:05
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)
0
NHenry Messages postés 15129 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 juin 2024 159
31 déc. 2008 à 13:13
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
0
steph064 Messages postés 90 Date d'inscription mardi 30 décembre 2008 Statut Membre Dernière intervention 10 juin 2009
31 déc. 2008 à 13:15
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 ????
0
NHenry Messages postés 15129 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 juin 2024 159
31 déc. 2008 à 13:30
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
0
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
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.
0
Rejoignez-nous