DEC-BINAIRE: 1 LIGNE!

Signaler
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/10804-dec-binaire-1-ligne

yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
17
Pourquoi ne pas rajouter la version avec complément à deux ? Pour avoir les représenations des négatifs aussi.
Pour bypasser la récursion faire

static bool neg = false;
static int param = n;
si param < 0
si neg = false;
neg = true
inverser tous les bits de param avec not (~)
rajouter 1 à ce résultat (complément à 2)
fin si
ton code avec param
fin si
else
code normal avec n positif
fin
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
JCDjcd, tu sais bien que je ne me prends pas pour la SERNAM.
cs_JCDjcd
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
2
Heu ... bof bof :
sizeof(int)*CHAR_BIT pour etre le plus protable possible !
JackosKing
Messages postés
168
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
21 avril 2005

oups... :p
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
sizeof(int)*8
cs_NiFF
Messages postés
92
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
24 juin 2004

Non sizeof ne donne pas le nombre de bits
JackosKing
Messages postés
168
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
21 avril 2005

déjà en indentant, ca fait plus qu'une ligne:p
void Dec2Bin(int n)
{
if(0!=n)
Dec2Bin(n/2);
printf("%1d",n & 1);
}

bon sinon je propose:

DecToBin(int x)
{
int i = sizeof(int);
while(i--) // optimise en dbf (enfin faut espérer..)
putchar( (char)(x>>i)&1 + '0' );
}
cs_NiFF
Messages postés
92
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
24 juin 2004

Hé ben ça m'étonne mais il faut bien reconnaitre que c'est récursif.
Je le commente rapidos:

_n$ = 8
?Dec2Bin@@YAXH@Z PROC NEAR ;début de procédure
push esi ; on sauve esi
mov esi, DWORD PTR _n$[esp] ;esi prend la valeur n
test esi, esi; si esi=0 alors
je SHORT $L55536; on va à fin:
mov eax, esi; eax=esi
cdq; convertit le mot signé EAX en un quadruple mot dans EDX:EAX
sub eax, edx ; eax= eax-edx . Pourquoi faire?
sar eax, 1; division par deux de eax
push eax; mis en paramètre sur la pile
call ?Dec2Bin@@YAXH@Z ; appel récursif
and esi, 1; esi=0+1=1
push esi; esi sur la pile pour affichage
push OFFSET FLAT:??_C@_03GNGPFOOL@?$CF1d?$AA@
call _printf; affichage
add esp, 12; aucune idée ???
fin:
pop esi; on libère la pile
ret 0; retour 0
?Dec2Bin@@YAXH@Z ENDP; fin

bien joué quand même, et c'est bizarre qu'il distingue deux cas. Il faudrait essayer en optimisant en vitesse ou en taille. Je crois même me souvenir que VS 2003 a une option de dérécursification. À vérifier...
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
Le compilo a genere ce qui est ecrit comme code et pas autre chose.
En enlevant le sprintf, ok il avait enleve la recursion mais avec le sprintf nenni !
Compilo = VS 2003

_n$ = 8
?Dec2Bin@@YAXH@Z PROC NEAR
push esi
mov esi, DWORD PTR _n$[esp]
test esi, esi
je SHORT $L55536
mov eax, esi
cdq
sub eax, edx
sar eax, 1
push eax
call ?Dec2Bin@@YAXH@Z
and esi, 1
push esi
push OFFSET FLAT:??_C@_03GNGPFOOL@?$CF1d?$AA@
call _printf
add esp, 12
$L55536:
pop esi
ret 0
?Dec2Bin@@YAXH@Z ENDP
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
ben pour vous mettre d'accord recompile et demande la sortie asm au compilo. Tu nous fais un copier coller ici du bloc asm de la fonction et on jugera sur pieces.
cs_NiFF
Messages postés
92
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
24 juin 2004

JCDjcd>>Le compilateur n'est pas cense etre Intelligent... il ne faut pas compter dessus !

Un compilateur ne peut pas générer du code récursif, et il sait reconnaitre une fonction récursive et la dérécursifier, notamment à l'aide de piles.
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
oui JackosKing mais la tu peux y compter, le compilo en bon automate stupide ne le ratera pas.
JackosKing
Messages postés
168
Date d'inscription
mardi 31 décembre 2002
Statut
Membre
Dernière intervention
21 avril 2005

de meme n/2 sera optimisé en n>>1, mais bon...
cs_JCDjcd
Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
2
Le compilateur n'est pas cense etre Intelligent... il ne faut pas compter dessus !
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
C'est l'empilage de param qui est long compare a de l'iteratif ou il n'y en a pas.
Ma remarque etait destinee surtout aux debutants, il vaut toujours mieux leur preciser les avantages et inconvenients.
cs_NiFF
Messages postés
92
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
24 juin 2004

Chacun optimise son code comme il le souhaite, et u développeur peut avoir de très bonnes raisons d'économiser de la place. Ce code est court au niveau C, mais il est possible qu'il soit plus long compilé. Pour ce qui est de la vitesse, les appels récursifs sont souvent dérécursifiés par le compilateur, et les décalages de bits (division) et les masques sont assez rapides.

Le but de ce code n'est pas de proposer quelque chose de plus court à écrire, mais d'expliquer la technique qui peut être utilisée ici.
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
Le but d'un prog n'etant pas que le developpeur ait le moins de lignes a ecrire, je ne conseillerais donc pas l'emploi de ta methode qui s'avere beaucoup plus lente qu'un decalage de bit iteratif.