j'ai rajouté qq lignes pour éliminer les 0 superflus, ça fonctionne plustôt bien sauf avec qq valeurs : 1, 2, 10, 100010 ect
la conversion est correcte mais la chaine retournée est plus longue que nécéssaire ...
si quelqu'un a une idée
Code : Tout sélectionner
Procedure.s Binaire32b(decimal.l)
resultat.s=""
MOV eax,[esp]
MOV ebx,[esp+4]
MOV ecx,1
XOR dh,dh ; initialisation de l'indicateur du premier bit à 1
; permettra de ne pas porter une chaine de 0 précedent
; la conversion
CLC ; mise à 0 de cf
bouclefor:
CMP ecx,32
JA l_finbouclefor
XOR dl,dl ; mise à 0 de dl
RCL eax,1 ; extraction du ecx ième bit
ADC dl,0 ; dl <-- 0 + cf
; teste si dl=o et dh=0 alors décrémente ebx et sauter vers saute:
CMP dh,0
JNZ l_sortietest ; si dh<>0 sotir du test sinon instruction suivante
CMP dl,0
JNZ l_sortietest ; si dl<>0 sortir du test sinon instruction suivante
DEC ebx ; si on arrive ici c'est que dl et dh sont nuls
JMP l_saute ; permettra d'éliminer les 0 inutiles en début de chaine
sortietest:
CMP dl,0
JE l_ajout0
MOV dh, 1 ; mise à 1 de dh tous les bits suivants seront pris en compte
MOV byte [ebx-1+ecx], 49 ; 49 ascii de 1
JMP l_saute
ajout0:
MOV byte [ebx-1+ecx], 48 ; ascii de 0
saute:
INC ecx
JMP l_bouclefor
finbouclefor:
ProcedureReturn resultat
EndProcedure
OpenConsole()
PrintN ("entrez un nombre de type long: ")
valeur.l=Val(Input())
PrintN("")
PrintN(Binaire32b(valeur))
PrintN("longueur de la chaine retournee: "+Str(Len(binaire32b(valeur))))
Input()
PrintN("avec la fonction PureBasic Bin")
PrintN(Bin(valeur))
PrintN("longueur de la chaine retournee par Bin: "+Str(Len(Bin(valeur))))
Input()
CloseConsole()
Debug binaire32b(valeur)
Debug "longueur de la chaine retournee: "+Str(Len(binaire32b(valeur)))
Debug "avec la fonction PureBasic Bin"+Bin(valeur)
Debug "longueur de la chaine retournee par Bin: "+Str(Len(Bin(valeur)))
End
Code : Tout sélectionner
ADC dl,0 ; dl <-- 0 + cf
voilà voilà