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 :

Conversion Décimal -> Binaire 32 Bits


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Par défaut Conversion Décimal -> Binaire 32 Bits
    Bonjour à tous!
    Je viens de découvrir se Forum par le biais d'un camarade qui a sollicité votre aide et a obtenu une réponse rapide et très pertinente!

    Je vous explique: Je code une calculatrice avec le Lycée.
    J'en suis arrivé a convertir du décimal en binaire. La conversion marche parfaitement lorsque je passe du décimal 32 bits au Binaire 16 ou 8 bits.
    Par contre lorsque j'essaye de passer du décimal 32 bits au binaire 32 bits j'ai des valeurs fausses..

    Précisions:
    -Variable bits initialisée a 32.

    Voila le code de ma fonction de conversion Décimal vers Binaire:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    void DecVersBin()
    {
    int a=(int)Form1->Edit1->Text.ToDouble();
    int i, masque;
     
    Form1->Edit1->Clear();
     
            for(i=0;i<bits;i++)
            {
                    if(bits==32)
                    {
                    masque=0x80000000;
                    }
                    if(bits==16)
                    {
                    masque=0x8000;
                    }
                    if(bits==8)
                    {
                    masque=0x80;
                    }
     
                    if((a&(masque>>i))==0)
                    {
                    Form1->Edit1->Text=Form1->Edit1->Text+'0';
                    }
                    else
                    {
                    Form1->Edit1->Text=Form1->Edit1->Text+'1';
                    }
            }
     
    }
    Voila le code de ma ComboBox pour choisir les bits:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    void __fastcall TForm1::ComboBox3Change(TObject *Sender)
    //OnChange de la ComboBox 32/16/8 bits
    {
     
            if(Form1->ComboBox3->Text=="32 bits")
            {
                    bits=32;
            }
            if(Form1->ComboBox3->Text=="16 bits")
            {
                    bits=16;
            }
            if(Form1->ComboBox3->Text=="8 bits")
            {
                    bits=8;
            }
     
     
            if (ComboBox2->Text=="Héxadécimal" && ComboBox3->Text=="32 bits")
            {
                    if(bits==16)
                    {
                    Form1->Edit1->Text="0000"+Form1->Edit1->Text.SubString(1,4);
                    bits=32;
                    }
                    else if(bits==8)
                    {
                    Form1->Edit1->Text="000000"+Form1->Edit1->Text.SubString(1,2);
                    bits=32;
                    }
            }
     
            if (ComboBox2->Text=="Héxadécimal" && ComboBox3->Text=="16 bits")
            {
                    if(bits==32)
                    {
                    Form1->Edit1->Text=Form1->Edit1->Text.SubString(5,4);
                    bits=16;
                    }
                    else if(bits==8)
                    {
                    Form1->Edit1->Text="00"+Form1->Edit1->Text.SubString(1,2);
                    bits=16;
                    }
            }
     
            if (ComboBox2->Text=="Héxadécimal" && ComboBox3->Text=="8 bits")
            {
                    if(bits==32)
                    {
                    Form1->Edit1->Text=Form1->Edit1->Text.SubString(7,2);
                    bits=8;
                    }
                    else if(bits==16)
                    {
                    Form1->Edit1->Text=Form1->Edit1->Text.SubString(3,2);
                    bits=8;
                    }
            }
     
    }
    Voila le code de ma ComboBox pour choisir Décimal / Hexa / Bin:
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    void __fastcall TForm1::ComboBox2Change(TObject *Sender)
    //OnChange de la ComboBox Déc/Hex
    {
            if (ComboBox2->Text=="Décimal" && base=='H')
            {
                    HexVersDec();
                    base='D';
            }
     
            /*if (ComboBox2->Text=="Décimal" && base=='B')
            {
                    BinVersDec();
                    base='D';
            }*/
     
            if (ComboBox2->Text=="Héxadécimal" && base=='D')
            {
                    DecVersHex();
                    base='H';
            }
     
            /*if (ComboBox2->Text=="Héxadécimal" && base=='B')
            {
                    BinVersHex();
                    base='H';
            }*/
     
            if (ComboBox2->Text=="Binaire" && base=='D')
            {
                    DecVersBin();
                    base='B';
            }
     
            /*if (ComboBox2->Text=="Binaire" && base=='H')
            {
                    HexVersBin();
                    base='B';
            }*/
    }
    Par exemple pour convertir 9 en binaire j'obtient:
    en 32 bits: 00000000000000000000000000001111
    en 16 bits: 0000000000001001
    en 8 bits: 00001001

    Petit Sceen d'ensemble:Nom : Sans titre 1.jpg
