Komfortabler Zugriff auf Bits



  • Hallo!

    Ich muss Daten in einen Minispeicher schreiben, sodass ich ziemlich sparen muss.
    Würde ich z.B. ein Datenfeld haben, das den Wertebereich 0-59 hat, so genügen mir hierzu ja 6 bits.

    Nun möchte ich aber möglichst komfortabel auf diese Bits zugreifen.

    Eine Möglichkeit wären ja Bitfelder.
    Problem: wenn sich ein Datenfeld nicht im entsprechenden Datentyp mehr ausgeht (wie z.B. feld3 im ersten 4 byte Block), so wird der nächste Datentyp verwendet. Es gehen also Bits verloren, statt dass Felder vom einen UINT32 zum nächsten UINT32 reichen können.

    struct Bitfield
    {
     // ein 4 byte Block
     UINT32 feld1 :8;
     UINT32 feld2 :20;
     // nur 28bit verwendet, 4bit verloren 
    
     // ein 4 byte Block
     UINT32 feld3 :20;
     UINT32 feld4 :12;
    };
    

    Die Alternativen sind aber auch nicht gerade berauschend, nämlich bitweise Operatoren wie & oder | auf das Bitfeld anwenden. Oder gar irgendwelche komischen Makros wie man es im Linux Kernel ziemlich oft findet.

    Sonst irgendwelche Ideen?


  • Mod

    lalalal schrieb:

    Sonst irgendwelche Ideen?

    Du wirst für dein Vorhaben nicht um die Bitoperationen herum kommen. Und andere Abstraktionsmittel als Makros und Funktionen gibt es in C nun einmal nicht.



  • SeppJ schrieb:

    lalalal schrieb:

    Sonst irgendwelche Ideen?

    Du wirst für dein Vorhaben nicht um die Bitoperationen herum kommen. Und andere Abstraktionsmittel als Makros und Funktionen gibt es in C nun einmal nicht.

    ok, dann kapsel ich diese zugriffe halt möglichst stark...



  • lalalal schrieb:

    Hallo!

    Ich muss Daten in einen Minispeicher schreiben, sodass ich ziemlich sparen muss.
    Würde ich z.B. ein Datenfeld haben, das den Wertebereich 0-59 hat, so genügen mir hierzu ja 6 bits.

    Nun möchte ich aber möglichst komfortabel auf diese Bits zugreifen.

    Eine Möglichkeit wären ja Bitfelder.
    Problem: wenn sich ein Datenfeld nicht im entsprechenden Datentyp mehr ausgeht (wie z.B. feld3 im ersten 4 byte Block), so wird der nächste Datentyp verwendet. Es gehen also Bits verloren, statt dass Felder vom einen UINT32 zum nächsten UINT32 reichen können.

    struct Bitfield
    {
     // ein 4 byte Block
     UINT32 feld1 :8;
     UINT32 feld2 :20;
     // nur 28bit verwendet, 4bit verloren 
    
     // ein 4 byte Block
     UINT32 feld3 :20;
     UINT32 feld4 :12;
    };
    

    Die Alternativen sind aber auch nicht gerade berauschend, nämlich bitweise Operatoren wie & oder | auf das Bitfeld anwenden. Oder gar irgendwelche komischen Makros wie man es im Linux Kernel ziemlich oft findet.

    Sonst irgendwelche Ideen?

    char datenfeld = 0;
    

    Da hast du dein Datenfeld.
    Dafür kannst du dir Makros schreiben, um Bits zu setzen und zu löschen.
    Wenn du das komisch findest, ist das dein Problem.
    Jedenfalls ist es gängige Praxis.




Log in to reply