IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

conversion entier -> binaire


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut conversion entier -> binaire
    Salut!

    J'essai de faire une conversion d'entier en binaire sur 32 bits, le prog demande d'entrer un entier, il le convertir en binaire, puis affiche le resultat de la conversion du bit de poids le plus fort (a gauche) au bit de poids le plus faible (a droite)

    J'affiche en ligne par bloc de 4 bit pour faciliter la lecture, mais il y a un problème sur le 10eme bit en partant de la droite; si il n'est pas affecté il prend la valeur 135089, mais si l'entier depasse 512 c'est ok.

    Que faire?

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    #include<stdlib.h>
    #include<stdio.h>
     
    int* bin(int e1)
    {
       int* t;
       unsigned long c,e; 
       int i,k,j; 
     
       k=0; c=0;i=0;
     
       e=e1;
       t=(int*)malloc(32); 
       c=e/2;
     
       while(c!=0)
       {
          t[i]=e%2; 
          i++;
     
          e=c;
          c=e/2;
       }
       t[i]=e;
     
       printf("\nLa valeur binaire de %lu est enregistree:\n",e1);
       printf("\n");
     
       for(j=31;j>=0;j--)
       { 
          if(k==4)
          {
             printf(" ");
             k=0;
             printf("%d",t[j]);
          }
          else
             printf("%d",t[j]);
          k++;
       }
       printf("\n");   
       return t;
    }
     
    main()
    {
       int i,k,z;
       int* tab;
     
       tab=(int*)malloc(32); 
       k=0;
       printf("Entrer la valeur d'un entier a convertir en binaire:\n");
       scanf("%d", &z);
     
       tab=bin(z);
     
       printf("et elle vaut:\n");
     
       for(i=31;i>=0;i--)
       {
          if(k==4)
          {
             printf(" ");
             k=0;
             printf("%d",tab[i]);
          }
          else
             printf("%d",tab[i]);
          k++;
       }   
       printf("\n");
    }

    voici ce que ca donne qd je le lance pour les valeurs 0, 511 et 512:

    Entrer la valeur d'un entier a convertir en binaire:
    0

    La valeur binaire de 0 est enregistree:

    0000 0000 0000 0000 0000 001350890 0000 0000
    et elle vaut:
    0000 0000 0000 0000 0000 001350890 0000 0000


    Entrer la valeur d'un entier a convertir en binaire:
    511

    La valeur binaire de 511 est enregistree:

    0000 0000 0000 0000 0000 001350891 1111 1111
    et elle vaut:
    0000 0000 0000 0000 0000 001350891 1111 1111


    Entrer la valeur d'un entier a convertir en binaire:
    512

    La valeur binaire de 512 est enregistree:

    0000 0000 0000 0000 0000 0010 0000 0000
    et elle vaut:
    0000 0000 0000 0000 0000 0010 0000 0000

    Merci ^^

  2. #2
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    Salut, tu as essayé d'utiliser calloc au lieu de malloc? ca met tous les bits à 0.

    Sinon, dans ton main, tu n'as pas besoin de faire malloc, vu que tu récupères juste un tableau déjà alloué. Là ca cause une fuite de mémoire.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut re
    je viens d'essayer un calloc

    t=(int*)calloc(32,sizeof(char))

    et j'ai enlevé le malloc du main, ca change la valeur de l'erreur = 135129 mais il y en a toujours une

    sinon c'est la première fois que je post, je ne sais pas ce que sont des balises...

    merci pour ta reponse

  4. #4
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Jette un coup d'oeil la dessus pour commencer
    http://emmanuel-delahaye.developpez....tes.htm#malloc

  5. #5
    Membre très actif

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Par défaut
    salut

    moi je l'écrirais comme cela ton programme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    #include <stdio.h>
    int main() {
      int n;
      int i;
      char c;
      entree:
      puts("entrez un nombre : ");
      if (!scanf("%d",&n)) {
         while((c = getchar()) != '\n' && c != EOF);
         goto entree;
      }
      for (i = sizeof (int) * 8 - 1; i > 0 ; i--) {
        if (n & (1<<i)) {
            putchar('1');
            if (!(i & 3)) putchar(' ');
            i--;
            break;
        }
      }
      for (; i >= 0; i--) {
         if (n & (1<<i)) putchar('1');
         else putchar('0');
         if (!(i & 3)) putchar(' ');
      }
      putchar('\n');
      return 0;
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut
    j'ai lu le cours sur malloc et j'ai essayé de faire des modifications (avec ou sans cast ...) ca ne change rien,

    sinon le code que tu me donne marche mais j'ai besoin d'avoir acces au resultat sous forme d'un tableau 1D de 32 cases (1bit par case) et d'afficher les 32 bits.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Déjà je te conseille de ne pas utiliser d'allocation dynamique, utilise plutôt un tableau statique déclaré dans le main et passé en paramètre de ta fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void toBin(int n, int tab[]);
     
    int main(void)
    {
        int resultat[32] = {0}; // tout le tableau est initialisé à zéro
        int monEntier;
     
        // du code
     
        toBin(monEntier, resultat);
     
        // affichage du tableau resultat.
    }
    Je te conseille aussi de faire un code beaucoup plus concis et simple, parce que moi j'ai pu faire un code moitié moins long que le tien, même en retirant beaucoup de retours à la ligne inutiles dans ton code.

  8. #8
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    la c'est un tableau de 32 chars. Pour des int ca serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       t=(int*)calloc(32*sizeof(int));

  9. #9
    Membre Expert Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Par défaut
    Citation Envoyé par nicolas.sitbon Voir le message
    Jette un coup d'oeil la dessus pour commencer
    http://emmanuel-delahaye.developpez....tes.htm#malloc

  10. #10
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Le cast est inutile pour commencer. Ensuite, calloc() prend deux arguments : la taille d'un élément et le nombre d'éléments consécutifs à allouer. Là tu parles du cas de malloc().
    Cependant, comme la taille du tableau ne change pas, je recommande un tableau statique dans le main passé en paramètre de la fonction de conversion.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut
    le probleme s'un void c'est que je peux pas retourner de tableau avec (je crois)

    ce que je veux faire c'est un tableau de 32 cases (1 case par bit)

  12. #12
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Tu passes le tableau en paramètre, la fonction modifie le tableau et toi tu lis le tableau dans ta fonction main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void toBin(int n, int tab[])
    {
        // modification de tab selon n
    }
     
    int main(void)
    {
        int n, tab[32] = {0};
     
        // récupération de n auprès de l'utilisateur
        toBin(n, tab);
     
        // affichage de n
    }
    Toutes les fonctions ne retournent pas quelque chose et peuvent quand même modifier des données de la fonction appelante.

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut
    Code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    #include<stdlib.h>
    #include<stdio.h>
     
     
    void  bin(int e1,int tab[])
    {unsigned long c,e; 
      int i,k,j; 
      k=0; c=0;i=0;
    e=e1;
      c=e/2; 
      while(c!=0)
        {
          tab[i]=e%2; 
          i++;
          e=c;
          c=e/2;
        }
      tab[i]=e;
       printf("\nLa valeur binaire de %lu est enregistree:\n",e1);
       printf("\n");
      for(j=31;j>=0;j--)
        {    if(k==4)
    	{
    	  printf(" ");
    	  k=0;
    	  printf("%d",tab[j]);
    	}
          else
    	printf("%d",tab[j]);
          k++;
        }
      printf("\n");   
     
    }
     
    main()
    {
      int i,k,z;
      int tab[32];
      k=0;
      printf("Entrer la valeur d'un entier a convertir en binaire:\n");
      scanf("%d", &z);
     
      bin(z,tab);
     
      printf("et elle vaut:\n");
     
      for(i=31;i>=0;i--)
        {
          if(k==4)
    	{
    	  printf(" ");
    	  k=0;
    	  printf("%d",tab[i]);
    	}
          else
    	printf("%d",tab[i]);
        k++;
        }   
      printf("\n");
     
    }
    j'ai essayé ca marche toujours pas, la c'est pire il renvoi n'importe quoi

  14. #14
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    cherche la différence

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include<stdlib.h>
    #include<stdio.h>
     
     
    void  bin(int e1,int tab[])
    {unsigned long c,e; 
      int i,k,j; 
      k=0; c=0;i=0;
    e=e1;
      c=e/2; 
      while(c!=0)
        {
          tab[i]=e%2; 
          i++;
          e=c;
          c=e/2;
        }
      tab[i]=e;
       printf("\nLa valeur binaire de %d est enregistree:\n",e1);
       printf("\n");
      for(j=31;j>=0;j--)
        {    if(k==4)
    	{
    	  printf(" ");
    	  k=0;
    	  printf("%d",tab[j]);
    	}
          else
    	printf("%d",tab[j]);
          k++;
        }
      printf("\n");   
     
    }
     
    int main()
    {
      int i,k,z;
      int tab[32] = {0};
      k=0;
      printf("Entrer la valeur d'un entier a convertir en binaire:\n");
      scanf("%d", &z);
     
      bin(z,tab);
     
      printf("et elle vaut:\n");
     
      for(i=31;i>=0;i--)
        {
          if(k==4)
    	{
    	  printf(" ");
    	  k=0;
    	  printf("%d",tab[i]);
    	}
          else
    	printf("%d",tab[i]);
        k++;
        }   
      printf("\n");
      return 0;
    }
    int tab[32] = {0};

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Quand on programme n'importe comment, c'est normal que ça fasse n'importe quoi. Regarde 3 lignes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void toBin(int n, int tab[])
    {
        int i;
     
        for(i = 0; i < 32; i++)
            tab[i] = (n >> (31 - i)) & 0x1;
    }
    Bon, j'explique cette ligne : (n >> (31 - i)) & 0x1.

    L'opérateur >> permet de décaler les bits de droite à gauche du nombre de bits indiqué après, par exemple :

    0100 1101 >> 2 = 0001 0011.

    Donc, on prend notre nombre n, et on décale les bits vers la gauche, le premier chiffre, c'est-à-dire celui de poids fort va se retrouver dans tab[0].

    L'opérateur & c'est l'opérateur de ET bit-à-bit, dans le nombre de gauche et de droite, si les deux bits de même poids sont à 1, le bit de même poids du résultat sera à 1, sinon à 0, exemple :

    0000 1111 & 0101 0101 = 0000 0101.

    Donc, ici, & 0x1 (ou & 1 c'est pareil), permet de ne garder que le bit de poids faible qui correspond au bit qu'on va mettre dans tab[i].

  16. #16
    Membre Expert
    Avatar de coyotte507
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 327
    Par défaut
    son programme marche.

    Il a juste oublié le = {0}, et j'ai du remplacer un %ul par un %d dans le printf, c'est tout.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut
    merci coyotte!!

    je savais pas qu'il fallait initialiser le tableau ^^

    j'ai pas mis de "int" devant main() mais ca marche qd meme

    sinon pour le ET bit a bit je ne vois pas bien a quoi ca aurait pu servir...

    enfin bref, c'est fini pour ce probleme, je reviendrai surement avec beaucoup d'autre, vu que je commence a peine mon projet C...

    A+!

  18. #18
    Membre chevronné
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    309
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 309
    Par défaut
    Imaginons que tu veuilles transformer le nombre 1958, son code binaire c'est sur 16 bits :
    0000 0111 1010 0110
    Lorsque tu vas faire le décalage pour les 5 bits de poids forts, tu vas avoir à chaque fois le nombre 0, donc là il n'y a pas de problème. Pour le bit suivant pareil, sauf que tu auras 1, mais à la 7ème itération (i == 6), tu vas décaler de 9 bits vers la gauche, ce qui donnera :
    0000 0000 0000 0011
    Si tu affectes directement cette valeur à la case correspondante dans ton tableau, tu auras le nombre "2" dans cette case, et non pas 1, donc on utilise le ET bit-à-bit pour en fait ne garder que le 1.
    C'est ce que tu fais avec ton % 2.

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 26
    Par défaut
    ah ok j'avais pas compris ca, merci en tout cas !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Conversion entier en binaire
    Par philippe6 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 02/09/2011, 11h23
  2. Conversion d'entier en binaire sur 2 caractères
    Par seiryujay dans le forum C#
    Réponses: 2
    Dernier message: 10/07/2009, 14h51
  3. Conversion entiers longs > binaire
    Par Fabiani dans le forum VB.NET
    Réponses: 3
    Dernier message: 21/02/2009, 01h55
  4. [debutant][hexadecimal]Conversion entier hexadecimal
    Par Mobaladje dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 14/05/2004, 07h50
  5. Affichage d'entiers en binaire.
    Par Tifauv' dans le forum C
    Réponses: 4
    Dernier message: 08/12/2003, 20h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo