IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

problème conversion binaire


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut problème conversion binaire
    bonjour, j'ai un petit problème dans un de mes programmes. son but est de convertir du binaire en décimal.

    pour ce faire, je divise successivement le nombre par 10 et ainsi traiter le dernier bit.

    exemple avec 5 (101)

    1) 101/10= 10.1 on traite le .1, on le multiplie par 2^0 comme c'est le bit n°1
    puis enlève la partie décimale pour traiter le bit suivant donc on a 10

    2) 10/10= 1.0, on traite le .0 on le multiplie par 2^1 comme c'est le bit n°2
    puis on enlève la partie décimale pour traiter le bit suivant donc on a 1

    3)1/10= 0.1, on traite le .1 on le multiplie par 2^2 comme c'est le bit n°3
    puis on enlève la partie décimale pour traiter le bit suivant, mais comme la partie entière donne 0, la boucle s'arrête

    on affiche ensuite la somme des parties décimales multipliées par 2^i.

    sur le papier tout va bien, en exécution par contre.... c'est le drame et je n'arrive pas à comprendre comment résoudre le problème

    exemples :

    pour 21 il m'affiche 20.999770, pour 5 il m'affiche 5.000004 alors que pour 3 il m'affiche le résultat correct soit 3.000000

    voici le code source avec les commentaires

    http://pastebin.com/f50e709ad

    merci de m'aider sur la solution à adopter afin d'éliminer toutes erreurs

  2. #2
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Heu... Pour changer de base (10 vers 2 ou 2 vers 10), il n'est absolument pas nécessaire (et pas souhaitable non plus !!) d'utiliser des flottants.

    Là, je ne comprends même pas ce que tu cherches à faire : tu voudrais convertir (par exemple) "110001" en "49", ou le contraire ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut
    je veux passer du binaire au décimal.

    si tu as une méthode plus simple que la mienne je veux bien la connaître, car j'avoue que la mienne est pourri.

  4. #4
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    En considérant que tu récupères ton chiffre binaire dans un char* :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    // Convertit une chaîne représentant un nombre binaire vers un entier.
    unsigned int bin2dec ( char* bin ) {
     
      // Variable résultat.
      unsigned int result = 0 ;
     
      // Jusqu'à la fin de la chaîne, de gauche à droite (bit de poids fort en premier).
      while (*bin != '\0') {
        // Changement de multiple : on multiplie par deux le résultat précédent.
        // Ceci permet de tenir compte du nombre de bits déjà décodés.
        result = result * 2 ;
        // Si le chiffre binaire est "1", on l'ajoute au résultat.
        // Sinon, on ajoute zéro, donc on ne fait rien.
        if (*bin=='1')
          result = result + 1 ;
        // Caractère suivant.
        bin++ ;
      }
      // On retourne le résultat.
      return result ;
    }
    Pas testé, mais ça devrait marcher. Bien sûr, la chaîne ne doit contenir que des zéros et des uns (sous forme de caractères), et être terminée normalement (= avec un caractère nul).
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 845
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 845
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Mac LAK Voir le message
    En considérant que tu récupères ton chiffre binaire dans un char* :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    unsigned int bin2dec ( char* bin ) {
     
      unsigned int result = 0 ;
     
      while (*bin) {
        if (*bin=='1')
          result += 1 ;
        result *= 2 ;
        bin++ ;
      }
      return result ;
    }
    Pas testé, mais ça devrait marcher. Bien sûr, la chaîne ne doit contenir que des zéros et des uns (sous forme de caractères), et être terminée normalement (= avec un caractère nul).
    Aucun souci, ce code fonctionne.
    On peut éviter le if en écrivant à la place
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result=result + *bin - '0'
    Et remplacer le while par un for mais c'est du détail.

    Et si la fonction reçoit un int au lieu d'un string, alors un simple sprintf règlera le pb.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    si je ne me trompe pas une multiplication par 2 ou une division par 2 reviens a un décallage de 1 bit à droite ou à gauche...

  7. #7
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    si je ne me trompe pas une multiplication par 2 ou une division par 2 reviens a un décallage de 1 bit à droite ou à gauche...
    Oui pour les nombres positifs, pour les nombres négatifs, il faut voir et tester
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  8. #8
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par jabbounet Voir le message
    si je ne me trompe pas une multiplication par 2 ou une division par 2 reviens a un décallage de 1 bit à droite ou à gauche...
    Cela dépend du signe en effet, d'où le "unsigned int" pour le résultat... Car en signé, un décalage à gauche peut faire changer le signe du nombre, et un décalage à droite fait systématiquement passer le nombre en "positif" (insertion de zéros). Donc, résultats plutôt incohérents de prime abord.

    Tiens, d'ailleurs, j'ai fait une erreur : il faut inverser les instructions "if ().." et "result *= 2", dans le code précédent, j'édite mon message précédent.

    Après, la multiplication par deux est à but pédagogique, ici, c'est pour éviter de faire du code "hardcore"... Sinon, ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    unsigned int bin2dec ( char* bin ) {
     
      unsigned int result = 0 ;
     
      while (*bin)
        result = (result<<1) | (*(bin++))-'0' ;
      return result ;
    }
    J'suis pas franchement convaincu que ce soit plus clair pour un débutant, ne trouvez-vous pas ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut
    je comprend pas trop le fonctionnement de ta fonction.

  10. #10
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par vivi168 Voir le message
    je comprend pas trop le fonctionnement de ta fonction.
    Elle va convertir une chaîne représentant un nombre binaire (exemple : "1001010100101") en son équivalent décimal (ex : "4773").
    Quelle partie ne comprends-tu pas ?
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut
    celle ci


    while (*bin) {

    quelle est la condition d'arrêt de ce while ?

  12. #12
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Attention: techniquement, bin2dec() devrait simplement s'appeler bin2num(), car elle convertit une représentation (ici, binaire) du nombre en le nombre lui-même.

    Un nombre dans un int n'est ni décimal, ni binaire, ni hexadécimal: Il est juste lui-même. C'est seulement quand on en fait une chaîne de caractères qu'on choisit une représentation pour ce nombre.

    Aussi:
    while (*bin) correspond à while (*bin != '\0').
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre Expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Par défaut
    Citation Envoyé par vivi168 Voir le message
    celle ci


    while (*bin) {

    quelle est la condition d'arrêt de ce while ?
    Un chaine de caractère C normallement constitué se termine par 0 ou si tu préfère le caractère '\0'.

    -> parfois tu verra de affectations du style buf[len] = '\0'; pour positionner la fin de chaine.

    (*bin)++ dans la boucle fait déplacer le pointeur sur le prochain élément de la chaine.

    Quand ce pointeur arrive sur la fin de chaine la chaine la valeur de *bin est 0 ==> donc tu sors de la boucle.

  14. #14
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par vivi168 Voir le message
    quelle est la condition d'arrêt de ce while ?
    Le caractère nul de fin de chaîne, comme l'ont dit Médinoc et jabbounet. Test très exactement équivalent à ce qu'à écrit Médinoc : "while (*bin != '\0') { ....", c'est un oubli de ma part de ne pas avoir écrit le test "complet" dans le premier exemple (la force de l'habitude...).
    Je vais éditer dans ce sens le premier exemple.

    Citation Envoyé par Médinoc Voir le message
    Attention: techniquement, bin2dec() devrait simplement s'appeler bin2num(), car elle convertit une représentation (ici, binaire) du nombre en le nombre lui-même.
    Effectivement. C'était plus pour rester "proche" de la demande de l'OP que j'ai nommé la fonction ainsi.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  15. #15
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    (*bin)++ dans la boucle fait déplacer le pointeur sur le prochain élément de la chaine.
    Non. A cause de la priorité des opérateurs (des parenthèses dans ce cas) :

    (*bin)++ accède à la valeur pointée par bin, puis incrémente de 1 cette valeur une fois l'instruction traitée.

    Là, dans l'exemple, il s'agit de :

    *(bin++) , qui accède effectivement à la valeur pointée par bin, puis incrémente de 1 le pointeur après le traitement de l'instruction.

  16. #16
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par défaut
    Citation Envoyé par jeroman Voir le message
    Non. A cause de la priorité des opérateurs (des parenthèses dans ce cas) :

    (*bin)++ accède à la valeur pointée par bin, puis incrémente de 1 cette valeur une fois l'instruction traitée.

    Là, dans l'exemple, il s'agit de :

    *(bin++) , qui accède effectivement à la valeur pointée par bin, puis incrémente de 1 le pointeur après le traitement de l'instruction.
    J'avais écrit (*bin)++ à l'origine, ce qui était faux, c'est bien *(bin++) évidemment. jabbounet a corrigé par automatisme parce qu'il savait ce qui était censé être fait (et non pas ce que j'avais écrit).

    Coder à l'arrache à 21h30, c'est jamais très bon....
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au sérieux, de toutes façons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum adéquat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  17. #17
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France, Haut Rhin (Alsace)

    Informations forums :
    Inscription : Octobre 2009
    Messages : 7
    Par défaut
    ok merci les gars j'ai compris le principe.

Discussions similaires

  1. Réponses: 4
    Dernier message: 29/06/2009, 18h02
  2. Turing : conversion binaire -> baton
    Par DarK Sidious dans le forum Algorithmes et structures de données
    Réponses: 20
    Dernier message: 15/11/2005, 09h43
  3. Problème conversion date
    Par mat.M dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2004, 15h05
  4. Conversion binaire -> hexadecimal
    Par barthelv dans le forum C
    Réponses: 2
    Dernier message: 06/08/2003, 10h40
  5. Conversion binaire -> ASCII
    Par will13013 dans le forum C
    Réponses: 8
    Dernier message: 08/01/2003, 04h12

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo