4 Stimmen

C++ bool array als Bitfeld?

Sagen wir, ich muss 8 bools in einer Struktur speichern, aber ich möchte für sie nur 1 Byte zusammen verwenden, dann könnte ich etwas wie folgt tun:

struct myStruct {
    bool b1:1;
    bool b2:1;
    bool b3:1;
    bool b4:1;
    bool b5:1;
    bool b6:1;
    bool b7:1;
    bool b8:1;
};

und damit konnte ich Dinge tun wie

myStruct asdf;
asdf.b3=true;
asdf.b4=false;
if(asdf.b1)
    ...

Ist das so weit korrekt? (ich weiß es nicht wirklich, ich habe noch nie Bitfelder verwendet)

ok - aber ist es auch möglich, ein statisches Array von 8 bools zu erstellen, so dass Sie nur 8 Bits verwenden, aber ich werde noch in der Lage sein, sie durch Index zu adressieren?

etwas wie

struct myStruct {
public:
    bool b[8]:8;
};

vielleicht? (damit bekomme ich einen Fehler C2033)

Danke für die Hilfe!

10voto

Dan Hook Punkte 6155

Ich würde empfehlen, eine std::bitset Auf diese Weise könnten Sie einfach eine Erklärung abgeben:

std::bitset<8> asdf;

und verwenden Sie es mit [].

asdf[0] = true;
asdf[3] = false;

1voto

inked Punkte 634

Würden Sie nicht lieber eine byte Datentyp, um alles auf einmal zu speichern? Dann bräuchten Sie nur logische AND s und OR s, um Dinge zu erhalten/einzutragen. Keine struct erforderlich.

0voto

Timo Geusch Punkte 23597

Aus verschiedenen Gründen halte ich das für keine gute Idee - Sie versuchen im Grunde, das Verhalten von vector<bool> die sich als keine gute Idee . Wenn Sie versuchen, dies nur zu tun, um Speicher zu sparen, würde ich mir nicht die Mühe machen. Der Aufwand für den Zugriff auf die verschiedenen Bools und das Extrahieren aus einem Bitfeld ist wahrscheinlich viel höher als das bisschen Speicher, das Sie sparen, es sei denn, Sie sind durch Speicherbeschränkungen extrem eingeschränkt.

Um Ihre direkte Frage zu beantworten, wenn Sie die Bool/Bitfield Sache tun wollen, müssen Sie Ihren ersten Ansatz verwenden.

Normalerweise ist die legitime und akzeptierte Verwendung für den Bitfeld/Bit-Twiddling-Ansatz, wenn man mit Hardware-Registern zu tun hat und versucht, entweder ein Hardware-Register zu modellieren oder tatsächlich auf ein Hardware-Register zuzugreifen, nachdem man es wie einen Speicherplatz aussehen lässt und eine Bitfeldstruktur über das Register legt.

0voto

T.E.D. Punkte 42630

Vielleicht können Sie Ihren Compiler dazu bringen, das zu tun, was Sie wollen, aber leider ist das nicht erforderlich. Zum Beispiel könnte selbst ein guter Compiler, der das oben genannte akzeptiert, am Ende ein ganzes 32-Bit-Wort für Ihre myStruct Objekte.

Wenn Sie die Möglichkeit haben und dieses Maß an Kontrolle über Ihre Typen und deren Ausrichtung und Zuordnung wünschen, sollten Sie wahrscheinlich Ada verwenden. Das Folgende funktioniert zum Beispiel sehr gut in Ada:

type Bit_Set is array (1..8) of Boolean;
for Bit_Set'size use 8;

High_Mask : constant Bit_Set := (1..7 => false, 8 => true);

...und Sie haben nun eine Ein-Byte-Bitmaske und die Operatoren "and", "or", "xor" usw., die bitweise mit ihr arbeiten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X