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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 830
    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 830
    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 ?

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