Ein array aus einzelnen bits statt bytes erstellen?

5 Antworten

Eine Möglichkeit wäre ein "union": https://stackoverflow.com/questions/3497345/is-there-a-way-to-access-individual-bits-with-a-union

Damit kannst du ein Byte separat ansprechbar machen und jedes Bit einzeln setzen. Kleiner als 1 Byte wird es aber nicht gehen.

Ansonsten geht natürlich ein schlichtes Bitfeld. Dafür kannst du auch ein uint8 / unsigned char nutzen, und dann die einzelnen Bits setzen, je nach Usecase. Das muss allerdings irgendwo definiert sein, welches Bit wofür steht.

Woher ich das weiß:Berufserfahrung – Automotive embedded Softwareentwickler

Dafür gibt es den Datentyp "bool". Der funktioniert genau wie char, int oder long und hat dann 1-bit, also kann zwei Zustände annehmen.

Den braucht(e) man für Mikrocontroller die nur wenig RAM haben. Einfache Mikrocontroller hatten bis "vor kurzem" nur wenige Bytes an RAM. Musste man sich viele "JA/NEIN" Zustände merken, musste man entweder die Bits selber in Bytes zusammen fassen (in Assembler) oder konnte in Hochsprachen (wie C) den Datentyp BOOL verwenden wo der Compiler das zusammen puzzeln und auseinander dröseln der einzelnen Bits selber machte. Es gab sogar Mikrocontroller (z.B. Siemens 8051 oder Derivate) die einen kleinen Teil des RAMs neben Byte auch Bitadressieren konnten.

Programmiert man einen Mikrocontroller (z.B. Arduino) und benutzt den Datentyp "bool", dann werden die einzelnen bool-Variabeln tatsächlich in einzelnen Bits gespeichert die dann in Bytes zum speichern zusammen gefasst werden. Hier kann man dann tatsächlich variable = 1 oder variable = true sagen/prüfen. Die Variable kann dann nur 0 oder 1 annehmen. Das macht Sinn, denn viele Mikrocontroller haben immer noch relativ wenig Speicher auch wenn heutzutage weniger als 16 Kilobyte recht ungewöhnlich sind. Früher waren es meistens 128 Bytes oder weniger!

Das auseinanderdröseln bzw. Zusammen puzzeln von Bits zu Bytes um die im Speicher lesen oder schreiben zu können ist aufwändig und verbraucht eine ganze Menge an Befehlen und kostet richtig viel Laufzeit. Daher ignorieren die meisten Compiler auf dem PC dass man 1-bit haben will und belegen dann für jede Bool Variable mindestens 1 Byte, denn das kann ein Computer recht leicht und schnell in seiner Hardware handhaben. Im Gigabyte-RAM Zeitalter macht diese "Verschwendung" gar keinen Unterschied. Da in den meisten Hochsprachen nur zwischen "Null" und "Nicht Null" unterschieden wird, spielt es für den Programmablauf keine Rolle ob man es da mit einzelnen Bits oder Bytes zu tun hat, die boolsche Algebra geht so oder so auf.

Sofern Du also kein Gerät hast wo RAM absolute Mangelware ist, nimm den Datentyp "char" oder Wortbreite des Prozessors (also 32/64-Bit beim PC) für maximale Programmablaufgeschwindigkeit und benutze true und false als Dateninhalt.

Woher ich das weiß:Berufserfahrung

Dafür gibts in C++ das Bitset

https://cplusplus.com/reference/bitset/bitset/

Allerdings ist es natürlich nur möglich ein ganzahliged vielfaches von Bytes zu belegn.

Also ein Bitset aus 5 Bit verwendet 1 Byte Speicherplatz, ein Bitset aus 9 Bit 2Byte.

Anders gehts nicht weil das Byte die kleinste ansprechbare Einheit im Speicher ist.

Du kannst ein Array aus einzelnen Bits erstellen, indem du Bitfelder verwendest. Hier ein Beispiel:

struct BitArray {
    unsigned int bits[2];
};


int main() {
    BitArray arr = {0b10110, 0b0};  // Initialisiert 5 Bits


    // Auf Bits zugreifen
    arr.bits[0] &= 1 << 0;     // Bit 0 löschen
    arr.bits[0] |= 1 << 1;     // Bit 1 setzen
    bool bit2 = arr.bits[0] & (1 << 2); // Bit 2 holen (ist 1)

    sizeof(arr);  // Gibt 2 zurück
}
Woher ich das weiß:Berufserfahrung – C++, Javascript, C# und C Dev

ZuNiceFrage 
Fragesteller
 10.05.2023, 10:04

Was bedeutet {0b10110, 0b0}

0
Gehilfling  10.05.2023, 10:12
@ZuNiceFrage

0b ist der Präfix für eine Zahl die durch "Bits" dargestellt wird. Ähnlich "0x" für Hexadezimal.

0

Da die kleinste Ansprechbare Steucheradresse ein Byte anspricht, kannst du natürlich nur Bytes nehmen und darin die einzelnen Bits ansprechen.