Am Sam, 2003-05-17 um 16.23 schrieb Andre Heine:
Am Saturday 17 May 2003 14:35 schrieb Bodo Kaelberer:
[...]
Das ist ja ein nettes Thema fuer Einsteiger (-;
Jep :)
Die Funktion byteToBit() beginnt beim niedrigsten Bit. Willst Du mit dem hoechsten beginnen, dann muss Du als Anfangswert 0x80 statt 0x01 verwenden und zum Schiften >> statt <<.
Ausgabe: 10000000 00001111 00101100
Das ist vom Aufruf her recht komfortabel. Es wirkt etwas umstaendlich, aber dafuer hat es ein stream-artiges Verhalten - Du kannst wirklich Bit fuer Bit lesen. Die Performance kann ich nicht abschaetzen.
Im C Buch von Suse Press steht, das Bitfelder langsamer sind, weil diese intern "shiften", bit Verknüpfungen(& |) sollen sehr performant sein, aber nicht speicherefffizient wie Bitfelder... So pauschal ausgedrückt, ist diese Aussage falsch.
Die Effizienz von C-Bitfeldern ist sehr compiler- und prozessorabhängig. Das Ergebnis kann je nach Anwendung, Compiler und Prozessor sehr unterschiedlich ausfallen. "Verknüpfungen" (Bit-Operationen) sind insbes. dann signifikanter effizienter, wenn der Autor eines Programmes "Shifts" vermeidet, in dem er Bits in Ordinaltypen direkt setzt und Vergleiche mit den Ordinaltypen selbst (Bit-Masken) verwendet, statt einzelne Bits zu setzen bzw. einzelne Bits zu vergleichen.
Meine Vorliebe liegt bei den Bitfeldern, lässt sich im Quelltext viel besser lesen. Grösster Nachteil von C-Bitfeldern: Die interne Reihenfolge der Bits innerhalb von structs ist nicht definiert.
D.h. so bald C-Bitfelder binär ausgegeben werden sollen oder Hardware mit Bitfeldern angesteuert werden sollen, wird der Code unportabel. Ralf