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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren