Bitfelder, wofür und wie richtig?
-
Hallo leute,
meine fragen lauten einfach:
Wofür braucht man wirklich bitfelder (einfaches praxisnahes beispiel??)
Und wie sieht so ein bitfeld für das beispiel aus?
Hab mir schon einige sachen dazu durchgelesen, komme aber irgendwie nicht zurande damit!
Danke schonmal!
-
Hallo, ein kleines Beispiel um das Grundprinzip zu erklären:
Du hast eine geordnete Menge von z.B. 7 Aufgaben, von denen du einige bearbeiten möchtest.
du kannst nun spezifiziern:
0 = nichts machen
1 = bearbeitenBearbeite Aufgabe 4 und 5, indem du in einer Bitmap das Bit 4 und 5 als Flag setzt.
Mit einem Iterator über die Bitmap kannst du nun überprüfen, welche Aufgaben du bearbeiten möchtest.[0,0,0,1,1,0,0]
for (i = 0; i < 7;i++)
erledige Aufgabe(i), falls (bitmap[i] ==1)
nextGruß HaJo
-
Hajo32 schrieb:
Mit einem Iterator über die Bitmap
Sowas gibts bei Bitfeldern aber nicht.
Ein Bitfeld ist ein Element einer Klasse, das nur soviele Bits belegt, wie angegeben:
struct Foo { int a:1; // 1 Bit int b:4 // 4 Bits };Eigentlich hat das nur minimalst speichersparende Wirkung -- ich denke, idR braucht man das nicht.
-
hallo, mag sein, ich kenne die spezielle darstellung von bitfeldern in c++ oder stl nicht.
Mit Iterator meinte ich eben das Durchwandern des gesamten Feldes.
Neben platzersparnis, erhält man oft auch Zeitersparnis, da man nur eine Abfrage tätigen muss.Oft kann man sich die Arbeit auch erleichtern, indem man Bitmasken erstellt und mit Hilfe von logischen Funktionen Abfragen bzw. Zuweisungen durchführt.
-
Hajo32 schrieb:
Mit Iterator meinte ich eben das Durchwandern des gesamten Feldes.
Ein "Bitfeld" kann man nicht durchwandern, es hat nur ein Element. In meinem Beispiel sind a und b zwei Bitfelder. Man kann auch diese nicht in einer Schleife durchwandern, da ein Bitfeld keine Adresse hat (d.h. man kann keinen Pointer darauf setzen).
Was du sagst hat alles seine Berechtigung, aber es betrifft eben nicht die so genannten Bitfelder, die es in C++ gibt. Wir haben hier ein sprachliches Problem: Bitfelder heissen bit fields, field steht fuer ein Element einer Klasse. Du meinst "Bitfelder" im Sinne von bit arrays oder bit vectors.
-
Bitfelder??? schrieb:
Wofür braucht man wirklich bitfelder (einfaches praxisnahes beispiel??)
Hint: Ich verstehe Bitfeld als Array von Bits, wie sie auch im Computerverwendet werden => 8 Bits == 1 Byte.
Bitfelder braucht man immer dann, wenn man kleine Informationen hat (z.B. Ja oder Nein) und davon eben sehr viele. Ein Beispiel: Du schreibst einen Parser und möchtest wissen, ob ein Zeichen Wörter trennt (Leerzeichen, Punkt...) oder nicht (Buchstaben). Mittels des ASCII-Wertes hast Du einen Index: Also 256 Ja-Nein-Informationen. Speichert man sie in einem char-Array, brauchst Du 256 Bytes. 256 Bits entsprechen 32 Bytes, wenn man sich z.B. eine entsprechende Klasse baut.
Es geht hier also darum, Platz zu sparen. Wenn Du Komprimierungsprogramme schreibst, werden Bitfelder also sehr interessant - um nicht zu sagen notwendig.
Ansonsten zur Verarbeitung sonstiger binärer Daten, zum Beispiel Bildern, dem Zusammenfügen von Maschinensprachebefehlen usw. usw.
Bitfelder kann man auch sehr schön schieben und damit eventuell Rechenoperatoren optimieren, mit geeigneten Werten schnellere Indexe aufbauen usw.
Wenn es darum geht, ob man die <<, >>, ~, |, & und ^ Operatoren verstehen sollte, wenn man C++ programmiert: Definitiv ja.
Wer C/C++ programmiert bekommt einfache zu bedienende Werkzeuge an die Hand, um hochoptimiert zu Programmieren. Ich sehe keinen Grund C++ zu programmieren, wenn man diesen Vorteil dann wieder vernachlässigt.Achtung: Programmierer werden schneller dumm, als Computer schnell werden. Ein guter Programmierer überholt einen 4GHz Pentium mit einem C64 (fast 1MHz), wenn sich der Pentium-Entwickler entsprechend blöd anstellt.
Fibunacci rekursiv entsprechend Vorgabe oder iterativ entsprechend Optimierung ist da ein schönes Beispiel für.
-
Wenn man mit Bitfeldern hantiert sollte man auch beachten, dass man sich den speichersparenden Effekt sehr leicht versauen kann, wenn man die Speicherausrichtung schlecht einstellt. Also notfalls nur benutzen, wenn es messbar Vorteile bringt.
-
Walli schrieb:
Also notfalls nur benutzen, wenn es messbar Vorteile bringt.
z.B. bei einem internet spiel, da zählt eher die bandbreite, wenn du z.B. statt bytes bits sendest für bools.
mfg.