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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    36
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    Par d�faut
    ben si tu peux utiliser la stl, utilise des bitset

  4. #4
    Membre chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    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

  5. #5
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    36
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    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 �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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
    Membre averti
    Inscrit en
    Juin 2005
    Messages
    36
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 36
    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 : 51
    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
    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 �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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 : 51
    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
    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 chevronn� Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    D�tails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    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

  12. #12
    Membre �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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 : 51
    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
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 : 51
    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
    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 confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    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>.

  17. #17
    Membre �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    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 �clair�
    Avatar de Zenol
    Homme Profil pro
    �tudiant
    Inscrit en
    Novembre 2004
    Messages
    812
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 35
    Localisation : France

    Informations professionnelles :
    Activit� : �tudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 812
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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