begin process at 2012 05 27 14:52:49
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > CONVERSION BINAIRE <> DECIMALE EFFICACE

CONVERSION BINAIRE <> DECIMALE EFFICACE


 Information sur la source

Note :
7 / 10 - par 1 personne
7,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Niveau :Débutant Date de création :14/07/2004 Vu :12 281

Auteur : kod32

Ecrire un message privé
Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note

 Description

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

  • /* 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;
  • }
/* 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/bina ire.html dont je me suis inspiré... (ça remplace largement les commentaires)


 Sources du même auteur

Source avec Zip Source avec une capture HASH MD5 D'UNE CHAINE OU D'UN FICHIER (DE TAILLE QUELCONQUES...
LES NOMBRES PREMIERS (CRIBLE D'ERATHOSTÈNE)
TRI D'ENTIER DANS L'ORDRE CROISSANT (TRISHELL)
IMPLÉMENTATION D'UNE PILE D'ENTIER
CONVERTION D'UNE CHAINE DE MJUSCULE EN MINUSCULE ET VICE VER...

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

Commentaire de djl le 14/07/2004 16:11:42

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) );

Commentaire de kod32 le 14/07/2004 16:18:06

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

Commentaire de djl le 14/07/2004 16:24:26

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;
}

Commentaire de vecchio56 le 14/07/2004 17:04:39 administrateur CS

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)

Commentaire de vecchio56 le 14/07/2004 17:06:35 administrateur CS

(décalage à droite pour la division: reste >>= 1)

Commentaire de maladedede le 02/09/2006 19:48:20

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

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,296 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales