Partage
  • Partager sur Facebook
  • Partager sur Twitter

Incrémenter en binaire.

Sujet résolu
    18 juin 2011 à 18:29:28

    Bonjour,

    J'ai un problème, car je voudrais incrémenter du binaire.
    Je ne sais pas comment faire.

    Un petit exemple :

    0000
    0001
    0010
    0011
    0100
    0101
    0110
    0111
    1000



    Si quelqu'un pourrait m'aider, s'il vous plaît.
    • Partager sur Facebook
    • Partager sur Twitter
      18 juin 2011 à 18:39:12

      Et bien tu fais la même chose que tu as appris en maternelle sur les additions mais avec une base de 2.

      Tu pars de la droite, et tu additionnes les 2 chiffres,
      Si ça fait 0 ou 1, tu laisses. Si ça fait 2, tu écris 0 et retient 1

      Et tu fais la même choses pour tous les autres.
      • Partager sur Facebook
      • Partager sur Twitter
        18 juin 2011 à 22:23:15

        Binaire veut juste dire "base 2". Tout comme décimale veut dire "base 10". Une base de nombres, c'est une liste de chiffres utilisés pour rédiger ce nombre. On passe d'un chiffre à l'autre en incrémentant d'une unité. Et quand on arrive au bout, on incrémente le chiffre à sa gauche et on reprends de zéro.


        Donc à l'école maternelle/primaire ce que tu apprenais, c'était à compter en décimal. base 10, donc 10 chiffres différents : de 0 à 9. En binaire tu n'as que 2 chiffres, le 0 et le 1, mais la règle générale est la même. ;)
        • Partager sur Facebook
        • Partager sur Twitter
          18 juin 2011 à 22:26:34

          En pratique pour incrémenter il y a un algorithme direct¹ et simple : en partant de la droite, transformer tous les 1 en 0, et s'arrêter au premier 0 en le transformant en 1.

          ¹: c'est un cas particulier de l'algorithme d'ajout usuel que vous avez tous les deux cité, mais cette présentation est plus simple à implémenter.
          • Partager sur Facebook
          • Partager sur Twitter
            2 juillet 2011 à 22:05:18

            Je réalise un programme d’adressage IP.

            Voici mes étapes :
            Les nombres sont saisie en chaîne de caractères avec un point entre les nombres.

            Premier Menu :
            - choix 1 (correspond à saisir une adresse ip et un masque de sous-réseau) ou 2 (correspond à saisir une adresse ip et un cidr) le cidr est un nombre en int.

            Deuxième Menu :
            ensuite pour créer son adressage l'utilisateur saisir le nombre de sous-réseaux en choix 1 ou le nombre de machines en choix 2.

            J'utilise le type standard pour stocker mes valeurs.

            Je n'ai jamais utilisé le type binaire.
            • Partager sur Facebook
            • Partager sur Twitter
              2 juillet 2011 à 23:45:57

              ça sert à quoi de remonter un sujet vieux de 2 semaines sans y poser de questions ?
              • Partager sur Facebook
              • Partager sur Twitter
                3 juillet 2011 à 14:21:16

                Sinon si tu veux une méthode générique pour incrémenter une variable, tu considère chaque bit comme variable binaire, et tu utilises les tableaux de Karnaugh (Wikipedia) pour établir la fonction pour chaque bit de sortie en fonction des bits d'entrée.

                Mais dans la pratique, la méthode proposée par bluestorm est optimale puisque tu n'auras presque jamais besoin de parcourir tout le nombre pour trouver son successeur.
                • Partager sur Facebook
                • Partager sur Twitter
                  3 juillet 2011 à 16:50:41

                  Bonjour,

                  Désolé pour cette réponse tardive, j'ai dû pas mal médité sur ce problème.

                  J'ai faire une simulation à côté mais ça ne marche pas.

                  Voici mon code :

                  using namespace std;
                  #include <iostream>
                  int main()
                  {
                      string tab[4]={"0","0","0","0"};
                      int j,i;
                      for(j=3;j>-1;j--)
                      {
                                      cout<<"Indice tableau :"<<j<<endl;
                                      for(i=0;i<256;i++)
                                      {
                                                        cout<<"Indice incrementation :"<<i<<endl;
                                                        if(tab[j]=="0"&&tab[j-1]=="0")
                                                        {
                                                                                      tab[j]="1";
                                                                                      cout<<tab[j]<<endl;
                   
                                                        }
                                                        if(tab[j]=="1"&&tab[j-1]=="0")
                                                        {
                                                                            tab[j]="0";
                                                                            tab[j-1]="1";
                                                                            cout<<tab[j]<<endl;
                                                                            cout<<tab[j-1]<<endl;
                   
                                                        }
                                                        if(tab[j]=="1"&&tab[j-1]=="1")
                                                        {
                                                                                      tab[j]="0";
                                                                                      tab[j-1]="0";
                                                                                      tab[j-2]="1";
                                                                                      cout<<tab[j]<<endl;
                                                                                      cout<<tab[j-1]<<endl;
                                                                                      cout<<tab[j-2]<<endl;
                   
                                                        }
                                      }
                                      cout<<tab[j]<<endl;
                      }
                  system("pause");
                  }
                  
                  • Partager sur Facebook
                  • Partager sur Twitter
                    3 juillet 2011 à 17:10:42

                    Ce code est censé faire quoi ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 juillet 2011 à 19:41:20

                      A vue de nez je dirais qu'il est sensé afficher les nombres entiers de 1 à 256 en utilisant des incrémentations successives.

                      2 remarques :
                      - avant meme de regarder ce que tu fais dans le corps de la seconde boucle, tu dois inverser l'ordre de tes boucles : là tu "incrémentes" 256 fois pour chacun des chiffres de ton nombre binaire, c'est totalement incohérent.
                      - tu n'utilises pas l'algorithme proposé par bluestorm, qui est pourtant bien moins compliqué (une condition au lieu de 3)


                      Si on suit l'algorithme de bluestorm on aurait plutôt :

                      using namespace std;
                      #include <iostream>
                      int main()
                      {
                          string tab[4]={"0","0","0","0"};
                          int j,i;
                          for(i=1 ; i<=256 ; ++i)
                          {
                              j=3 ;
                              while(tab[j]=="1")
                              {
                                  tab[j] = "0" ;
                                  --j ;
                              }
                              tab[j] = "1" ;
                          }
                          system("pause");
                      }
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        3 juillet 2011 à 19:50:29

                        En fait tu essaye de balayer les adresses IP possibles, mais les gère sous forme textuelle. C'est fort dommage.

                        tu devrais passer en valeur réelle d'adresse IP : le nombre binaire correspondant. De là tu pourras faire beaucoup plus de manœuvres sans te casser la tête avec des tests dans tous les sens.

                        Tuto : Réseaux, adressage TCP/IP et fonctionnement d'internet
                        • Partager sur Facebook
                        • Partager sur Twitter
                          3 juillet 2011 à 22:49:37

                          Ou utiliser un entier que tu incrémentes, et que tu concatènes par la suite aux 6 premiers octets de l'adresse.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            6 juillet 2011 à 13:25:36

                            J'ai effectué des modifications sur mon code en utilisant un tableau multidimensionnel, se sera déjà un peu plus simple.

                            voir le code ci-dessous :

                            using namespace std;
                            #include <iostream>
                            int main()
                            {
                                string tab[4][4];
                                int k,m,i,j;
                                for(k=0;k<2;k++)
                                {
                                   for(m=0;m<4;m++)
                                   {
                                          if(tab[k][m]=="")
                                          {
                                                tab[k][m]="0";//initialisation du taleau à 0
                                          }
                                          cout<<"le ligne"<<k<<endl;
                                          cout<<"colonne"<<m<<endl;
                                          cout<<tab[k][m]<<endl;;
                                   }
                                }
                                for(j=3;j>-1;j--)
                                {
                                           cout<<"colonne incremente :"<<j<<endl;
                                           for(i=0;i<4;i++)
                                           {
                                                 cout<<"ligne incremente :"<<i<<endl;
                                                 if(tab[i][j]=="0"&&tab[i][j-1]=="0")//si on trouve un 0 au premier et au deuxième indice.
                                                 {
                                                        tab[i][j]="1";//alors on met un 1
                                                        cout<<tab[i][j]<<endl;
                                                        tab[i+1][j]=tab[i][j];//On copie la valeur dans la ligne suivante
                                                        i++;//on passe à la ligne suivante
                             
                                                 }
                                                 if(tab[i][j]=="1"&&tab[i][j-1]=="0")//si on trouve un 1 au premier et un 0 au deuxième indice.
                                                 {
                                                        tab[i][j]="0";//on mets un 0 au premier indice
                                                        tab[i][j-1]="1";//ensuite on mets un 1 à l'indice suivante.
                                                        cout<<tab[i][j]<<endl;
                                                        cout<<tab[i][j-1]<<endl;
                                                        tab[i+1][j]=tab[i][j];//On copie les valeurs dans la ligne suivante
                                                        tab[i+1][j-1]=tab[i][j-1];
                                                        i++;
                             
                                                 }
                                                 if(tab[i][j]=="1"&&tab[i][j-1]=="1")//si on trouve un 1 au premier et un 1 au deuxième indice.
                                                 {
                                                        tab[i][j]="0";//on mets un 0 au premier indice
                                                        tab[i][j-1]="0";//on mets un 0 au deuxième indice
                                                        tab[i][j-2]="1";//ensuite on mets un 1 à l'indice suivante.
                                                        cout<<tab[i][j]<<endl;
                                                        cout<<tab[i][j-1]<<endl;
                                                        cout<<tab[i][j-2]<<endl;
                                                        tab[i+1][j]=tab[i][j];
                                                        tab[i+1][j-1]=tab[i][j-1];
                                                        tab[i+1][j-2]=tab[i][j-2];
                                                        i++;
                             
                                                 }
                                           }
                                           cout<<tab[i][j]<<endl;
                                }
                            system("pause");
                            }
                            


                            Mon code ne fonctionne pas.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              6 juillet 2011 à 14:36:48

                              :-° Tu codes sur un écran 48 pouces pour faire des tabulations aussi larges ? :lol:
                              • Partager sur Facebook
                              • Partager sur Twitter
                                8 juillet 2011 à 21:07:58

                                Excuse-moi, mais je n'ai pas l'impression que tu lises les réponses.
                                On essaie de t'aider, mais il faut que tu acceptes les remarque que l'on te fait, et que tu changes ton code en conséquence.

                                Tu as deux solutions :

                                l'algorithme proposé par rushia :

                                Citation : rushia

                                A vue de nez je dirais qu'il est sensé afficher les nombres entiers de 1 à 256 en utilisant des incrémentations successives.

                                2 remarques :
                                - avant meme de regarder ce que tu fais dans le corps de la seconde boucle, tu dois inverser l'ordre de tes boucles : là tu "incrémentes" 256 fois pour chacun des chiffres de ton nombre binaire, c'est totalement incohérent.
                                - tu n'utilises pas l'algorithme proposé par bluestorm, qui est pourtant bien moins compliqué (une condition au lieu de 3)


                                Si on suit l'algorithme de bluestorm on aurait plutôt :

                                using namespace std;
                                #include <iostream>
                                int main()
                                {
                                    string tab[4]={"0","0","0","0"};
                                    int j,i;
                                    for(i=1 ; i<=256 ; ++i)
                                    {
                                        j=3 ;
                                        while(tab[j]=="1")
                                        {
                                            tab[j] = "0" ;
                                            --j ;
                                        }
                                        tab[j] = "1" ;
                                    }
                                    system("pause");
                                }
                                


                                ou la méthode que je t'ai proposée :

                                Citation : KateVoegele42

                                Ou utiliser un entier que tu incrémentes, et que tu concatènes par la suite aux 6 premiers octets de l'adresse.



                                En fait quand je vois ton dernier post, je ne vois aucune des deux méthodes, donc ce serait sympa de nous dire en quoi tu les trouve inutiles afin que l'on puisse mieux t'aider.
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Incrémenter en binaire.

                                × 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