Array of bits - so möglich?

Gast #2120835
Lesenswert?
• ▲
▼
Hallo zusammen!

Ich brauche eine Bestätigung zu folgendem Konstrukt:

Da C ja keine "Array of bits" kennt, bspw.

V:
1
 struct { onebit:1[16];} arrayofbits;

Bin ich auf folgende Idee gekommen, um das zu umgehen(auf den ersten 
Blick):
1
typedef struct { unsigned thebit:1;} onebit;     //I:
2
        struct { onebit bit[16]; } arraysofbits; //II:

was geschieht hier:
I: ein Bit wird in einem Byte angelegt

Der eigentliche Knackpunkt, was macht der Compiler(gcc)?
II:   a) 16mal ein Byte anlegen -> struct 16Byte lang
      b) er erkennt, dass es sich um ein Bitfield handelt
         -> struct 2Bytes lang(16bit)

Die vernünftige und wahrscheinliche Variante ist wohl IIa).
Lieber wäre mir IIb) - und nein - Variante IIa) löst nicht mein 
eigentliches Problem und ist hässlich, da mehr Speicher unnütz verbraten 
wird.
Ansonsten muss ich eben die 16bit per Hand maskieren, dachte nur man 
könnte so diese Drecksarbeit dem Compiler überlassen.
Oder aber in V: onebit_n:1; mit n= 0-15 durchnummerieren [...].

Für Meinungen/Bestätigungen/Ideen
schon mal: Danke im Vorraus!

SyntaxError
#2120894
Lesenswert?
• ▲
▼
SyntaxError schrieb:
> Ich brauche eine Bestätigung zu folgendem Konstrukt:

Von mir bekommst du dafür keine Bestätigung :-)

>
> Da C ja keine "Array of bits" kennt, bspw.

Richtig.

>
> V: struct { onebit:1[16];} arrayofbits;
> Bin ich auf folgende Idee gekommen, um das zu umgehen(auf den ersten
> Blick):typedef struct { unsigned thebit:1;} onebit;     //I:
>         struct { onebit bit[16]; } arraysofbits; //II:
>
> was geschieht hier:
> I: ein Bit wird in einem Byte angelegt

ja, und der Rest der int wird mit dummys aufgefüllt.

>
> Der eigentliche Knackpunkt, was macht der Compiler(gcc)?
> II:   a) 16mal ein Byte anlegen -> struct 16Byte lang

bzw. 16 mal eine int, von der jeweils ein Bit genutzt wird.

>       b) er erkennt, dass es sich um ein Bitfield handelt
>          -> struct 2Bytes lang(16bit)

nein, sicher nicht.

> Ansonsten muss ich eben die 16bit per Hand maskieren, dachte nur man
> könnte so diese Drecksarbeit dem Compiler überlassen.

In C++ kann man sowas bauen (siehe std::bit_vector), nicht in C.
Gast #2124163
Lesenswert?
• ▲
▼
Ja leider haben die Herren Kernighan und Ritchie nicht an Bit Arrays 
gedacht aber dafür haben sie Bit Felder eingebaut.

struct {
   unsigned busy:1;
   unsigned clear:1;
   unsigned dummy:4;
   unsigned offline:1;
} flags;

Flags ist ein int also 16 Bit groß. flags.busy = 0; löscht ein bit 
flags.busy = flags.offline = 1 setzt Bits und if (fags.clear == 0) ... 
überprüft das Bit.

Wer unbedingt Bit Arrays für den gibt es im Netz diverse Module für 
diesen Zweck z.B. 
http://www.koders.com/c/fid7F57E63EAE4B6028AAF3DCDB6414AD240CFB6CDD.aspx

Gruß Reiner

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.