Forum: Compiler & IDEs Array of bits - so möglich?


von SyntaxError (Gast)


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

von Klaus W. (mfgkw)


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.

von Klaus W. (mfgkw)


Lesenswert?

SyntaxError schrieb:
> Oder aber in V: onebit_n:1; mit n= 0-15 durchnummerieren

So etwas geht natürlich, aber dann kann man nicht wie in einem Feld
über die Elemente iterieren.

von Reiner (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.