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és6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 14 juil. 2004 à 17:06
(décalage à droite pour la division: reste >>= 1)
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 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és3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 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és46Date d'inscriptionmercredi 5 mai 2004StatutMembreDernière intervention13 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és3011Date d'inscriptionjeudi 26 septembre 2002StatutMembreDernière intervention27 novembre 20047 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
2 sept. 2006 à 19:48
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"
++
14 juil. 2004 à 17:06
14 juil. 2004 à 17:04
peut être plus rapide (je sais pas) si on met
reste = dec;
reste <<= 1;
et pour (dec % 2) je ferais (dec & 0x00000001)
14 juil. 2004 à 16:24
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;
}
14 juil. 2004 à 16:18
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...
14 juil. 2004 à 16:11
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) );