Conversion hexa => binaire

péon -  
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
je souhaite réaliser une fonction de conversion d'un nombre hexa en binaire. pour ça j'utilise une chaine de caractere hexadecimal[] et une chaine de caractere binaire[]. voila comment j'ai amorcé ma fonction:

int binaire2(char *hexadecimal){

char *hexa[16]={
"0000",
"0001",
"0010",
"0011",
"0100",
"0101",
"0110",
"0111",
"1000",
"1001",
"1010",
"1011",
"1100",
"1101",
"1110",
"1111",};
char binaire[32];
int i=0;

j'avais l'idee de parcourir ma chaine caractere par caractere et selon le caractere lu , associer le nombre binaire "correspondant" que j'ai prealablement rentré dans un tableau de chaine de caractere *hexa[].

exemple: if( hexadecimal[0]==2) { binaire="0010"}
.....
if (hexadecimal[1]==5) { ajouter à binaire "0101"}

mais cela me semble très complique voir impossible. mais je n'ai pas d'autre idee. Pouvez vous m'aider, car cela fait beaucoup de temps que je suis dessus et je n'arrive pas a avancer?merci d'avance
A voir également:

4 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,
Effectivement tu te compliques la vie ;)
Tout débord, une petite remarque sur ton code :
char *hexa[16]={...}

Mettre *hexa[] suffit. Pas besoin de calculer ;)

Sinon côté algo, il ne faut pas sous-estimer la machine en matière de calcul et de boucle.
Pour effectuer ta conversion, je te propose l'algo suivant :
L'utilisateur entre son nombre en hexa dans une chaine.
La machine mets dans un integer la variable de l'utilisateur (conversion possible avec sscanf et de %x).
Ensuite simple problème de boucle pour convertir en binaire.
Si tu comptes avoir des grands nombres, je te conseille de passer par une chaîne de caractère que tu alloueras dynamiquement en fonction du nombre (la plus grande puissance de 2). Utilise plutôt les boucles que le log de la bibliothèque math.h.
Et ensuite, une petite boucle toute bête : chaine = la chaine allouée dynamiquement, Variable = le nombre converti et i vaut l'indice maximale de la chaine (taille - 1).
TantQue Variable >0 Faire
   chaine[i]<-Variable % 2
   Variable=Variable/2
   i=i-1;
FinFaire

Si t'as des questions, n'hésite pas.
Cdlt
1
gorekhaa Messages postés 66 Date d'inscription   Statut Membre Dernière intervention   3
 
Salut,

du carton, des ciseaux, un stylo et un cerveau... Tu te fabriques une règle (tu pourras meme faire la conversion en octal si tu veux...)

Réfléchis, tu trouveras... Un petit indice: ça coulisse...

Pour les plans de la règle, un jour peut-etre...


Aller, bon découpage



@+








0
péon
 
Merci d'avoir pris le temps de me répondre mais je ne comprends pas très bien l'algo. J'ai l'impression que vous faites une conversion de decimal à binaire. Etant donné mon faible niveau , je sais que l'erreur vient probablement de moi et pas de votre algo.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Je te donne une implémentation de mon code. Tu comprendras peut-être mieux l'algorithme.
#include <stdio.h>
#include <stdlib.h>

char* conv(int nbHexa){
    char *bin;
    int i;
    size_t taille;
    if(nbHexa<0) return NULL;

    i=1;
    taille=0;
    while(i<=nbHexa){
        i<<=1;
        taille++;
    }
    if(taille==0) taille=1;
    if((bin=malloc(taille))==NULL) return NULL;
    if(nbHexa==0) bin[0]='0';
    while(nbHexa>0){
        bin[--taille]=nbHexa%2+'0';
        nbHexa>>=1;
    }

    return bin;
}     


int main(void){
    int nbHexa;
    char *bin;
    puts("Nombre :");
    scanf("%x",&nbHexa);
    printf("Conversion en binaire :%s\n",bin=conv(nbHexa));
    free(bin);bin=NULL;

    return 0;
}


Cdlt
0