Bit Fields in Structures(Erklärung)



  • Hallo,
    wie oben in Titel schon steht geht es um Bit Fields. Das Thema kam grade im Buch was ich lese(C++ Primer Plus 6th edition) und versteh das gar nicht was genau das bringt.
    Da sonst immer im Buch steht wenn ein Thema später genau erklärt wird und hier nicht der Fall ist habe ich mich halt dazu entschlossen hier zu fragen. Hoffe mir kann da jemand weiter helfen.
    Unten noch mal der Absatz aus den Buch.

    Bit Fields in Structures
    C++, like C, enables you to specify structure members that occupy a particular number
    of bits.This can be handy for creating a data structure that corresponds, say, to a register
    on some hardware device.The field type should be an integral or enumeration type (enumerations
    are discussed later in this chapter), and a colon followed by a number indicates
    the actual number of bits to be used.You can use unnamed fields to provide spacing. Each
    member is termed a bit field. Here’s an example:
    struct torgle_register
    {
    unsigned int SN : 4; // 4 bits for SN value
    unsigned int : 4; // 4 bits unused
    bool goodIn : 1; // valid input (1 bit)
    bool goodTorgle : 1; // successful torgling
    };
    You can initialize the fields in the usual manner, and you use standard structure notation
    to access bit fields:
    torgle_register tr = { 14, true, false };
    ...
    if (tr.goodIn) // if statement covered in Chapter 6
    ...
    Bit fields are typically used in low-level programming. Often, using an integral type
    and the bitwise operators listed in Appendix E,“Other Operators,” provides an alternative
    approach.

    Quelle: C++ Primer Plus 6th edition by Stephen Prata


  • Mod

    Das ist eine sehr spezielle hardwarenahe Optimierung (hauptsächlich zu Gunsten von Speicherplatz, was sich dann je nach Situation negativ oder positiv auf andere Aspekte auswirken kann), die du wahrscheinlich niemals im Leben benötigen wirst. Falls du doch mal in die Situation kommst, sie zu benötigen, dann wirst du bis dahin voraussichtlich schon ganz alleine wissen, ob und warum du das brauchen könntest.

    Behalte bloß im Hinterkopf, dass es das gibt. Probier es einmal selber aus. Die Hauptlektion, die du hier lernen wirst ist, dass du später nicht so überrascht bist wie andere Leute, wenn sie das erste Mal einen Doppelpunkt in fremden Code sehen und nicht wissen, was das überhaupt ist.



  • Wie bereits erkennbar ist es ein guter Weg, Speicher zu sparen. Ein Boolean brauch nicht mehr als 1 Bit, Zahlen können auf einen kleineren, möglichen Bereich beschränkt werden.
    Persönlich habe ich es noch nie verwenden müssen, aber für Programmierer von Microcontrollern, dessen Speicher doch stark beschränkt ist, kann es äußert hilfreich sein, keine Bits zu verschwenden.



  • CraftPlorer schrieb:

    [...] und [ich] versteh das gar nicht was genau das bringt.

    This can be handy for creating a data structure that corresponds, say, to a register on some hardware device.

    Man kann damit auch Flags abbilden, aber meist benutzt man Alternativen. Weiterhin kann man damit ein paar Bits sparen. Es wird allerdings eher selten benutzt.

    Sowas in der Richtung geht damit auch:

    union Float{
     float f;
     struct{
      bool vorzeichen : 1;
      unsigned int mantisse : 23;
      unsigned char exponent : 8;
     };
    };
    

    Das Problem dabei war aber, dass der Compiler die Reihenfolge drehen darf, sodass das je nach Optimierung, Compiler und Plattform mal funktioniert und mal nicht.

    //zu lahm -.-
    //irgendwer wird sicher meine float-union in der Luft zerreißen 😃



  • Vielen Dank!



  • ...


Log in to reply