Affichages : 1745
Taille : 202,7 Ko

    Merci d'avance pour votre aide précieuse.

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 636
    Par défaut
    Salut, et bienvenue sur le forum

    Désolé, mais sans le code de la fonction DecVersHex, on ne pourras pas grand chose pour toi

    Au passage :
    Si tu es tout à fait débutant, je te conseillerais de commencer par coder des choses "simples" en console, plutôt que d'utiliser directement la vcl de borland.

    C'est peut etre moins sexy, je te l'accorde, mais cela te permettra de prendre directement de bonnes habitudes et de te familiariser avec le C++

    C'est d'autant plus vrai que, dés que tu utilises une IHM, elle vient généralement avec sa propre implémentation de tout un ensemble de concepts (à commencer par les chaines de caractères et les différentes collections comme les tableaux) qui ont parfois un comportement assez éloigné de ce qui est utilisable en C++ "pur".

    Sinon, il t'intéressera peut être de savoir que les composants de type combobox ont généralement une fonction nommée seletedIndex (ou parfois simplement index!) qui permet d'obtenir une valeur numérique correspondant à la ligne sélectionnée (généralement, la première ligne est représentée par l'index 0, la deuxième par la ligne 1 et ainsi de suite... l'absence de sélection étant représentée par l'index -1)

    C'est une valeur numérique, donc cela se compare beaucoup plus facilement, et tu peux même utiliser la syntax des switch...case que je vais te laisser chercher par toi même (où serait le plaisir autrement )
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Avril 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2013
    Messages : 77
    Par défaut
    Bonjour,

    Alors, quand tu es sur le 32bits, le masque vaut 0x80000000.
    Or, quand tu fais le décalage, le compilateur va mettre des 1 devant, car il considère que le nombre est négatif ; c'est pourquoi ton résultat est faux.
    Ainsi, il faut que tu déclares la variable masque en non signé.

  4. #4
    Membre chevronné
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par défaut
    Citation Envoyé par alyma Voir le message
    Or, quand tu fais le décalage, le compilateur va mettre des 1 devant, car il considère que le nombre est négatif
    Ou pas.
    C’est implementation-defined
    Citation Envoyé par Working Draft, Standard for Programming Language C ++
    The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a non-negative value, the value of the result is the integral part of the quotient of E1/2E2 . If E1 has a signed type and a negative value, the resulting value is implementation-defined.
    Citation Envoyé par alyma Voir le message
    Ainsi, il faut que tu déclares la variable masque en non signé.
    Oui, ça serait déjà un bon point.

  5. #5
    Membre averti
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Par défaut
    Bonjour,

    @koala01

    Merci de ta réponse!
    Justement, je début en c++ avec l'école sur un projet calculatrice qui utilise le logiciel que tu as cité

    @all
    int ce n'est pas un type de variable non signé ?
    j'ai testé le code d'un ami, ce n'est pas ma fonction DecVersBin qui pause problème car son code ne marchais pas aussi sur mon projet, mais marche sur le siens..

    Voila le code de ma fonction DecVersHex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void DecVersHex()
    {
            Form1->Edit1->Text=Form1->Edit1->Text.IntToHex((int)Form1->Edit1->Text.ToDouble(),8);
    }
    Voila le code de ma fonction HexVersDec
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    void HexVersDec()
    {
    int i, nb32=0, L=8, intcar;
    char car;
            for(i=0;i<8;i++)
            {
                    if(Form1->Edit1->Text.c_str()[L-i-1]>=0)
                    {
                    car=Form1->Edit1->Text.c_str()[L-i-1];
                    }
                    else
                    {
                    car='0';
                    }
                            if(car<'A')
                            {
                            car=car-'0';
                            }
                            else
                            {
                                    if(car<'a')
                                    {
                                    car=car-'A'+10;
                                    }
                                    else
                                    {
                                    car=car-'a'+10;
                                    }
                            }
                    intcar=car;
                    nb32=nb32+(intcar<<(4*i));
            }
            Form1->Edit1->Text=nb32;
    }
    thx all!

  6. #6
    Membre actif
    Profil pro
    Ingénieur
    Inscrit en
    Avril 2013
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Avril 2013
    Messages : 77
    Par défaut
    As tu essayé en déclarant ta variable "masque" en unsigned int?

  7. #7
    Membre averti
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Par défaut
    Merci beaucoup à tous!

    C’était bien le unsigned int..
    Bizarre car chez mes camarades ça marche sans le unsigned..

    Encore un grand merci!

  8. #8
    Membre chevronné
    Inscrit en
    Juillet 2012
    Messages
    231
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 231
    Par défaut
    Citation Envoyé par algerino77 Voir le message
    C’était bien le unsigned int..
    Bizarre car chez mes camarades ça marche sans le unsigned..
    Pas surprenant.
    Le résultat est implementation-defined, donc ça va dépendre du compilateur utilisé, éventuellement de sa version et de la plateforme sous-jacente.

  9. #9
    Membre averti
    Homme Profil pro
    Technicien réseaux et télécoms
    Inscrit en
    Octobre 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien réseaux et télécoms
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 29
    Par défaut
    Bon a savoir

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. conversion du décimal au binaire
    Par souzen dans le forum Débuter
    Réponses: 13
    Dernier message: 28/12/2018, 09h17
  2. conversion décimal vers binaire 32 bit
    Par Oscar02 dans le forum Débuter
    Réponses: 4
    Dernier message: 11/05/2014, 02h12
  3. Réponses: 3
    Dernier message: 28/12/2006, 15h06
  4. Conversion Décimal -> Binaire
    Par Z-Vegeta dans le forum Pascal
    Réponses: 2
    Dernier message: 22/12/2006, 23h10
  5. Algo Conversion Décimal -> Binaire
    Par MisterTee dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 23/02/2006, 22h53

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