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 :

Comment déclarer une variable binaire?


Sujet :

C++

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Comment déclarer une variable binaire?
    Salut!

    J'ai essayé avec Dev-C++ de déclarer une variable binaire comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned char a=00001100b
    mais cela ne marche pas.

    J'ai cherché sur les FAQ C et C++ et rien.

    Sur Google pas grand chose sauf ça et là des pages indiquant que déclarer des variables binaires est IMPOSSIBLE!

    Confirmé vous cela?

    Et si ça n'est pas prévu en standard sur GCC y a t'il une extension qui palie à ce manque?

    Merci de toutes vos réponses!

  2. #2
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Qu'entends-tu par déclarer une variable binaire ? De toute façon au niveau du système tout est binaire .

    Si tu veux assigner une variable de type entier par exemple avec un code binaire ou vice-versa, c'est à dire modifier la représentation (c'est la seule chose que tu peux faire !), il y a des exemples dans la FAQ -> http://c.developpez.com/faq/cpp/?pag...ferentes_bases .

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ce que je voudrais c'est pouvoir tout manipuler en binaire:
    ecrire:01010101+10001000 et qu'il m'interprete cela
    comme 169 et 135 et pas comme des milliers!

    C'est pour éviter de toujours convertir mentalement un nombre comme 10011101,
    représentant une série de flags par exemple,en son équivalent décimal.

    Mais également pour qu'il m'affiche "a" sous forme binaire dans un printf
    pour pouvoir visualiser une série de flag par exemple.

    etc...

  4. #4
    Membre éprouvé

    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2005
    Messages
    634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2005
    Messages : 634
    Points : 1 205
    Points
    1 205
    Par défaut
    Les opérateurs bit à bit ?

    Et pour la réprésentation je t'ai déjà donné le lien, cherche un peu dans cette page.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    En effet, de base, tu ne peux rien écrire directement en binaire dans le compilo.

    Mais l'hexadécimal est une bonne alternative. (par contre, j'ai un préjugé contre l'octal que je considère à bannir, il ressemble trop au décimal. L'octal, c'est bon pour les permissions de fichier sous unxoïde et à rien d'autre)

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    J'ai voulu tester avec bitset mais il n'est pas fourni avec Dev-C++.

    Y a t'il une version de bitset pour Dev-C++(GCC)?

    Merci.

    EDIT: J'ai rien dit!
    Le projet en cour était un .c et pas .cpp donc normal.

  7. #7
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ca marche bien mais comment faire des opérations arithmétiques sans passer par la représentation décimale?

  8. #8
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Je crois que tu vas devoir implémenter ta propre machinerie

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Là, je ne vois pas ce que tu veux dire: l'ordinateur ne passe JAMAIS par une représentation décimale pour les opérations arithmétiques sur les entiers.

    Il passe par la représentation interne, en binaire dans ses registres.
    Par contre, si tu veux entrer des données binaires, tu peux transformer une chaîne de caractère "0101010001110" en binaire avec strtol de la bibliothèque standard C, mais tu n'as rien pour afficher en binaire (mais tu peux afficher en hexadécimal (un caractère pour 4bits) ou en octal (chaque chiffre équivaut à 3bits))
    01010101 + 10001000 en hexa: 0x55 + 0x88 (0101-0101 + 1000-1000)
    01010101 + 10001000 en octal: 0125 + 0210 (01-010-101 + 10-001-000)

    10011101 en hexa: 0x9D (1001-1101)
    10011101 en octal: 0135 (10-011-101)

    10101010001110 en hexa: 0x2A8E (10-1010-1000-1110)
    10101010001110 en octal: 025216 (10-101-010-001-110)


    Exemple pour des flags en hexa:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #define UN_FLAG              0x0001 //  1 en hexa
    #define UN_AUTRE_FLAG        0x0002 //  2 en hexa
    #define ENCORE_UN_FLAG       0x0004 //  4 en hexa
    #define ENCORE_UN_AUTRE_FLAG 0x0008 //  8 en hexa
    #define UN_CINQUIEME_FLAG    0x0010 // 16 en hexa
     
    //Ainsi, 0x001F correspond à tous les flags réglés.
    //0x0013 correspond aux flags 0x0001, 0x0002 et 0x0010
    Et la même chose en octal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    //ATTENTION: Un le compilo considère qu'un nombre est en octal s'il commence par un zéro
    //(ceci peut être source d'erreurs)
    #define UN_FLAG              001 //  1 en octal
    #define UN_AUTRE_FLAG        002 //  2 en octal
    #define ENCORE_UN_FLAG       004 //  4 en octal
    #define ENCORE_UN_AUTRE_FLAG 010 //  8 en octal
    #define UN_CINQUIEME_FLAG    020 // 16 en octal
     
    //Ainsi, 027 correspond à tous les flags réglés.
    //023 correspond aux flags 01, 02 et 020
    Tu peux tester, les valeurs seront égales

  10. #10
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ce que je veux dire c'est écrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bitset <8> a(string("10101010"));
    a+=01010101;
    Mais ça marche pas!

    Ce que je veux dire par passer en décimal c'est faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    bitset <8> a(string("10101010"));
    unsigned long  b=a.to_ulong();
    b+=85;
    bitset <8> c(b);
    cout<<c;
    ou un truc de ce genre.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    dans ce cas, un conseil, utilise directement un entier et passe par de l'hexa ou de l'octal: C'est un pis-aller, mais ça marche et c'est très utilisé.

  12. #12
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Ce que tu peux peut-être faire

    c'est ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::bitset< 8 > a (std::string("10101010"));
    a+= std::bitset< 8 > b (std::string("10010001"));
    Il faut qu'il y ait une surchage de l'opérateur '+='.

  13. #13
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    C'est un des premiers trucs que j'ai essayé mais il n'y a pas l'opérateur +=
    dans la classe bitset; et pas de + du tout d'ailleurs.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 07/03/2007, 08h34
  2. [Date] Comment déclarer une variable de la forme (year-month-day)?
    Par adil_vpb dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 06/03/2007, 13h51
  3. Réponses: 5
    Dernier message: 20/09/2005, 22h48

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