[C] Datentyp aus 4 Bit definieren

Hallo,

ich möchte ein Array aus Werten zwischen 0-9 anlegen. Dafür würden ja ansich 4 Bits je Speicherzelle reichen, geht das irgendwie?
Ich möchte nämlich nicht unnötig Speicherplatz verschenken indem ich zum Beispiel int (ganz verheerend) oder short verwende.

Aber es sollte nachher noch irgendwie möglich sein, damit auch zu rechnen, bzw. nen Wert zuzuweisen.

Sorry hab grad von dem Thema echt null Ahnung, aber ich zähl auf euch :wink:

Bruno

Hi Bruno,

Du begibst Dich hier auf ziemlich dünnes Eis, da es genau abzuwägen gilt, ob der Verwaltungsaufwand durch die Ersparnis von Speicherplatz gerechtfertigt ist.

Um es vorwegzunehmen: Den von Dir gewünschten Datentyp gibt es definitiv nicht! Du kannst Dir ein Hilfskonstrukt basteln, wobei ich Dir zum Basistyp unsigned char raten würde. Du dimensionierst Dein Array der Länge n dann eben auf n/2+1 uns speicherst die Elemente mit ungeraden Indizes in den ersten 4 Bits, die mit geraden Indizes in den zweiten.

Der Zugriff und die Zuweisung wären dann möglich durch Einsatz der Operatoren ||, &&, >. Mit mod 2 bzw. % 2 kannst Du abfragen, ob der Index gerade oder ungerade ist.

Es ist jedoch insgesamt noch ein Wort der Warnung angebracht. Du hast kein Wort darüber verloren, auf welcher Architektur Du dieses realisieren möchtest. Du solltest Dir in jedem Fall das Manual für den Compiler genau durchlesen, da die zugehörigen Linker häufig ein sog. ‚Allignment‘ ausführen, also Variablen nur auf bestimmten Adressen beginnen lassen. Dies hat den Grund, dass ein Zugriff mit weniger Bustakten realisiert werden kann. Eine falsch gesetzte Option an dieser Stelle kann Dir alle Liebesmühe zunichte machen.

Gruß
Ted

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

OK mal sehen, vielleicht kann ich es auch mal mit nem Standarddatentyp probieren :wink:

Ich will es im Visual C++ 6 entwickeln, soll später auf Linux / gcc lauffähig sein.

Hallo Bruno,
C / C++ ermöglicht die Konstruction eines Bitarrays. Hierbei handelt es sich um eine Struktur, deren Elemente eine beliebig definierbare Anzahl von Bits haben. Die Struktur wird immer auf ein volles vielfaches eines int aufgefüllt. Auf die einzelnen Elemente kann dann ganz normal zugegriffen werden, aber Zeiger auf die Elemente sind nicht zulässig.
Beispiel :
struct four_bit {
int one : 4;
int two : 4;
int three : 4;
int four : 4;
}
/* die Zahl hinter dem Doppelpunkt gibt die Anzahl der Bits an.*/

struct four_bit myType[20];

myType[0].one = 8;
myType[1].two = 9;
myType[2].one = myType[0].one + myType[1].two /* = 2, da auf 4 Bit beschränkt. */

Dieses funktioniert immer, aber fordert einen compilerabhängigen Zusatzaufwand. Da die Größe eines int nicht definiert ist, hat die Gesamtstruktur eine maschinenabhängige Größe.

In der Hilfe von Visual C++ ist dieses Thema ausreichend ausführlich beschrieben (Stichwort bitarray).

Gruß Gert.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Gert :wink:

Nur eine Warnung: Bei C/C++ ist nicht festgelegt, ob Bit-Arrays die int-Bits von links nach rechts oder von rechts nach links durchnummerieren. Das kann von Maschine zu Maschine und sogar von Compiler zu Compiler unterschiedlich sein!

cu Stefan.

nochmal hallo,
ich hab gestern gefuscht. Die Elemente innerhalb der Struktur müssen natürlich vom Typ unsigned int sein, da sonst ein Wertebereich von -8 … +7 abgedeckt wird.
struct four_bit {
unsigned int one : 4;
unsigned int two : 4;
unsigned int three : 4;
unsigned int four : 4;
}

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]