Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programme qui convertit de décimale en binaire

j'espère que je vais réussir à me faire comprendre ^^, car j'ai un problème

    24 janvier 2006 à 21:36:29

    Salut à tous!
    Voilà, je suis fou et j'aimerai faire un programme qui convertit un nombre (en base de dix) en un nombre binaire (base 2 ^^ ).
    Bon, pour que vous compreniez mon problème, faudrait déjà que je vous explique comment fonctionne le programme, et donc la conversion de base dix en base 2!

    déjà, voilà le code:
    #include <stdio.h>
    #include <stdlib.h>




    int main(int argc, char *argv[])
    {
        unsigned long nombre_decimal = 0, reponse_brut = 0, reponse_reste = 0, reponse2 = 0;

    printf("Entrez un nombre : \n");
    scanf ("%ld", &reponse_brut);
           
    do
    {     
    reponse2 =  reponse_brut % 2;
    printf("%ld", reponse2);
    reponse_brut/=2;
     
    }while (reponse_brut > 0);           
       
    printf("\n");
    system("PAUSE");
        return 0;
    }



    Alors, ceux qui connaissent bien le binaire, comprendront comment ça fonctionne (vraiment très simple, rien de spécial, faut juste y penser ^^).
    Alors voilà pour ceux qui comprendraient pas (je vais pas vous expliquer comment compter en binaire, car c'est pas facile et en plus par écrit, mais je vais vous montrer comment je fais).

    Alors on est d'accord que n'importe quel nombre divisé par 2 a un reste de 1 ou 0 !
    Bin admettons que l'utilisateur veut convertir 4 en binaire:
    Le programme cherche d'abord le reste , 4%2 ce qui vaut 0, on écrit 0 dans le printf!
    Ensuite on divise 4 en faisant 4/2 = 2
    donc la variable vaut 2!
    On refait la meme operation (car 2 != 0 --> condition pas remplie)
    -> 2 % 2 = 0
    on note 0 dans le printf
    et 2/2 = 1

    condition pas rempli (car 1 != 0 ^^)
    on recommence:
    1%2 = 1
    on ecrit 1 dans le printf
    et 1/2 = 0
    --> 0 = 0, boucle fini!

    alors le printf affiche dans L'ORDRE (y a pas de saut (\n) dans le printf, donc tout s'écrit cote à cote ^^): 0 puis 0 puis 1 -> 001
    mais alors que nous on veut le contraire!
    on veut 100 = 4 et 001 = 2
    on veut le contraire car dans un tableu des unites (tableua des unites, dizaine, centaines etc..) ce lit de droite à gauche!
    mais ici le printf met dans l'ordre, donc de gauche à droite!!

    Comment résoudre ce problème???


    Merci d'avance :D
    • Partager sur Facebook
    • Partager sur Twitter
      24 janvier 2006 à 22:07:51

      Tu met le résultat binaire dans un tableau ensuite tu fais une boucle qui copie le dernier chiffre dans la premiere case d'un autre tableau,l'avant derniere dans la deuxième et ainsi de suite :D

      Enfin je dis ça mais y'a surement un moyen beaucoup plus "propre" d'obtenir le résultat.
      • Partager sur Facebook
      • Partager sur Twitter
        24 janvier 2006 à 22:12:58

        hop :
        #include <stdio.h>

        void binaire(int n)
        {
                if (0 == n) return;
                binaire(n >> 1);
                printf("%d", (n & 1));
        }

        int main(void)
        {
                int nombre;
                scanf("%d", &nombre);
                binaire(nombre);
                return 0;
        }


        Une autre version de binaire, sans opérateurs bit-à-bit, pour si vous avez du mal :
        void binaire(int n)
        {
                if (0 == n) return;
                binaire(n / 2);
                printf("%d", (n % 2));
        }


        En gros, "n >> x;" décale n de x bits vers la droite (ca revient à diviser par 2^x). L'autre opérateur est << (existent aussi >>= et <<=, vous devinez ce qu'ils font).
        L'opérateur "&" fait une opération logique bit-à-bit. Il compare chaque bit du premier nombre au bit correspondant du deuxième nombre, et renvoie le résultat de l'opération logique, ici "et". (pour "ou" c'est n | 1).
        n & 1 ca renvoie 1 si le dernier bit (le bit qui est au niveau du bit qui vaut 1 de 1) vaut 1, et 0 sinon (car tous les autres bit de 1 valent 0).

        Pour ta question précisément, tu peux voir que j'ai utilisé une fonction récursive, ce qui est assez simple dans ton cas (je pense même que c'est la solution la plus simple).
        • Partager sur Facebook
        • Partager sur Twitter
          25 janvier 2006 à 12:40:12

          Ok, bin merci!
          Ca marche très bien mais y a un truc que je comprend pas:

          La première ligne:

          if (0 == n) return;


          Ca veut dire: si le nombre égal à 0, arrêter la fonction?
          Mais alors comment tu fais pour que la fonction se répète comme une boucle?
          Je ne comprend pas trop :euh: .
          En plus j'essai de comprendre les fonctions avec pointeurs, et là: ... arf! :lol:
          Merci
          • Partager sur Facebook
          • Partager sur Twitter
            25 janvier 2006 à 13:16:33

            Bon moi j'ai toujours un peu de mal avec les oppérateurs bit à bit. Donc si je comprend bien ta fonction bluestorm :

            A chaque fois tu décales de un bit

            Donc si en entrée on a 00101001
            avec un n >> 1 on aura

            00010100 Puisques le bit de poids faible vire à chaque fois non ? Donc aprés tu appelles la fonction récursivement puis d'aprés ce que je comprend une fois que tous les bits ont été décalés tu affiches n & 1 donc si au final on a exemple

            10100000 avec l n & 1 on aura

            10100000
            00000001
            =
            10100001
            =
            2^7 + 2^5 + 2^0
            =
            161

            • Partager sur Facebook
            • Partager sur Twitter
              25 janvier 2006 à 13:40:45

              Citation

              10100000
              00000001
              =
              10100001
              =
              2^7 + 2^5 + 2^0
              =
              161



              Non, là tu te trompes. Pour comprendre il faut connaitre rigoureusement l'opérateur logique 'et'.

              Quand on dit "Mathieu et Nicolas sont là", quand est-ce que c'est vrai ? Quand mathieu est là et nicolas est là. C'est à dire que si l'un des deux, ou les deux, sont absents, c'est faux.

              On a donc un truc comme ca (Vrai et Faux) :

              A | B | A et B |
              V | V | V |
              V | F | F |
              F | V | F |
              V | F | V |


              Remplace V par '1' et F par '0', et applique la fonction à chacun des bits des deux nombres :

              Citation

              10100000 &
              00000001
              =
              00000000
              =
              0



              Citation

              10100001 &
              00000001
              =
              00000001
              =
              1

              Un bit du nombre final vaut 1 uniquement quand les deux bits des deux nombres valent 1 tout les deux. De fait, "n & 1" renvoie donc la valeur du dernier bit (et équivaut donc à (n % 2)).
              • Partager sur Facebook
              • Partager sur Twitter
                25 janvier 2006 à 13:45:07

                Ah vi oui pardon j'ai confondu avec l'opérateur logique OU autant pour moi donc pour le ET c'est

                0 & 0 -> 0
                0 & 1 -> 0
                1 & 0 -> 0
                1 & 1 -> 1

                qui serait la table de véritié du ET
                • Partager sur Facebook
                • Partager sur Twitter

                Programme qui convertit de décimale 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