Partage
  • Partager sur Facebook
  • Partager sur Twitter

Afficher les bits d'un nombre

Anonyme
    30 mars 2008 à 22:53:29

    Bon, je cherche à afficher les bits d'un nombre (rien de bien sorcier là-dedans) mais lorsque je cherche à faire un affichage plus joli, en séparant les bits par groupe de 4, les chiffres sont tous décalés d'un rang o_O :
    0001 0000 0

    Voici mon code :
    #include <iostream>
    using namespace std;
     
    int main ()
    {
        int nombre = 32;
        for(int i = nombre / (sizeof nombre); i > -1; i--)
        {
            if (i % 4 == 0)
                cout << ' ';
            cout << (nombre >> i & 1) ? 1 : 0;
        }
     
        return 0;
    }
    

    Merci d'avance :)
    • Partager sur Facebook
    • Partager sur Twitter
      31 mars 2008 à 2:12:10

      Le problème se reprend seulement si ton n est un multiple de 4 ;)
      le sizeof(nombre que t'as mis donne tjs la taille d'un entier ----> ici int occupe tjs 4 octects ------> sizeof(nombre) = sizeof(int) = 4

      à mon avis, il suffit d'ajouter :
      1. 1.
      2.       #include <iostream>
      3.    2.
      4.       using namespace std;
      5.    3.
      6.    4.
      7.       int main ()
      8.    5.
      9.       {
      10.    6.
      11.               int nombre = 32;
      12.               bool drp = false;
      13.    7.
      14.               for(int i = nombre / (sizeof nombre); i > -1; i--)
      15.    8.
      16.               {
      17.    9.
      18.                       if (i % 4 == 0 <couleur nom="vertf">and !drp </couleur>)
      19.   10.
      20.                               cout << ' ';
      21.                       drp = true;
      22.   11.
      23.                       cout << (nombre >> i & 1) ? 1 : 0;
      24.   12.
      25.               }
      26.   13.
      27.   14.
      28.           return 0;
      29.   15.
      30.       }
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        31 mars 2008 à 12:12:47

        Ah ! Les espaces ne s'affichent même plus. Il n'y en a qu'un au début.
        #include <iostream>
        using namespace std;
         
        int main ()
        {
            int nombre = 32;
            bool drp = false;
            for(int i = nombre / (sizeof nombre); i > -1; i--)
            {
                if (i % 4 == 0 && !drp)
                    cout << ' ';
                
                drp = true;
                cout << (nombre >> i & 1) ? 1 : 0;
            }
         
            return 0;
        }
        

        • Partager sur Facebook
        • Partager sur Twitter
          31 mars 2008 à 17:15:11

          Un int ne fait pas toujours 4 octets, même si c'est souvent le cas.
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            31 mars 2008 à 17:33:06

            En utilisant les bitset on peut facilement séparer n'importe quel type entier en bits. C'est peut-être un peu lourd uniquement pour de l'affichage de le transformer en std::string et d'y insérer des caractères espace.

            Pour éviter la manipulation du string il y a un moyen de formatter l'affichage directement avec les locale : à voir.

            std::bitset surcharge l'opérateur << et >> pour être utilisé directement avec les flux et le formattage grâce aux locale.

            1. #include <bitset>
            2. #include <iostream>
            3. #include <string>
            4. int main()
            5. {
            6.     int nombre = 32;
            7.     std::bitset<sizeof(int) * 8> bs( nombre );
            8.     std::string s = bs.to_string();
            9.     for( size_t i = 0; i < s.size(); i++ )
            10.     {
            11.         if( i > 0 && (i + 1) % 5 == 0 )
            12.             s.insert( i, " " );
            13.     }
            14.     std::cout << s << std::endl;
            15.     return 0;
            16. }
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              31 mars 2008 à 17:59:23

              Si c'est trop demander, tu pourrais m'expliquer (un peu) ton code :) ?
              Sinon, je rédige un tutoriel pour faire un convertisseur binaire/octal/décimal/hexadécimal (en C). Il y a toujours ça (je l'ai un peu modifié pour l'occasion) :
              void lireTab(int chaine[])
              {
                  int i;
                  for(i = 31; chaine[i] == 0; i--); //A quel indice commence-t-on ?
               
                  for(i; i > -1; i--) //On parcours le tableau à l'envers
                        cout << chaine[i];
              }
               
              void codage(int nbr)
              {
                  int tab[32] = {0}, conv = nbr;
                  for (int j = 0; j < 32; j++)
                  {
                      tab[j] = conv % 2; //Chaque case du tableau est égal à nbr à convertir / base
                      conv >>= 2;
                  }
                  lireTab(tab);
              }
              
              • Partager sur Facebook
              • Partager sur Twitter
                31 mars 2008 à 19:48:40

                Bon, tu peux essayer ce programme :
                1. #include <iostream>
                2. using namespace std;
                3. int main()
                4. {
                5.     short *t = new short[100];
                6.     short n = 32;
                7.     short i = 0, q, r;
                8.     do
                9.      {
                10.           q = n/2 ;
                11.           r = n%2 ;
                12.           t[i++] = r ;
                13.           n = q ;
                14.           } while ( q != 0);
                15.      cout << "voici " << n << " en binaire :" << endl;
                16.      short cpt = 0;
                17.      for ( i; i >0; i--)
                18.      {
                19.       cout << t[i-1];
                20.       ++cpt;
                21.       if ( cpt % 4 == 0)
                22.       cout << ' ';
                23.      }    
                24.       cin.get();
                25.       cin.get();
                26.           return 0;
                27.       }

                le seul problème c'est que notre nombre binaire peut occuper plus de 100 cases du tableau t !
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  31 mars 2008 à 20:01:57

                  Avec 63 cases, toutes remplies de 1, on peut déjà aller jusqu'à 18 446 744 073 709 600 000. Rien qu'en base 2. C'est déjà pas mal. Je vais me pencher sur ton code.
                  t[i++] = r ;
                  

                  Ca me rappelle un exemple donné dans le K&R (que je viens de m'acheter d'ailleurs).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    31 mars 2008 à 20:28:18

                    Citation : raphamil


                    Avec 63 cases, toutes remplies de 1, on peut déjà aller jusqu'à 18 446 744 073 709 600 000. Rien qu'en base 2. C'est déjà pas mal.


                    donc, t'es satisfait du programme ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      31 mars 2008 à 20:40:30

                      Si ton but est d'afficher les nombres en octal ou hexa, je te propose de faire un tour par ici, c'est une méthode beaucoup plus propre et efficace:

                      http://www.siteduzero.com/tuto-3-26609-1-c-les-manipulateurs-de-flux.html

                      Sinon plutôt que des tableaux "à la C", utilise des std::vector<> ils sont justement adaptés pour ce genre d'opérations.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                      Anonyme
                        31 mars 2008 à 20:46:24

                        Non, justement. Je veux faire une conversion "explicite", qui n'utilise aucun système de conversion intégré, tel que printf("%x", 32), ou cout << hex << 32. C'est plus un exercice d'algorithmique. Et je rédige un tutoriel sur ce programme, donc il faut mieux que j'utilise une syntaxe proche du C - sans aller jusqu'au printf() - pour mieux l'adapter en C ensuite, ceci pour qu'un maximum de Zéros en profite.
                        Au fait, j'ai lu ton tuto. Très intéressant :)
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Afficher les bits d'un nombre

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown