Partage
  • Partager sur Facebook
  • Partager sur Twitter

decimal==>binaire

fonction de convertion

    23 octobre 2006 à 17:12:44

    existe t'il une fonction en C capable de convertir de décimal a binaire
    j'ai chercher sur internet mais la seule chose que j'ai trouver c'est la fonction decbin mais elle ne marche que en php
    et j'ai essayer de créer une fonction mais je ni suis pas arriver
    car je ne sais pas comment fonctionne la convertion
    merci de m'aider
    • Partager sur Facebook
    • Partager sur Twitter
      23 octobre 2006 à 17:19:58

      Alors... Dessine un abaque, avec les différents exposants de 2 =>

      ...1024    512    256    128    64    32    16    8    4    2    1    1/2
           1      0      0      1      1     0     1    0    1    1    1

      Correspond à 1024 + 128 + 64 + 16 + 4 + 2 + 1
      => 10011010111 = 1239

      Bon à savoir : L'ordinateur travaille par rangs de 4, 8, 16 etc... ( 8 => un octet )

      EDIT : Je n'ai apparemment pas été très clair.
      10011010111 = 1*1024 + 0*512 + 0*256 + 1*128 + 1*64 + 0*32 + 1*16 + 0*8 + 1*4 + 1*2 + 1*1 = 1239

      L'abaque va plus loin que 2^10 et plus bas que 2^-1 hein^^
      • Partager sur Facebook
      • Partager sur Twitter
        23 octobre 2006 à 17:28:39

        Perso, j'ai appris à faire comme ça la conversion décimal -> binaire (mais pour ce qui est du C, aucune idée :( ) :

        Exemple : pour le nombre 214

        Tu divises à chaque fois par 2 en prenant le reste (0 ou 1), comme ça :

        214/2 = 107 , reste 0
        107/2 = 53 , reste 1
        53/2 = 26 , reste 1
        26/2 = 13 , reste 0
        13/2 = 6 , reste 1
        6/2 = 3 , reste 0
        3/2 = 1 , reste 1
        1/2 = 0 , reste 1

        Après ça, il te suffit de lire à l'envers les restes, donc la valeur binaire de 214 est : 11010110

        Ensuite, pour faire ça en C, aucune idée, désolé :euh:
        • Partager sur Facebook
        • Partager sur Twitter
          23 octobre 2006 à 17:30:17

          On regarde si le dec > 1024, si oui on enlève 1024 et on met le bit de poids 1024 à 1, idem avec 512 jusque 1.
          • Partager sur Facebook
          • Partager sur Twitter
            23 octobre 2006 à 17:34:14

            Hum. Ca ne marche pas avec un nombre plus grand que 2048...
            • Partager sur Facebook
            • Partager sur Twitter
              23 octobre 2006 à 17:37:48

              j'avais fait un ptit truc il y a assez longtemps :


              int maxBit(int nbr)
              {
              int puiss;
              for(puiss=0;pow(2,puiss)<nbr;puiss++);
              return puiss+1;
              }
              int DecToBin(int dec)
              {
              int realdec=dec;
              int *bin=new int[maxBit(dec)]; // attention cpp c=malloc
              int reste=0;
              int binex=0;
              while(dec!=0)
              {
              bin[binex]=dec%2;
              dec/=2;
              binex++;
              }
              printf("BIT=%d %d=",binex,realdec);
              for(int i=binex;i!=0;i--)printf("%d",bin[i-1]);
              printf("\n");
              return binex; //nombre de bit
              }

              je sais pas si elle marche correctement
              mais essaye avec les long chiffre ,
              • Partager sur Facebook
              • Partager sur Twitter
                23 octobre 2006 à 17:40:57

                ben moi j'ai une idée.

                met la valeur Resultat % 2 dnas un caractere(ou une chaine de caractere(si sa fait 0 je voit pas comment tu mettrait sa dasn un entier si c'est le deuxieme nombre :-° ) puis tu divise Resulatat par 2 et tu continue j'usqu'a ce que Resultat = 0.

                Edit:grilled
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  23 octobre 2006 à 17:44:25

                  Voilà une méthode algorithmique. On prend une variable X qui contiendrait au départ le nombre a transformer.
                  (^ = mise à la puissance; % = modulo, reste de la division par...).

                  *Prendre X, le diviser par 2^7.
                  *Si le résultat est plus grand ou égal a 1, le bit n°7 vaut un (si resultat = 0 bit n°7 = zéro bien sur).
                  *Prendre pour X la valeur (X % 2^7).

                  *Recommencer avec 2^6, puis 2^5... Pour obtenir les bits n°6, puis n°5...

                  Après avoir passé l'étape 2^0, tu as ta représentation binaire.
                  Exemple avec 143.

                  X = 143

                  Operation           bit  Nouvelle valeur de X
                  x/2^7 = 143/128 > 1  ;1;  x = 143%128 = 15
                  x/2^6 = 15/64   < 1  ;0;  x = 15%64 = 15
                  x/2^5 = 15/32   < 1  ;0;  x = 15%32 = 15
                  x/2^4 = 15/16   < 1  ;0;  x = 15%16 = 15
                  x/2^3 = 15/8    > 1  ;1;  x = 15%8 = 7
                  x/2^2 = 7/4     > 1  ;1;  x = 7%4 = 3
                  x/2^1 = 3/2     > 1  ;1;  x = 3%2 = 1
                  x/2^0 = 1/1     = 1  ;1;  x = 1%1 = 0

                  Après, tu lis le résultat de haut en bas dans la colone 'bit'.
                  En C ça donne

                  .
                  //Non testé

                  int X = ... // Ton nombre
                  for(int i = 7; i >= 0; i--) //Pour chaque puissance de 2, de 7 jusqu'à 0...
                  {
                      if(X/pow(2, i) >= 1) // La division par 2^i pour connaitre la valeur du bit
                          printf("1");
                      else
                          printf("0");
                      X = X%pow(2, i)//Affectation de la nouvelle valeur de X.
                  }


                  PS : le nombre 2^7 que j'ai prit comme base est arbitraire ; Il ne marche que pour des nombres relativement petits. Si tu manipules des nombres > 256, augmente le '7' dans 'i = 7' ; (Avec i = 8, tu tiens jusqu'a 65 535; i = 9, 131 070...).
                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 octobre 2006 à 18:00:35

                    Salut,

                    Il existe deux autres méthodes, pas encore mentionnées, qui ne nécessitent aucun calcul :
                    - la première consiste à utiliser des masques binaires et l'opérateur ET ( & en C ) pour déterminer quels bits sont à 1, on obtient donc le nombre voulu en binaire.
                    - la deuxième méthode est un peu plus compliqué, mais ne nécessite pas d'utiliser les masques binaires, elle consiste à lire un par un les bits en utilisant l'opérateur >> ( décalage à droite ), et en vérifiant à chaque fois si le nombre est pair ou non ( si il est pair le bit vaut 0 sinon il vaut 1 ).
                    • Partager sur Facebook
                    • Partager sur Twitter
                      23 octobre 2006 à 19:54:59

                      en fait
                      il faudrait que le script s'execute le plus vite possible
                      alors je vois pas mal de code
                      moi aussi j'en avait fait un mais un peu long et trop lent
                      • Partager sur Facebook
                      • Partager sur Twitter
                        23 octobre 2006 à 20:13:22

                        Moi j'avais fais ca, prend ce qu'il te plaît dedans :) mais je pense pas que ce soit le plus optimisé.

                        Secret (cliquez pour afficher)
                        #include <stdio.h>
                        #include <stdlib.h>
                        //#include <math.h>
                        #include <ctype.h>

                        #define HUIT_BITS 8
                        #define SEIZE_BITS 16
                        #define VQUATRE_BITS 24
                        #define MAX_BITS 32
                        #define HUIT_BITS_BINAIRE 255
                        #define SEIZE_BITS_BINAIRE 65535
                        #define VQUATRE_BITS_BINAIRE 16777215
                        #define MAX_BITS_BINAIRE 2147483647

                        // affiche les valeurs
                        // binaires des bits sur x octets et son maximum
                        void afficherValeurBinaireMax(int bits);

                        int main (int argc, char* argv[])
                        {
                            long nbEntier = 0, nbEntierC = 0;
                            long *nbBinaire = {NULL}; // ou l'on stock le nombre binaire
                            int nbBits = -1, i = 0, continuer = 1;
                            printf("Convertisseur entier naturel / binaire\n\n");
                            printf("Entrez un nombre entier naturel (entre 0 et %d) : ",MAX_BITS_BINAIRE);
                            scanf("%ld",&nbEntier);
                            nbEntierC = nbEntier;

                            // Réglages des bits et allocation de nbBinaire
                            // Sur 4 octets max : 8, 16, 24, 32
                            if(nbEntier <= HUIT_BITS_BINAIRE) {
                                nbBits = HUIT_BITS;
                                nbBinaire = malloc(nbBits * sizeof(long));
                            }
                            if(nbEntier > HUIT_BITS_BINAIRE && nbEntier <= SEIZE_BITS_BINAIRE) {
                                nbBits = SEIZE_BITS;
                                nbBinaire = malloc(nbBits * sizeof(long));
                            }
                            if(nbEntier > SEIZE_BITS_BINAIRE && nbEntier <= VQUATRE_BITS_BINAIRE) {
                                nbBits = VQUATRE_BITS;
                                nbBinaire = malloc(nbBits * sizeof(long));
                            }
                            if(nbEntier > VQUATRE_BITS_BINAIRE && nbEntier <= MAX_BITS_BINAIRE) {
                                nbBits = MAX_BITS;
                                nbBinaire = malloc(nbBits * sizeof(long));
                            }
                            printf("\nValeur binaire de %d : ",nbEntier);

                            // Calcul du nombre binaire
                            for(i=0; i<nbBits; i++) {
                                nbBinaire[(nbBits-1)-i]=nbEntierC%2;
                                nbEntierC/=2;
                            }

                            // Affichage du nombre binaire
                            // des espaces sont mis entre chaque octets pour plus de lisibilité
                            for(i=0; i<nbBits; i++) {
                                printf("%d", nbBinaire[i]);
                                if(i == HUIT_BITS-1 ||
                                    i == SEIZE_BITS-1 ||
                                     i == VQUATRE_BITS-1) printf(" ");
                            }

                            printf("\nAppuyer sur la touche entrer pour quitter.");
                            getchar(); getchar();

                            // libération de la mémoire alloué pour le nombre binaire
                            free(nbBinaire);

                            return 0;
                        }

                        // affiche les valeurs
                        // binaires des bits sur x octets et son maximum
                        void afficherValeurBinaireMax(int bits)
                        {
                            long *binaire = {NULL};
                            binaire = malloc(bits * sizeof(long));
                            binaire[0] = 1;
                            long i = 0, max = 0;
                            for (i = 0; i<bits; i++)
                            {
                                if(i!=0) binaire[i] = binaire[i-1] * 2;
                                printf("\nbit %d       :      %ld", i, binaire[i]);
                                max+=binaire[i];
                            }
                            printf("\nmax %d",max);
                            free(binaire);
                        }

                        • Partager sur Facebook
                        • Partager sur Twitter

                        decimal==>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