Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

programmation d'un convertisseur decimale binaire en C



  1. #1
    rachid223

    Post programmation d'un convertisseur decimale binaire en C


    ------

    bonsoir
    je voudrais convertir un décimal en binaire,
    je voudrais seulement afficher les chiffres du restes des divisions par 2, enfin vous savez le truc, si ces chiffres se lisent à l'envers du haut en bas ou le contraire je m'en fiche!!
    bien!! voilà ce que j'ai fait en C :

    Code:
    #include <stdio.h>
    #include <math.h>
    
    main()
    {
        long compteur=0, a, d, x, y; 
        float b, c;
        printf("donnez a:");
        scanf("%d", &a);
        b = log(a);
        c = b / (log(2));
        d = ceil(c);
        while (compteur < d)
       {
             compteur++;
             x = a % 2;
             y = a / 2;
             y = a;
             printf("%d\n", x);
             
       }
            system("PAUSE");	
            return 0;
    }
    c le truc de la division en deux!!
    bon si quelkqu'un aurait une idée comment organiser les instruction du programme, ou donner une autre version parce que je pense que je suis dans une impasse là;

    merci beaucoup

    -----
    Dernière modification par yoda1234 ; 11/03/2009 à 21h57.

  2. #2
    Towl

    Re : programmation d'un convertisseur decimale binaire en C

    log, c'est un log base 10, donc ca ne passera pas (enfin du moins je crois). Et surtout c'est un peu bourrin pour faire cela.

    Tu as un truc qui s'appelle la division modulaire ('%') qui te permet d'avoir le reste d'une division.

    Ainsi si je note 54 % 10, j'obtiens 4
    Ensuite, une autre particularité du C, si tu fais une division d'entier, tu récupère la partie entiere : 54 / 10 = 5
    D'ou (54 / 10)*10^1 + (54 % 10)*10^0 = 54
    Voire (543 / 100)*10^2 + ((543 - (543 / 100)*10^2 ) / 10)*10^1 + (543 % 10) = 543

    Avec cela, tu devrais obtenir une décomposition en base 10. Une fois que tu as compris pour la base 10, il ne te restera plus qu'a le faire en base 2
    The only limiting factor of the Linux operating system, is his user. - Linus Torvalds

  3. #3
    lil-vince

    Re : programmation d'un convertisseur decimale binaire en C

    Salut,

    Il me semble bien que l´on peu afficher en binaire avec la fonction sprintf (%b), ça serait le plus simple!
    Sinon, utilises un pointeur sur un bool (ou sur un octet avec un masquage) et tu lis la valeur de a en mémoire...

    Pour ton programme, il y a de l´idée mais il doit t´afficher toujours le même chiffre non?

    Déjà, à la place de tout ça:
    Code:
        b = log(a);
        c = b / (log(2));
        d = ceil(c);
    Tu pourrais (s´il existe dans tes en-têtes) utiliser le logarithme binaire: d = lb (a)+1;
    sinon: d = (ln(a)/ln2) +1;

    Sinon, le plus simple serait de controler la valeur de a après chaque division par deux (quand il est inferieur à 2, on arrete)

    Code:
    while ( (a+1) >= 2)
    {
        x = a%2;
        a /= 2;
        printf("%d\n", x);
    }
    Sauf que le résultat est inversé....

    Que veux tu faire avec ça? c´est un exercice scolaire non?
    Si on a 2 oreilles et 1 bouche, c'est pour écouter 2 fois plus qu'on ne parle. Confucius

  4. #4
    rachid223

    Re : programmation d'un convertisseur decimale binaire en C

    non ce n'est qu'une idée comme ça!!

  5. A voir en vidéo sur Futura
  6. #5
    rachid223

    Re : programmation d'un convertisseur decimale binaire en C

    lil-vince,
    un petit commentaire svp sur ton deuxième exemple !!
    merci

  7. #6
    Philou67

    Re : programmation d'un convertisseur decimale binaire en C

    Pour afficher les bits dans l'ordre :
    Code:
    long a;           // nombre a afficher
    long b = 1 << 15; // puissance de 2 (on commence par la plus grande)
    
    printf("Entrer a:\n");
    scanf("%ul", &a);
    while (b != 0) {
      putchar('0' + (a / b) % 2);
      b /= 2;
    }
    L'opérateur << (dans l'expression 1 << 15) décale les bits de l'opérande de gauche, du nombre de bits spécifié dans l'opérande de droite. Ainsi :
    1 << 15 correspond en binaire à :
    0000000000000001 décalé 15 fois à gauche soit :
    1000000000000000 soit 215


    Un nombre est stocké dans mémoire sous forme d'un polynôme dont les coefficients sont des valeurs binaires de puissances de 2.
    Ainsi :
    a = a0215 + ... + a1520

    En divisant a pas 215 (division entière), on obtient 0 ou 1, qui correspond au premier coefficient du nombre a (premier bit, ou bit de poids fort).
    Pour trouver les autres coefficients, il suffit de diviser le diviseur par 2 à chaque fois, ainsi, on obtient successibles toutes les puissances de 2 jusqu'à 20.

    Voyons le calcul de a1 :
    a / 214, en valeur entière va donner
    a0215 + a1214
    Pour éliminer les coefficients de puissance supérieure à celle recherchée, il suffit de prendre le reste de la division par 2 (que l'on obtient avec l'opérateur % en C).

    Concernant l'affichage avec putchar, j'ai usé d'un artifice pour éviter un test. On peut aussi écrire l'affichage ainsi :
    Code:
    if ((a / b) % 2) {
      putchar('1');
    }
    else {
      putchar('0');
    }
    ou encore
    Code:
    putchar(((a / b) % 2) ? '1' : '0');
    :'( Plus j'apprends, et plus je mesure mon ignorance

  8. #7
    fderwelt

    Re : programmation d'un convertisseur decimale binaire en C

    Bonjour,

    Je prends ce fil en cours, j'interviens juste pour mettre mon souk de développeur en C qui se la joue comme en assembleur...

    On n'écrit jamais
    Code:
    a /= 2
    mais plutôt
    Code:
    a >>= 1
    Et dans la même idée
    Code:
    a % 2
    est exactement pareil que
    Code:
    a & 1
    Mais les bons compilos le font d'eux-mêmes. En principe...

    -- françois
    Les optimistes croient que ce monde est le meilleur possible. Les pessimistes savent que c'est vrai.

  9. #8
    Philou67

    Re : programmation d'un convertisseur decimale binaire en C

    On utilise un langage évolué justement pour ne pas utilisé un langage basique.

    En programmant a >>= 1 au lieu de a /= 2 :
    - on oublie que conceptuellement, on veut diviser par 2
    - on suppose que le codage des nombres au format binaire (et pas pour les nombres en virgule flottante).

    En génie logiciel, on ne doit jamais préjugé de la nécessité "d'optimiser le code source". Cela doit toujours être la conséquence d'une contrainte de performance, et être ciblés sur les éléments critiques (après profilage). Cela pour plusieurs raisons :
    - l'optimisation dans les sources rends la compréhension et la maintenabilité moins bonne.
    - les compilateurs optimisent souvent bien mieux que nous-même
    - d'un compilateur à l'autre, une écriture "optimisée" pourra ne plus l'être

    En revanche, il n'est pas exclu de concevoir des algorithmes efficaces.
    :'( Plus j'apprends, et plus je mesure mon ignorance

  10. #9
    fderwelt

    Re : programmation d'un convertisseur decimale binaire en C

    Citation Envoyé par Philou67 Voir le message
    On utilise un langage évolué justement pour ne pas utilisé un langage basique.

    En programmant a >>= 1 au lieu de a /= 2 :
    - on oublie que conceptuellement, on veut diviser par 2
    - on suppose que le codage des nombres au format binaire (et pas pour les nombres en virgule flottante).

    En génie logiciel, on ne doit jamais préjugé de la nécessité "d'optimiser le code source". Cela doit toujours être la conséquence d'une contrainte de performance, et être ciblés sur les éléments critiques (après profilage). Cela pour plusieurs raisons :
    - l'optimisation dans les sources rends la compréhension et la maintenabilité moins bonne.
    - les compilateurs optimisent souvent bien mieux que nous-même
    - d'un compilateur à l'autre, une écriture "optimisée" pourra ne plus l'être

    En revanche, il n'est pas exclu de concevoir des algorithmes efficaces.
    Je ne peux qu'être entièrement d'accord. C'est pour ça que j'ai mis un smiley à "mettre mon souk" !

    J'ose à peine imaginer ce que cette "optimisation" donnerait sur une machine ternaire. Il est clair que le choix d'un bon algorithme (en principe avec une évaluation de sa complexité, mais dans la vraie vie on s'en dispense bien souvent) est bien plus crucial que des optimisations à la main, au coup par coup, et qui ne feront jamais que grappiller quelques cycles d'exécution. Je n'ai eu à faire ce genre de choses que dans des applications temps réel, avec un processeur minable et une mémoire vive plus que restreinte. Un collègue m'avait passé à cette occasion un dessin légendé "Nos crédits ont tellement été diminués que nous ne pouvons plus calculer que sur des nombres à un chiffre"...

    Cela dit, les "a >>= 1" et "a & 1" sont des "idiomes" en C, des tics de langage qui sont tellement souvent utilisés qu'ils sont reconnaissables au premier coup d'œil. Et en l'occurrence ils ne sont pas complètement injustifiés puisque le problème est une conversion décimal -> binaire : il est alors parfaitement légitime d'exploiter le fait que les entiers sont représentés en base 2.

    Mais sur le fond, bien entendu, un vrai algorithme vraiment portable est bien mieux. Si après le compilo ne fait pas correctement son boulot d'optimisation, on n'en est pas responsable.

    -- françois
    Les optimistes croient que ce monde est le meilleur possible. Les pessimistes savent que c'est vrai.

  11. #10
    Philou67

    Re : programmation d'un convertisseur decimale binaire en C

    J'ai également travaillé sur l'optimisation de code, écrit en C, sur un micro minable... j'en viens presque à me demander si c'est le même

    Avec ce micro (ce compilo devrait-je dire), je gagnais d'innombrables cycles d'exécution en décomposant dans des variables intermédiaires, de simples calculs arithmétiques sur des entiers. Sans cela, pour une simple addition, il faisait systématiquement appel à une fonction de la librairie C. A devenir complètement fou !
    :'( Plus j'apprends, et plus je mesure mon ignorance

Discussions similaires

  1. Programmation d'un convertisseur analogique/numérique
    Par Alain39 dans le forum Électronique
    Réponses: 1
    Dernier message: 21/05/2008, 10h21
  2. decimale en binaire
    Par sdow dans le forum Électronique
    Réponses: 15
    Dernier message: 17/09/2006, 15h25
  3. Conversion Binaire-Decimale
    Par EaGle58 dans le forum Technologies
    Réponses: 4
    Dernier message: 10/01/2006, 10h49
  4. Décimale - Binaire
    Par Tix dans le forum Logiciel - Software - Open Source
    Réponses: 29
    Dernier message: 03/09/2005, 18h22
  5. Décimale Binaire ...
    Par Tix dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 31/08/2005, 14h03
Découvrez nos comparatifs produits sur l'informatique et les technologies.