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++Builder Discussion :

Entier : acc�s bit � bit


Sujet :

C++Builder

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre confirm�

    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    137
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 137
    Par d�faut Entier : acc�s bit � bit
    Bonjour,

    Voila, je veux stocker plusieurs informations binaire dans un entier : le plus simple serait d'avoir acc�s � chaque bit de l'entier et que chaque bit ait un nom pr�cis...

    J'ai d�j� vu cela quelque part mais je ne sais plus o�...

    Merci pour vos r�ponse.
    Sly.

  2. #2
    R�dacteur
    Avatar de Greybird
    Inscrit en
    Juin 2002
    Messages
    673
    D�tails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 673
    Par d�faut
    Bonjour,

    il faut faire une union de struct, si je me souviens bien.

    Cela d�finit ainsi plusieurs fa�ons d'acc�der � une donn�e.

  3. #3
    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
    Les champs de bits :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    struct Bitset
    {
        unsigned char Bit0 : 1,
                      Bit1 : 1,
                      Bit2 : 1,
                      ...
    };
    Tu as aussi std::bitset dans la STL.

  4. #4
    Membre confirm�

    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    137
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 137
    Par d�faut
    Merci beaucoup pour cette r�ponse rapide.

    donc en fait il faut faire �a :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    union TStatus
    {
        int _int;
        Bitset  _bitset;
    }

  5. #5
    CGi
    CGi est d�connect�
    Expert confirm�
    Avatar de CGi
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 061
    D�tails du profil
    Informations personnelles :
    Localisation : France, Allier (Auvergne)

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 061
    Site : http://chgi.developpez.com

    Pourquoi faire simple quand on peut faire compliqu� ? (Jacques Rouxel)

  6. #6
    Membre confirm�

    Homme Profil pro
    Lyc�en
    Inscrit en
    D�cembre 2003
    Messages
    44
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 24
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : Lyc�en
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 44
    Par d�faut
    il est aussi possible d'utiliser les op�rateurs binaires (sur un int ou un char par ex.) comme &, |, << et >>. c'est plus C que C++ mais bien plus efficace.

    un exemple d'application se trouve � http://c.developpez.com/sources/bcb/?page=mathsalgo#hcd.

    cryptonyx

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 412
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 412
    Par d�faut
    Salut !

    Je suis d'accord avec cryptonyx !
    On peut tr�s bien y associer des symboliques pour nommer chaque bit, comme pour la mod�lisation de certains � (M68HC11 etc...) afin de mieux montrer ce que l'on fait !

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    #define bit0 0x01
    #define bit1 0x02
    #define bit2 0x04
    #define bit3 0x08
    #define bit4 0x10
    #define bit5 0x20
    #define bit6 0x40
    #define bit7 0x80
    Eventuellement, on peut aussi d�finir des masques pour au moins une op�ration
    (celle du Clear ou Reset sinon on utilise bitn ^ -1) :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    #define mbit0 0xFE
    #define mbit1 0xFD
    #define mbit2 0xFB
    #define mbit3 0xF7
    #define mbit4 0xEF
    #define mbit5 0xDF
    #define mbit6 0xBF
    #define mbit7 0x7F
    Un fois que c'est fait... ce n'est plus � faire !


    A plus !

    J'ai corrig� l'erreur car j'avais �crit Set � la place de Reset ce qui �tait faux !

  8. #8
    R�dacteur/Mod�rateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par d�faut
    Tout � fait d'accord, et �a doit �tre plus rapide que les champs de bits.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas �tre meilleur que les autres, il faut �tre meilleur que soi." Albert Jacquard
    "Ceux qui savent o� ils ont pos� leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, �a vous changera les id�es !
    Ma page Prolog
    Mes codes sources comment�s

    Mon avatar : La Madeleine � la veilleuse de Georges de La Tour

  9. #9
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par d�faut
    Citation Envoy� par Trap D
    �a doit �tre plus rapide que les champs de bits.
    Pas toujours... Les bitfields peuvent �tre plus optimis�s que les masques binaires. Mais c'est suivant le compilateur, les capacit�s du processeur, le jeu d'instructions, le type de manip d�sir�e, etc...

    Par contre, je n'ai remarqu� de gain en faveurs des bitfields que sur des acc�s pour un seul bit : pour des groupes (genre 4 bits cons�cutifs d'un bitfield), �a semble identique entre les deux m�thodes, du moins si l'on utilise intelligemment les masques.

    Gros gain en faveur des masques, par contre, lors des acc�s � des bits "s�par�s" et non-contigus. C'est aussi le cas dans le cadre d'un parcours bit � bit : on peut automatiser et optimiser plus finement qu'avec les bitfields.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au s�rieux, de toutes fa�ons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum ad�quat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  10. #10
    Membre �m�rite
    Inscrit en
    Juin 2005
    Messages
    644
    D�tails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par d�faut
    je suis nettement en faveur de l'acces avec les op�rateurs logiques et ou, xor, << >>.
    sur du code export� sur micro o� les sources ont �t� recompil�es avec GNU, le champ de bit est support� mais avec une lenteur � toute epreuve!.
    par ailleurs si on commence � avoir des structures avec des array de champ de bits, il commence a �tre incertain de conaitre avec certitude les offset des champs. SizeOf sort des choses parfois etonante comme sizeof( structure ) != somme sizeof( elements de la structure). Il m'a sembl� que l'on avait ce genre de probl�mes si on 'desalignait' les data sur les bytes ou words. comme par exemple mettre 2 bits puis un short puis encore 1 bit...
    J'evite donc ces champs trop 'compilateur dependant' .

  11. #11
    Membre confirm�

    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    137
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 137
    Par d�faut
    Je faisais avant des acces avec les op�rateurs logiques. Mais j'avais vu quelque part (c'�tait donc dans les tips de CGi ) la m�thode des champs de bits et j'avais bien aim�. Je trouve cette m�thode plus propre :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    union TStatus
    {
      struct TBitset
      {
        unsigned char WARNING1 : 1,
                      WARNING2 : 1,
                      ERROR1 : 1,
                      ERROR2 : 1,
                       ...
      };
      TBitset _bitset;
      int _int;
    };
    Au niveau de la vitesse d'acc�s, je m'en fout un peu (� part si �a avait �t� tr�s lent mais ce n'est pas le cas). Et je n'utilise jamais le sizeof... L'inter�t est que mon code est plus propre !

  12. #12
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par d�faut
    Citation Envoy� par j.p.mignot
    SizeOf sort des choses parfois etonante comme sizeof( structure ) != somme sizeof( elements de la structure).
    En fait, c'est normal : la taille par d�faut (et la seule "officielle") d'un entier "bitfield�", c'est le "int"... Donc, c'est 32 bits en g�n�ral, parfois 16 suivant les plate-formes.
    Si tu d�finis ta structure ainsi :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct {
       unsigned char Field1 : 1 ;
       unsigned char Field2 : 2 ;
       unsigned char Field3 : 2 ;
       unsigned char Field4 : 3 ;
    } CCharBitfield ;
    Tu peux croire qu'effectivement, "sizeof(CCharBitfield)==sizeof(unsigned char)==1"... Mais �a peut �tre faux, ce n'est qu'une tol�rance du compilateur, ou une option de compilation qui permettra cette �galit�.
    Seule cette d�claration t'assure l'�galit� quel que soit le compilateur :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    typedef struct {
       int Field1 : 1 ;
       int Field2 : 2 ;
       int Field3 : 2 ;
       int Field4 : 3 ;
       int unused : 8 ;
    #if (sizeof(int)==4)
       int fill   :16 ;
    #endif
    } CIntBitfield ;
    Mais encore faut-il que le pr�processeur accepte les �valuations "sizeof"... Et j'avoue qu'il n'est pas toujours facile de savoir quoi faire des 24 bits qui restent !! ;-)
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au s�rieux, de toutes fa�ons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum ad�quat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  13. #13
    Membre �m�rite
    Inscrit en
    Juin 2005
    Messages
    644
    D�tails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par d�faut
    C'est sur et sur un PC ou la m�moire est "infinie" cela n'est pas trop important quoi que j'ai sauv� des fichiers binaires sous un environnement delphi 3.x autant que je me souvienne qui ont du mal � �tre relu par la suite tant BC++ 6 que delphi 7 du � un autre allignement de variable. On s'en sort mais quand cela arrive chez des clients avec risque de perte de donn�es c'et 1 autre histoire.
    Mais si le code doit �tre port� sur un micro o� la m�moire est compt�e et chaque byte est sujet � n�gociation j'�vite les champs de bits peu c�ntrolables.

  14. #14
    Inactif  
    Avatar de Mac LAK
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    3 893
    D�tails du profil
    Informations personnelles :
    �ge : 51
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 893
    Par d�faut
    Citation Envoy� par j.p.mignot
    Mais si le code doit �tre port� sur un micro o� la m�moire est compt�e et chaque byte est sujet � n�gociation j'�vite les champs de bits peu c�ntrolables.
    Tu sais, mon boulot, c'est surtout et avant tout de l'embarqu�, alors crois-moi, non seulement je connais le probl�me, mais en plus je compatis de tout coeur...
    Et ce n'est pas une vanne : pour avoir impl�ment� plusieurs protocoles de communication, c'est souvent un enfer de faire coller les structures C sur des structure de normes/RFC...

    C'�tait surtout pour t'indiquer que c'est "normal" que le sizeof d'un bitfield soit un peu loufoque... Faut utiliser quelques ruses de sioux (et bien conna�tre sa plate-forme) pour s'en sortir sans risques, mais la compilation conditionnelle reste de rigueur presque � chaque fois.
    Mac LAK.
    ___________________________________________________
    Ne prenez pas la vie trop au s�rieux, de toutes fa�ons, vous n'en sortirez pas vivant.

    Sources et composants Delphi sur mon site, L'antre du Lak.
    Pas de question technique par MP : posez-la dans un nouveau sujet, sur le forum ad�quat.

    Rejoignez-nous sur : Serveur de fichiers [NAS] Le Tableau de bord projets Le groupe de travail ICMO

  15. #15
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    bonjour,
    les probl�mes d'alignement de structures , champ de bits sont facilement r�solvables avec les directives <#pragma> connues de la plupart des compilateurs C et C++

    exemple pour aligner une structure sur un bit il suffit de ...

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #pragma pack(push, 1)  // alignement sur 1 bit
    struct TmoitiedeByte
      {
      unsigned int Bits : 4;
      };
     
    #pragma pack(pop) //avec c++ Builder retour à l'alignement standard Quad Word aligne sur une frontière de 64 bits. Les données dont la taille de type est inférieure à 8 octets sont alignés sur la taille de leur type.
    cordialement
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

  16. #16
    Membre �m�rite
    Inscrit en
    Juin 2005
    Messages
    644
    D�tails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Par d�faut
    OK cela est sur mais que de place perue si on aligne des boolean a 1 bit sur des int � 32 bits!

  17. #17
    Membre Expert
    Avatar de DjmSoftware
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Mars 2002
    Messages
    1 044
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Responsable de compte
    Secteur : High Tech - Op�rateur de t�l�communications

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 044
    Billets dans le blog
    1
    Par d�faut
    bonjour,
    OK cela est sur mais que de place perue si on aligne des boolean a 1 bit sur des int � 32 bits!
    tu n'a pas compris ce que j'ai voulu dire par d�fault l'alignenemnt est sous C++ Builder le Quad Word aligne sur une fronti�re de 64 bits. Les donn�es dont la taille de type est inf�rieure � 8 octets sont align�s sur la taille de leur type.

    en utilisant les directives praga on peut dans son code chnager l'alignement par exemple sous 1 bit avec la directive <#pragma pack(push, 1) >

    cordialement
    vous trouverez mes tutoriels � l'adresse suivante: http://djmsoftware.developpez.com/
    je vous en souhaite une excellente lecture ...

    A lire : Les r�gles du forum

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. [C#] Conversion cha�ne vers entier sign� 8 bits
    Par SesechXP dans le forum Windows Forms
    R�ponses: 2
    Dernier message: 25/09/2006, 14h29
  2. R�ponses: 1
    Dernier message: 27/07/2006, 16h58
  3. Insérer un entier sur 64 bits dans une base ?
    Par DJZiaK dans le forum SQLite
    R�ponses: 1
    Dernier message: 10/05/2005, 17h37
  4. entiers de 64 bits
    Par jmv dans le forum C++
    R�ponses: 11
    Dernier message: 15/09/2004, 20h52
  5. [8086] Affichage d'un entier de 32 bits
    Par elNINIo dans le forum Assembleur
    R�ponses: 12
    Dernier message: 10/05/2003, 20h33

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