CONVERSION BINAIRE <> DECIMALE EFFICACE

cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 - 14 juil. 2004 à 16:11
 Utilisateur anonyme - 2 sept. 2006 à 19:48
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/24539-conversion-binaire-decimale-efficace

Utilisateur anonyme
2 sept. 2006 à 19:48
C'est un bon code vrément éfficace ;)

J'aurais rajouté memset(bin, '0', size); au debut de la fonction dec2bin.
Parceque défois avec printf on obtient une zone non initialisé
puis la convertion binaire: "%^$*'(è-011001"
avec le memset on aura toujours: "0000000011001"
++
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 juil. 2004 à 17:06
(décalage à droite pour la division: reste >>= 1)
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
14 juil. 2004 à 17:04
reste = dec / 2;
peut être plus rapide (je sais pas) si on met
reste = dec;
reste <<= 1;

et pour (dec % 2) je ferais (dec & 0x00000001)
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
14 juil. 2004 à 16:24
et ca ca peut pas le faire ?

char *dec2bin(int dec, char *bin, size_t size)
{
int reste = 1;
size_t i = size-1;
char *ptr=bin + size-1;

while( i-- != 0)
{
reste = dec / 2;
*ptr-- = (dec % 2) + '0';
dec = reste;
}
*(bin+(size)) = '\0';
return bin;
}
kod32 Messages postés 46 Date d'inscription mercredi 5 mai 2004 Statut Membre Dernière intervention 13 novembre 2004
14 juil. 2004 à 16:18
>> "pour *(bin+i), utilise plutot un pointeur que tu incremente et remplace le for par un while"

J'y ai pensé mais je fais une décrémentation dans le for(), d'où la nécessité de partir de connaitre la taille pour pouvoir partir de la fin du tableau. Pour comprendre l'interet de ce parcour de tableau en sens inverse, se référer à l'algorithme de la page citée...
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
14 juil. 2004 à 16:11
par rapport à printf/sprintf, c'est quoi le gain de performance ?

pour optimiser, peut etre qu'il vaut mieux utiliser size_t au lieu de int ( c'est à verifier)

il faut aussi precalculer certains truc
(size-1) est evaluer à chaque tour de boucle
pour *(bin+i), utilise plutot un pointeur que tu incremente et remplace le for par un while


ca serait plus pratique si dec2bin retournait l'adresse de la chaine

char *dec2bin(int dec, char *bin, int size)
{
...
return bin;
}

tu pourrais faire directement
printf("%s\n", dec2bin(16, buf, 5) );
Rejoignez-nous