Wie funktionieren bitweise or-Verknüpfungen (Bitmasken)


Abstract

Verknüpfung von Flags mittels einer Or-Verknüpfung.

Problemstellung

Nehmen wir an, wir haben Flags, die kombiniert werden können, zum Beispiel die Flags bei einer Messagebox zur Darstellung eines Icons und der Schaltflächen, wie realisiert man so etwas? Das Problem ist, dass man sie nicht nur setzen, sonder auch wieder auslesen können muss.

Lösung mittels einer bitweisen or-Verknüpfung

Die Idee, die da hintersteckt ist folgende: Für jedes Flag wird je ein Bit gesetzt:

FlagBit-WertDezimal-Wert
Flag A000000011
Flag B000000102
Flag C000001004
Flag D000010008

Will man nun die Flags A und C setzen, verknüpft man die entsprechenden Bits mittels or:

   Flag A: 00000001
or Flag C: 00000100
   ----------------
           00000101

Will man nun testen, ob ein Bit gesetzt ist, nimmt man die Bit-Folge und verknüpft sie mit and:

           00000101
and Flag C 00000100
           --------
           00000100 -> Flag C gesetzt

Erhält man den Wert des getesteten Flags, ist dieses Flag gesetzt. Oder ausgeschrieben: Wenn Flags and Flag C = Flag C, dann ist Flag C gesetzt.

Deswegen haben die Konstanten auch meist genau diese Dezimal-Wert aus der obigen Tabelle. Würde man statt dessen Flag C den Wert 00000011b (3d) zuweisen, ergäbe sich aus einer or-Verknüpfung mit zum Beispiel Flag A der Wert 00000011b (3d). Dieser Wert entspricht aber auch wieder dem Wert von Flag C. Man könnte somit nachher nicht mehr testen, ob das Bit für Flag A gesetzt ist oder nicht. Schließen sich Flags gegenseitig aus, zum Beispiel kann eine Messagebox nicht gleichzeitig das Ausrufezeichen- und das Fragezeichenicon anzeigen, wählt man die gesetzten Bits so, dass sie ein gemeinsam gesetztes Bit haben. Sollen sich die Flags A und B ausschließen, vergibt man für Flag A 00000001b und für Flag B 00000011b. Wird nun auf eins dieser Flags geprüft, ergibt die Überprüfung immer gesetzt für eins der gesetzten Bits.


2010-12-29T23:44:37 +0100, mail+homepage[at]michael-puff.de