steph064
Messages postés90Date d'inscriptionmardi 30 décembre 2008StatutMembreDernière intervention10 juin 2009
-
31 déc. 2008 à 11:32
steph064
Messages postés90Date d'inscriptionmardi 30 décembre 2008StatutMembreDernière intervention10 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.
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 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.
steph064
Messages postés90Date d'inscriptionmardi 30 décembre 2008StatutMembreDernière intervention10 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.
Mikaels35
Messages postés146Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention17 novembre 20092 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
steph064
Messages postés90Date d'inscriptionmardi 30 décembre 2008StatutMembreDernière intervention10 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)
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 ^^)
Mikaels35
Messages postés146Date d'inscriptiondimanche 23 janvier 2005StatutMembreDernière intervention17 novembre 20092 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 !
steph064
Messages postés90Date d'inscriptionmardi 30 décembre 2008StatutMembreDernière intervention10 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)
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.
NHenry
Messages postés15113Date d'inscriptionvendredi 14 mars 2003StatutModérateurDernière intervention22 avril 2024159 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.
steph064
Messages postés90Date d'inscriptionmardi 30 décembre 2008StatutMembreDernière intervention10 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.