Programmieren mit Bitoperatoren

Jedem Programmierer sollten wohl logische und arithmetische Operationen hinlänglich bekannt sein – muss man sie doch nahezu in jedem kleinsten Script heutzutage verwenden. Ein wenig unbekannt, gar mysteriös erscheinen dagegen so manche Operatoren abseits von Addition, Subtraktion, Multiplikation, Division sowie Konjunktion (und), Disjunktion (oder), Antivalenz (Exklusiv-oder) und Negation (nicht). Gemeint sind die bitweisen Operationen, welche vor allem in der Maschinen-nahen Programmierung mittels Assembler gang und gäbe sind. Benannt sind diese in Assembler erstaunlicherweise genauso, wie die logischen Operatoren häufig auch in höheren Programmiersprachen benannt wurden, nämlich AND, OR, NOT und XOR (viele Sprachen akzeptieren für die logischen Verknüpfungen auch mehrere Varianten – z.B. in PHP ist sowohl && wie auch AND), was letztendlich mit Sicherheit nicht gerade zur Entwirrung der Thematik beiträgt. Der folgende Artikel soll es aber einmal versuchen, Licht ins Dunkel zu bringen sowie auch den einen oder anderen Vorteil darzulegen. Voraussetzung für das Verständnis der folgenden Inhalte sind jedoch Grundkenntnisse der Aussagenlogik.

Was machen denn nun die Bit-Operatoren anders?
Ganz einfach: Die üblichen logischen Operatoren sind lediglich auf dem Wertebereich der boolschen Werte definiert und bilden auch nur auf selbige ab. Die bitweisen Operatoren dagegen stellen Funktionen, die vom Integer-Wertebereich (32 Bit) auf selbigen abbilden. Hierbei betrachtet man lediglich die Binärdarstellungen der Zahlen und wendet die Operationen auf jedes einzelne Zeichen (Bit) an. Ein Beispiel: 42 & 12 = 8, denn:

  00101010 (42)
& 00001100 (12)
---------------
  00001000 (8)

Weitere bitweise Operatoren sind häufig neben & (und) auch | (oder), ~ (nicht) und ^ (xor).

Rechnen wir damit mal ein paar Beispiele:
Oder: 42 | 12 = 46

  00101010 (42)
| 00001100 (12)
---------------
  00101110 (46)

Exklusives Oder (Entweder… oder): 42 ^ 12 = 38

  00101010 (42)
^ 00001100 (12)
---------------
  00100110 (38)

Sind das schon alle?
Nein, es gibt tatsächlich noch weitere, die über die Semantik der logischen Operationen hinausgehen. So gibt es ebenfalls noch die sogenannten Bitschiebebefehle. Hierbei werden lediglich die einzelnen Ziffern in der Binärdarstellung um eine angegebene Anzahl von Stellen nach rechts (>>) bzw. links (<<) verschoben. Dies entspricht letztendlich arithmetischen Operationen, genauer genommen der Multiplikation bzw. Division der jeweiligen Zahl mit einer Potenz von 2. Ein weiteres Beispiel: 43 >> 2 = 10, denn:

00101011 >> 2
-------------
00001010

Und was macht man damit?
Die Anwendung dieser Operatoren lässt sich zumeist auf die Arbeit mit Bitmasken einsetzen. Diese finden vor allem bei der Arbeit mit Dateien und Verzeichnissen in UNIX-Betriebssystemen ihren Einsatz – genauer gesagt bei der Definition der Zugriffsrechte. Hier repräsentiert eine zumeist 9 bit-Zahl Lese-, Schreib- und Ausführrechte des Nutzers, der Gruppe und der restlichen Welt. Mithilfe bitweiser Operatoren lassen sich diese wunderbar verändern, beispielsweise um zusätzlich der Gruppe zu erlauben, die Datei zu lesen, könnte so aussehen:
alter Wert | 000100000 = neuer Wert.
Auch in anderen Bereichen werden solche Bitmasken manchmal verwendet. So besitzen manche Funktionen, die zumeist schon standardmäßig in den Programmiersprachen enthalten sind, einen (optionalen) Parameter “Flags”, der ebenfalls eine Bitmaske erwartet und diverse zusätzliche Optionen für die Ausführung der Funktion definiert.

Des Weiteren kann man herausfinden, an welcher Stelle in der Binärdarstellung einer Zahl sich eine 0 oder eine 1 befindet.
So lässt sich beispielsweise wie folgt testen, ob an der zweiten Stelle von rechts einer Integerzahl i die Ziffer 1 steht.

if(i & 2 != 0)
{
     print("juhu!");
}

Damit wären wir auch schon wieder am Ende dieses kleinen Einblicks in die kleine Welt der Bits und bitweisen Operatoren. Wir hoffen, dass dieser Eintrag dem einen oder anderen helfen konnte. Sollten dennoch weiterhin Fragen offen bleiben, können diese gerne in den Kommentaren gestellt werden.

Keine Kommentare

Es sind noch keine Kommentare vorhanden. Schreibe doch den Ersten!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*