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 :

Type bool, le coder sur 1bit


Sujet :

C++

  1. #1
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut Type bool, le coder sur 1bit
    Bonjour, j'ai a travailler sur beaucoup de bool, hor d'apprès ce que j'ai comprit ils sont coder sur 8bits, mais pour faire plus d'économies un codage sur 1bit sufirais. J'aimerais savoir comment vous vous y prendriez pour faire un nouveau type bool qui se raproche le plus possible par son utilisation du type bool c++, mais coder sur 1bit.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    ben, je crois bien que les structures champs de bits marchent en C++... À moins qu'il n'y aît déjà des classes "bitfield"...
    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.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Points : 28
    Points
    28
    Par défaut
    ben si tu peux utiliser la stl, utilise des bitset

  4. #4
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    La solution serais efficace si tu avais plusieurs bool a gerer.

    tu utilise un int (32 bits) et tu travailles directement sur les bits de ton int pour gerer tout tes bool (premier bit = premier bool, deuxieme bit = deuxieme bool etc ...) en utilisant les operateur << , >> , & et |

    exemple :

    #define SHIFT_BOOL1 4 //BOOL1 est code sur le quatrieme bit
    #define BOOL1 (1 << SHIFT_BOOL1)

    int monInt = 0 ;

    mettre BOOL1 a true
    monInt |= BOOL1

    mettre BOOL1 a false
    monInt &= ~BOOL1

    savoir la valeur de BOOL
    return (monInt & BOOL1 ) >> SHIFT_BOOL1

    mais cette solution est pratique lorsque tu as beaucoup de bool a gerer et que tu ne veut pas multiplier les bool. Si tu en a peu je te conseil d'utiliser bool.

    XXiemeciel
    XXiemeciel

  5. #5
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Points : 28
    Points
    28
    Par défaut Re: Type bool, le coder sur 1bit
    Citation Envoyé par JC_Master
    Bonjour, j'ai a travailler sur beaucoup de bool,

  6. #6
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    xxiemeciel > En fait, je pensser créer une class BOOL qui gèrerais toute els opérations ^^
    En effet(Oui je sais sa fait un peut rédaction de francais...), je travaille sur beaucoup de bool, 30^3 pour mes teste, mais j'aimerais travailler sur 300^3 sans que mon ordi rame trop(Je n'arive pas a charger 100^3 bool normale)
    Sinon je me demendais quel opérateur utiliser pour récupèrer le résultat. Je pourais faire quelque chose du style :
    dynamic_bool TheVar;
    std::cout << TheVar() << std::endl; ou std::cout << TheVar[] << std::endl;
    vinny_the_true > Ralala, très constructife :p

    Edit : Pour infos, la variable la plus grosse, c'est bien le double non? Combien peut'il contenire de bits? ^^
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  7. #7
    Nouveau membre du Club
    Inscrit en
    Juin 2005
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Points : 28
    Points
    28
    Par défaut
    vinny_the_true > Ralala, très constructife :p[/quote]

    Hum, regarde un soupçon plus haut et tu verras un autre post, un peu plus constructif
    J'y mentionnais les std::bitset donc. Ils sont on-ne-peut plus simples d'utilisation et chaque bit fait office de booléen accessible par simple []

    En ce qui concerne les double, je crois que c'est 8 octets sur une machine 32bits. Je doute que ce soit 16 sur une 64....
    Mais n'étant pas très au fait de ces tailles de variables, il ne vaut mieux pas trop se reposer sur mon avis

    Ok, je viens de m'amuser a bricoler une petite classe template qui crée un univers de booléens à l'aide des std::bitset. Le résultat est plutôt concluant, j'ai simplement eu un petit souci de mémoire virtuelle en mode debug avec un univers de 5000^3 booléens (mais qui vient certainement plus de l'accès aux données, puisque l'erreur survient après plusieurs milliards d'accès en écriture/lecture aux valeurs) . Avec 500^3 ça passe très bien 8)

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    std::bitset est bien si tu connais le nombre de données à la compilation.

    Si ce n'est pas le cas, tu peux utiliser un vector<bool> (qui est optimisé en terme de place, même si du coup il y a une différence entre un vector<bool> et un vector<autreChose>, mais la différence ne devrait pas trop se voir dans un programme "classique").
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    vinny_the_true>Je ne conais pas std::bitset ^^
    JolyLoic>Sinon, le nombre de bool est pouras être modifier a la compilation. J'ai réfléchi a créer une class qui ferais cela mais je ne voit pas trop comment faire. Je pensais définir un int static qui contiendrais le n° du dernier bit utiliser, mais imaginons que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DynamicBool var1 = new DynamicBool(true);
    DynamicBool var2 = false;
    delete var1;//Conpteur décrémenter de 1 dans la classe
    DynamicBool var3;//Prend le bit de var2?!
    C'est plutot problèmatique... Surout que ceci se produit a chaque itération, soit au minimume une bonne disaine de fois, et au maximume une infinitée ^^

    Sinon en quoi utiliser un vecteur de bool peut optimiser l'espace mémoire?
    (En fait sa rejoin mon histoire des tableau 3D de bool, et donc de mon JDLV3D, pour ceux qui on lut ces deux posts)
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Parce que le template vector est spécialisé pour gérer les bool de manière spécifique et compacte. Elle gère automatiquement les masquages de bits nécessaires pour lire/écrire l'information.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Re,

    Si tu veux travailler sur des gros tableau de bool en utilisant juste un bit par bool il existe des macros pour travailler sur chaque bit d'un char*

    dans le code suivant Buffer est un (char*) qui correspond a la taille de buffer (tu peux mettre dans ton buffer un tableu de n'importe quelle dimension) et i correspond a l'offset pour acceder a l'element i de ton buffer (i etant le ieme Bit et non pas la position i avec l'operateur[] )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    #define IsBitSet(Buffer,i) (((pData)[(i) >> 3] & (0x80 >> ((i) & 0x07))))
     
    #define SetBit(Buffer,i)   (pData)[(i) >> 3] |= 0x80 >> ((i) & 0x07)
     
    #define ClearBit(Buffer,i) (pData)[(i) >> 3] &= ~(0x80 >> ((i) & 0x07))
    tu peux ensuite tout a fait recreer des macro prenant une position x,y,z au lieu de l'offset et calculer l'offset a chaque appel.

    XXiemeciel
    XXiemeciel

  12. #12
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Oula, je n'ai aps tout comprit XD
    Buffer est le tableau qui contien des variables de BOOL? Ou c'est un nombre qui contient le nombre d'élément d'un autre tableau qui contient les bits...; *Perdu*
    Je supose que pData c'est que tu a oublier de changer le nom en Buffer?
    Par contre je suis perdu dans la suite de manipulation. Esque tu pourais me les détailler(On décale les bits de x de n rand vers la droite, puis on aplique un OU a partir du masque...)

    En tout cas merci de m'aider pour ce problème.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  13. #13
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Qu'est-ce qui ne va pas dans les vector<bool> ? C'est direct, clair, ne demande pas à utiliser des macros à la noix (d'ailleurs, pourquoi des macros et pas des fonctions ?)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    vector<bool> toto(100, true);
     
    toto[42]=true;
    if(toto[10])
      //...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  14. #14
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    L'optimisation des vector<bool> est-elle indiquée dans la norme ? Il me semblait vaguement avoir lu quelque chose indiquant que celle-ci tendait à être supprimée, pour des histoires d'homogénéité avec les autres types de vector.

    Par exemple on ne pourra pas faire ça avec un vector<bool> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Fonction(bool* Array, std::size_t Size);
     
    std::vector<bool> Tab;
    Fonction(&Tab[0], Tab.size());

  15. #15
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Effectivement, cette optimisation de vector<bool> fait que vector<bool> n'est pas un vector comme les autres. Il n'en reste pas moins qu'elle est imposée dans la norme, et qu'à mon avis, ce n'est pas près de changer.

    C'est une erreur d'avoir fait ainsi, mais maintenant qu'elle est faite, la corriger briserait la compatibilité.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Loulou24
    L'optimisation des vector<bool> est-elle indiquée dans la norme ?
    Oui.

    Il me semblait vaguement avoir lu quelque chose indiquant que celle-ci tendait à être supprimée, pour des histoires d'homogénéité avec les autres types de vector.
    J'ai le même souvenir. Mais je suis incapable de dire si c'était une proposition formelle ou pas ni comment ça a été accueilli.

    Par exemple on ne pourra pas faire ça avec un vector<bool> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Fonction(bool* Array, std::size_t Size);
     
    std::vector<bool> Tab;
    Fonction(&Tab[0], Tab.size());
    Non, c'est l'état actuel: on ne peut pas faire ça avec un vector<bool>.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  17. #17
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    J'ai pas de chance, ma fonction suit exactement le même chéma XD
    void CopyTab(bool ****TabPrim, bool Val)
    Mais l'optimisation, c'est quoi? Les vecteur bool ont quoi de diférent des autres vecteures???

    Sinon des macros plutot que des fonctions car c'est plus rapide, sa évite la copie de valeur pour la fonction ECT.
    C'est un peut commme une fonction inline.
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  18. #18
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Mais l'optimisation, c'est quoi? Les vecteur bool ont quoi de diférent des autres vecteures???
    Citation Envoyé par JolyLoic
    Parce que le template vector est spécialisé pour gérer les bool de manière spécifique et compacte. Elle gère automatiquement les masquages de bits nécessaires pour lire/écrire l'information.
    Sinon des macros plutot que des fonctions car c'est plus rapide, sa évite la copie de valeur pour la fonction ECT.
    C'est un peut commme une fonction inline.
    Justement, ce qu'on sous-entendait c'était d'utiliser des fonctions inline. Le gain en perfs est le même, et tu vires les désagréments inhérents aux macros.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void CopyTab(bool ****TabPrim, bool Val)
    Si l'utilisation de cette fonction telle quelle est obligatoire je crois que ça coupe court aux débats : il te faudra un tableau dynamique de tableaux dynamiques de tableaux dynamiques ; je ne pense pas qu'une structure plus évoluée de tableaux à 3 dimensions soit convertissable en ***.

  19. #19
    Membre éprouvé
    Avatar de Zenol
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    Points : 1 054
    Points
    1 054
    Par défaut
    Non je peut changer le premier paramêttre.

    En fait, vector<bool> gère tous seul 1bit=1 variable???
    Parce que si c'est sa alors pas la peine que je continu de chercher?
    Mes articles Développez | Dernier article : Raytracer en haskell
    Network library : SedNL | Zenol's Blog : http://zenol.fr

    N'oubliez pas de consulter la FAQ et les cours et tutoriels.

  20. #20
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    oui, c'est ça.
    Par contre, tu ne pourras pas vraiment utiliser de pointeurs vers UN bit (puisque les pointeurs sont au niveau octet minimum).

    Donc, si tu n'as pas besoin de passer l'adresse d'UN bool à unf fonction ou de la mémoriser dans une variable, tu n'auras pas de problèmes.
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. 3 question sur le "type BOOL" en C
    Par Biosox dans le forum C
    Réponses: 9
    Dernier message: 29/03/2006, 10h18
  2. type bool en C
    Par rbanana dans le forum C
    Réponses: 9
    Dernier message: 17/03/2006, 20h50
  3. Question sur le type bool
    Par gentox dans le forum C
    Réponses: 3
    Dernier message: 05/12/2005, 18h55
  4. [Batch] Coder sur plusieurs lignes
    Par Jokeur dans le forum Windows
    Réponses: 6
    Dernier message: 08/07/2005, 20h16
  5. Passage du type integer vers varchar sur clé primaire
    Par GMI dans le forum Bases de données
    Réponses: 2
    Dernier message: 07/01/2005, 09h09

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