Conversion binaire <> decimale efficace

Soyez le premier à donner votre avis sur cette source.

Snippet vu 14 237 fois - Téléchargée 30 fois

Contenu du snippet

Les deux fonctions de conversion binaire <> decimal. La conversion decimal -> bonaire implique de connaitre la taille du resultat binaire. On peut éviter ça en parcourant 2 fois le tableau (afin de connaitre la taille), mais j'optimise donc je laisse comme ça, à vous de l'adapter suivant vos besoins...

Source / Exemple :


/* Conversion binaire <-> decimale */

#include <stdio.h>

int bin2dec(char *bin)
{
    int dec = 0;
    while(*bin)
    {
        dec = (2 * dec) + (*bin - '0');
        bin++;
    }
    return dec;
}

void dec2bin(int dec, char *bin, int size)
{
    int reste = 1, i;
    for(i = (size-1); reste != 0; i--)
    {
        reste = dec / 2;

  • (bin+i) = (dec % 2) + '0';
dec = reste; }
  • (bin+(size)) = '\0';
return; } int main() { /* Conversion de 16 en décimal puis en binaire */ char buf[256]; printf("%d\n", bin2dec("10000")); dec2bin(16, buf, 5); printf("%s\n", buf); system("pause"); return 0; }

Conclusion :


Vous aurais surement vu ce type de fonction ailleurs sur le site mais j'ai codé la mienne perso pour plus de clarté. Pour les explications, voir l'algorithme de la page : http://gabriel.braun.free.fr/CoursInfo/Codage/binaire.html dont je me suis inspiré... (ça remplace largement les commentaires)

A voir également

Ajouter un commentaire Commentaires
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 12
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 12
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...
Afficher les 6 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.