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

Langage C++ Discussion :

Représentation binaire d'un nombre -> tableau de booléens


Sujet :

Langage C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Par défaut Représentation binaire d'un nombre -> tableau de booléens
    Bonjour.

    J'ai un problème assez simple et j'aimerai savoir quelle est la méthode la plus rapide (pas la méthode naive qui consiste à diviser mon nombre par des puissances successives de 2) pour remplir un tableau de booléens à partir de la représentation binaire d'un nombre.

    J'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned long long int n // (entier 64 bits)
    bool nbinary[64]
    et je veux remplir nbinary selon la représentation binaire de n (et je veux quelque chose de portable quelque soit l'endianness du système (par exemple nbinary[3] sera toujours associé à 2^3)).

    Par exemple pour n = 13 (en base 2 : 1101), j'aurai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nbinary[0] = true; 
    nbinary[1] = false; 
    nbinary[2] = true; 
    nbinary[3] = true; 
    nbinary[4] jusqu'à nbinary[63] = false;
    Merci beaucoup

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Par défaut
    Bonjour,

    Je veux quelque chose de portable quelque soit l'endianness du système
    On oublie donc le C brut avec des champs de bits.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    typedef union
    {
     unsigned long long value;
     struct
     {
        bool b0:1;
        bool b1:1;
        //..
        bool b62:1;
        bool b63:1;
     };
    }Int64ToBits;
    ( je rigole)

    Dans ce cas pourquoi pas la STL et sa bitset


    Et si c'est pas assez rapide, pourquoi faire un tableau de boolean ?
    Faire simplement le test sur l'entier avec les opérations binaires <valeur> & <mask> n'est ce pas suffisant ?
    mask = 1 << <position du bit à tester>;
    bool : true = toute valeur différente de 0

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 5
    Par défaut
    Si le but est vraiment de remplir un tableau de booleens, tu vas bien être obligé de faire des multiplications ou des divisions par 2 pour obtenir individuellement les bits. Mais bon comme une division ou une multiplication par 2 est instantanée(c'est un bitshift, quand on fait a / 2 le compilateur fait a >> 1 et a * 2 se transforme en a << 1 avec les optimisations). Je vois pas vraiment comment on peut avoir plus rapide que ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int a = 13;
    bool b[32];
    int n = 0;
    for (n = 0; n < 32; ++n)
    {
    	b[n] = a & 1;
    	a >>= 1;
    }

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Pourquoi ne pas réaliser un simple mask ?
    Ca permet de garder le nombre initial pour les calculs, sans devoir reparser les booleans et le recréer.
    Et c'est instantané.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define GETBIT(a,n) ((1<<(n))&(a))
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre émérite
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Par défaut
    Et en plus, c'est très probablement plus rapide qu'une recherche dans un tableau de booléens, même stockés en mémoire. (histoire de variable registre)

Discussions similaires

  1. conversion binaire-décimal sans utiliser le tableau
    Par ahmed doua dans le forum Algorithmes et structures de données
    Réponses: 13
    Dernier message: 13/03/2006, 10h54
  2. représentation binaire-->entier
    Par felicity dans le forum C
    Réponses: 6
    Dernier message: 17/01/2006, 20h57
  3. Réponses: 1
    Dernier message: 11/09/2005, 02h04
  4. CRITERIA - Représentation binaire d'un nombre décimal signé.
    Par RamDevTeam dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 10/08/2005, 14h56

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