Bits durch struct schieben



  • Hallo,

    ich hätte da mal ein Problem 🤡

    ich möchte gerne eine Bitfolge durch ein struct "aufteilen" so dach ich einfach
    auf einen bestimmtes feld zugreifen kann.

    z.B.

    struct 
      {
        unsigned char a:1;
        unsigned char b:4;
        unsigned char c:2;
        unsigned char d:8;
      }x;
    

    -- schnipp --

    x.a=1;
    x<<=1;
    x.a=0;
    x<<=1;
    usw...
    

    So geht es nicht 😃 das hab ich schon festgestellt.
    Aber geht es irgendwie ??

    Schonmal danke für Tips

    Gruß

    Christian



  • Was genau geht nicht? Bringt dir der Compiler einen Fehler oder funktioniert es nicht so, wie du dir es gedacht hast?

    Eine kleine Erklärung was du GENAU willst fehlt mir noch. Ok du willst auf die einzelnen Felder zugreifen (Du hast also ein WORD in Bitfelder zerlegt), aber was willst du uns mit dem zweiten Codeteil zeigen?



  • Ok sorry.
    Ein bischen Hintergrund zu der Sache.
    Es geht um einen Mikrocontroller.

    Ich lese an einem Eingang 60 Bit ein.
    z.B. hier DCF Signal. Nun will ich diesen Bit STREAM zerlegen
    in unterschiedlich große Felder.

    Daher dachte ich mir ich lege ein Struct an was genau meinen Feldern entspricht.
    Kommt jetzt ein Bit am Port an setze ich x.a = Bitwert und verschiebe ihn um eins im Struct lese dann den nächsten wert ein usw. usw.
    Wenn all 60 Bit eingelesen sind könnte ich dann genau auf z.B.
    x.c zugreifen und würde die dazugehörigen 2 Bit aus dem Datenstrom zurückbekommen.

    Ich hoffe das mach das ganze etwas anschaulich 😕

    Als fehlermeldung bekomme ich vom compiler : invalid operands to binary

    Gruß und Danke



  • ToniT schrieb:

    Daher dachte ich mir ich lege ein Struct an was genau meinen Feldern entspricht.
    Kommt jetzt ein Bit am Port an setze ich x.a = Bitwert und verschiebe ihn um eins im Struct lese dann den nächsten wert ein usw. usw.

    Versteh ich nicht. Was willst Du denn mit den Bitwerten machen, in welche Repräsentation willst Du sie überführen? Wozu brauchst Du dann eine struct? Wieso reicht kein unsigned16 (oder ähnliches)?

    Als fehlermeldung bekomme ich vom compiler : invalid operands to binary

    Das liegt daran, das Du einen Shiftoperator auf ein Objekt der Struktur losgelassen hast. In C kann man keine Operatoren überladen oder umdefinieren.



  • Probiers mal damit:

    typedef struct bitfelder
    {
        unsigned int a:1; 
        unsigned int b:4; 
        unsigned int c:2; 
        unsigned int d:8;
        unsigned int dummy:1; //Dummy-Variable damit auch das letzte Byte voll ist!
    }bitfelder;
    
    typedef union daten
    {
       bitfelder felder;
       unsigned int alles;
    }daten;
    
    ...
    
    daten buffer;
    
    buffer.felder.a = 1;
    buffer.alles <<= 1;
    //usw.
    


  • @AJ :
    Das ist es !!!
    Danke funktioniert !!!
    Muss jetzt mal in mich gehen um es zu verstehen aber es scheint zu funktionieren !!!

    🙂 🙂



  • Was hat es mit diesem a:1 usw. auf sich?
    Sowas hab ich noch nie gesehen.



  • Der kleinste Datentyp in C(++) ist normalerweise ein Byte groß. Damit man aber auch auf einzelne Bits zugriff haben kann, gibt es diese Erweiterung mit dem : . Die Zahl dahinter gibt an wieviele Bits du reservieren willst. Wobei man darauf achten sollte, dass der Typ vor dem Variablennamen unsigned int ist. Ich weiß nicht sicher ob es Probleme mit anderen Datentypen wie long oder char gibt, aber ich habs gelernt, dass man unsigned int verwenden soll. Außerdem sollte man drauf achten, dass man immer volle Bytes zusammenbekommt, auch wenn man dann nur noch eine dummy-Variable hat. Die Summe der Zahlen hinter dem : sollte also durch 8 teilbar sein.

    Beispiel:

    struct byte
    {
       unsigned int bit1:4; //4 Bit reservieren Werte: 0 - 15
       unsigned int bit2:2; //2 Bit reservieren Werte: 0 - 3
       unsigned int bit3:1; //1 Bit reservieren Werte: 0 - 1
       unsigned int bit4:1; //und nochmal 1 Bit reservieren, um auch das Byte vollzumachen
    };
    

Anmelden zum Antworten