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 d'un nombre en binaire


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 33
    Points : 20
    Points
    20
    Par défaut conversion d'un nombre en binaire
    Bonjour j'ai un éxo tout simple à faire (quoi que )
    un utilisateur doit rentrer un nombre , jusque là , ca va
    apres je dois afficher ce nombre en binaire , là c'est plus compliqué , quelqu'un aurait il une idée de comment il faut faire ?

    Merki beaucoup

  2. #2
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    C'est assez simple : commence par allouer (de façon automatique si possible) une chaîne de caractères assez grande, disons 32 ou 64 caractères, tous initialisés avec le caractère '0' (mais il existe une solution plus portable).

    Ensuite, dans une boucle, tu dois, à chaque itération, tester l'état du bit de poids le plus faible (en faisant un ET binaire grâce à l'opérateur & et le nombre 1) : si le résultat du ET binaire est 0, tu ne fais rien, sinon, tu mets le caractère '1' dans la chaîne, au bon endroit. Enfin, tu décales tous les bits vers la droite du nombre entré au clavier d'une place à l'aide de l'opérateur >>.

    C'est facile, non ? Et en C, on peut programmer ça en deux coups de cuillère à pot !

  3. #3
    Rédacteur

    Profil pro
    Étudiant
    Inscrit en
    Juin 2004
    Messages
    113
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2004
    Messages : 113
    Points : 276
    Points
    276
    Par défaut
    Avant tout, fais-le à la main, après ça sera facile d'écrire le code.
    Après, montre-nous ton code.
    Regarde ici : http://herea.soft.free.fr/Mag/Dossie...itecturePC.htm

  4. #4
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    tu connais la methode des restes de division par 2 ?

  5. #5
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    c'est quand meme un peu compliqué ton explication ^^

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kamouminator
    c'est quand meme un peu compliqué ton explication ^^
    On attend la tienne...

  7. #7
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Je ne vois pas comment faire plus simple, sans utiliser de divisions et d'opérations modulo. En fait, le code, lui, est extrêmement court.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    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
    #include <stdio.h>
     
    void prog()
    {
       int i;
     
       printf("rentrez la valeur du nombre\t");
       scanf("%d\n"&i);
       char* abcdefgh;
       if ((i%2)==0)
       {
          //h=0
       else 
          //h=1
          //on passe au caractere suivant 
          //on teste si (i/2) %2 == 0
          // et ainsi de suite ...
    }

  9. #9
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    Tiens, je poste ici un bout de code... un schéma vaut mille explications !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /*
    bla bla bla
    */
     
    for(i = 0; i < 32; i ++)
    {
        resultat[i] += (x & 1); /* Yes ! I really do like parenthesis ! Functionnal programming rules ! */
        x >>= 1;
    }
     
    /*
    bla bla bla
    */

  10. #10
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    Je ne vois pas comment faire plus simple, sans utiliser de divisions et d'opérations modulo. En fait, le code, lui, est extrêmement court.
    pourquoi on pourrai pas utiliser les modulos ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    je précise tout de meme que j'ai un niveau de débutant , donc les malloc et cie , j'en ai pas besoin ^^

  12. #12
    Membre éprouvé
    Avatar de InOCamlWeTrust
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 036
    Points : 1 284
    Points
    1 284
    Par défaut
    C'est pour ça que je te disais d'allouer ta chaîne de caractères de façon automatique, aussi parce qu'elle est de taille fixe et déterminée à la compilation, un truc dans le genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char resultat[32 + 1]; /* on n'oublie pas le caractère de fin, hein ! */
    Avec ton char *, tu ne serais pas allé bien loin si tu refuses de faire appel à malloc, qui lui aussi est assez coûteux en termes de temps de calcul, surtout pour les gros blocs, avec la GLibC, les autres, j'ai pas regardé le code.

    Pour ce qui est des modulos : ça pue ! Il faut utiliser la division et l'opération modulo uniquement lorsque l'on ne peut vraiment pas faire autrement. De plus, il est toujours préférable de remplacer les multiplications et les divisions par des puissances de 2 par des décalages.

    Une division et un modulo c'est prohibitif en termes de temps de calcul ; sur un x86 (Pentium et dérivés), une division entière prend en général 40 à 60 fois plus de temps qu'un décalage... et une multiplication une dizaine de fois le temps d'une addition (mais ça dépend énormément, les AMD possédant une multiplication très rapide).

    Et le calcul d'un cosinus... tu oublies !

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    n'y aurait il pas une lettre à mettre comme \d pour un nombre décimal \o pour un octal ... pour l'equivalent en binaire ...

  14. #14
    Membre averti
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Points : 354
    Points
    354
    Par défaut
    la facilité, y'a que ca de vrai hein ? ^^

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 33
    Points : 20
    Points
    20
    Par défaut
    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
     
    #include <stdio.h>
     
    char *en_binaire(int nombre)
    {
             int i,j;
             char binaire[32+1];
             binaire[32]='\0'; //Caractère de fin de chaîne
             i=0; //Compteur de décalage de bits
             j=31;  //Emplacement dans la chaine "binaire", on part de la fin
     
             while(i<32)
             {
                     /* On déplace chaque bit de vers la droite i puis on regarde si
                           le premier bit après le décalage est égal à 1. Le décalage
                           permet de déplacer chaque bit à la première position 
                           au fur et à mesure de la boucle */
                     if ( (nombre >> i) & 1)
                     {
                             binaire[j]=1;
                     }
                     else{
                             binaire[j]=0;
                     }
                     i++;
                     j--; 
              }
     
               return binaire[32]; 
    }
    j'ai trouvé ca , ca vous parait correct

  16. #16
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par kamouminator
    pourquoi on pourrai pas utiliser les modulos ?
    C'est techniquement possible mais c'est lourd (division entière). Pour faire cette conversion, la division par 2 se fait à coup de décalage à droite de 1 (>> 1).

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Andrey
    n'y aurait il pas une lettre à mettre comme \d pour un nombre décimal \o pour un octal ... pour l'equivalent en binaire ...
    "%d", "%x", "%o" mais pas "%b". Dommage. La prochaine fois prends Ada au lieu du C...

  18. #18
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Andrey
    j'ai trouvé ca , ca vous parait correct
    Tu aurais pu essayer avant de poster... Non, ça n'est pas correct du tout.

    Ton code commenté, corrigé et simplifié :
    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
    #include <stdio.h>
     
    /* -ed-
    char *en_binaire (int nombre)
     
    cet interface ne convient pas pour cette utilisation.
    Il faut passer l'adresse du premier element d'un tableau
    de char et sa taille, a la (bonne) maniere de fgets().
     
    La valeur doit etre de type non signee.
    */
    void en_binaire (char *binaire, size_t size, unsigned long nombre)
    {
       size_t i = 0;
       unsigned long m = 1 << (size - 1 - 1);
     
       while (i < size - 1)
       {
          if (nombre & m)
          {
             binaire[i] = '1';
          }
          else
          {
             binaire[i] = '0';
          }
          i++;
          m >>= 1ul;
       }
       binaire[i] = 0;
       /* -ed-
          return binaire[32];
        
       Ceci n'a aucun sens.
        
       Ce char n'appartient pas au tableau
       Le type retourne est char * et non char.
        
       De toutes facons, meme si c'est techniquement possible,
       il est absurde de retourner l'adresse d'un tableau local,
       car il n'existe plus au moment ou l'on veut l'utiliser.
       Le comportement sera indefini.
        
       */
    }
     
    int main (void)
    {
       char s[16 + 1];
       en_binaire (s, sizeof s, 0x8000);
     
       printf ("'%s'\n", s);
     
       return 0;
    }
    Pose des questions si tu ne comprends pas.

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

Discussions similaires

  1. conversion d'un nombre en binaire en nombre réel
    Par etudiante-m dans le forum MATLAB
    Réponses: 2
    Dernier message: 12/03/2012, 13h23
  2. Conversion nombre décimal <-> binaire (signé et flottant)
    Par lecteur1001 dans le forum Simulink
    Réponses: 12
    Dernier message: 06/01/2011, 16h49
  3. Conversion d'un nombre décimal en binaire.
    Par ariuss dans le forum Débuter
    Réponses: 6
    Dernier message: 17/10/2009, 11h38
  4. [TPW] Conversion d'un nombre décimal en binaire
    Par thimo2 dans le forum Turbo Pascal
    Réponses: 14
    Dernier message: 10/04/2009, 00h24
  5. Conversion d'un nombre binaire en décimal
    Par grungy-soul dans le forum Général Java
    Réponses: 7
    Dernier message: 28/05/2008, 09h23

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