Conversion binaire <> decimale efficace

Soyez le premier à donner votre avis sur cette source.

Snippet vu 13 977 fois - Téléchargée 29 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
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"
++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
(décalage à droite pour la division: reste >>= 1)
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
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)
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
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;
}
Messages postés
46
Date d'inscription
mercredi 5 mai 2004
Statut
Membre
Dernière intervention
13 novembre 2004

>> "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.