PHP 4.3

4.9 Bitoperationen

In diesem Abschnitt stellen wir Ihnen die Bitoperatoren von PHP vor. Sie spielen in PHP nur eine Rolle in mathematischen Operationen und gehören somit nicht zum Basiswissen, das ein Programmierer braucht. Allerdings benutzen viele C-Programmierer die Bitoperationen, um bestimmte arithmetische Operationen auszudrücken. Zumindest zum Lesen fremder PHP-Skripte sollte man sie also kennen. Bitoperationen lohnen sich häufig, wenn es um besonders zeitkritische Anwendungen geht, da sie einen Geschwindigkeitsvorteil gegenüber den anderen Operatoren haben. Sie können nämlich direkt auf die Bits einwirken, aus denen eine Zahl besteht. Dadurch ist der Rechner nicht gezwungen, die Informationen aus der Anordnung der Bits in für den Menschen verständliche Zeichen (Buchstaben, Zahlen etc.) umzuwandeln, zu vergleichen und anschließend wieder in Bits aufzuschlüsseln. Er kann sie vielmehr direkt in ihrem auftretenden "Urzustand" analysieren und verarbeiten.

Was sind Bits und wo kommen Sie vor? Alles, was sich im Computer abspielt, verarbeitet und visualisiert wird, besteht aus Bits. Bits sind die kleinste Einheit in einem Rechner. Ein Bit kann nur zwei Zustände annehmen und zwar entweder 1 oder 0. Am einfachsten erzeugt man bzw. greift man auf eine Bitfolge zu, indem man Ganzzahlvariablen manipuliert. $a=5 erzeugt beispielsweise in $a die Bitfolge 101.

In der folgenden Aufstellung sehen Sie noch einmal die Zusammenhänge zwischen Bits und Bytes.

1 Bit kann als Minimum den Wert 0 und als Maximum den Wert 1 haben
8 Bit (1 Byte) haben als Minimum den Wert 00000000 und als Maximum 11111111
1024 Byte = 1 KByte (Kilobyte)
1024 KByte = 1 MByte (Megabyte)
1024 MByte = 1 GByte (Gigabyte)
1024 GByte = 1 TByte (Terabyte)

Diese Bedeutung der Präfixe wie Kilo, Mega etc. gilt auf dem Gebiet der Informatik, und auch hier leider nicht universell. Sie ist nicht ohne weiteres auf andere Disziplinen zu übertragen, für die üblicherweise die Definitionen von 103 für Kilo, 106 für Mega, 109 für Giga usw. gelten.

Nun zeigen wir Ihnen, wie man mit Bits rechnen kann. Dazu muss man den Stellenwert eines Bits kennen. Innerhalb einer Ganzzahl haben nicht alle eingeschalteten Bits den Wert 1. Schauen wir uns ein Byte mal genauer an.

Als Beispiel nehmen wir 00001001. Wir sehen, dass wir im vorliegenden Fall 8 Bits haben. Wir wollen diese Bits wie ein Rechner im dualen Stellenwertsystem interpretieren und den dezimalen Wert dieser Bitfolge herausfinden. Normalerweise rechnen wir im Zehnersystem, 345 bedeutet 3 mal hundert plus 4 mal zehn plus 5, oder 3 mal 10 hoch 2 plus 4 mal zehn hoch 1 plus 5 mal zehn hoch null. Für das Rechnen mit Bits müssen wir nun wissen, dass die Basis des dualen oder binären Systems 2 lautet (2 = Bi = Binär). Alle diese Nullen und Einsen haben einen anderen Exponenten zur Basis 2. Diese sind - hier ist jetzt die Reihenfolge andersherum - 2 hoch 0, 2 hoch 1, 2 hoch 2, 2 hoch 3 ... 2 hoch 7 also die Werte : 0, 1, 2, 4, 8, 16, 32, 64, 128.

Wenn man diese Werte beliebig miteinander kombiniert, kann man durch Addition alle Zahlen von 0 bis 255 darstellen. In PHP arbeiten wir mit 32-Bit-Zahlen, von denen eines allerdings eine Vorzeichenfunktion hat (ist es gesetzt, ist die Zahl negativ).

Mit den Bitoperatoren kann man nun diese einzelnen Bits gezielt verändern. Der bitweise NOT-Operator (in PHP durch das Tilde-Zeichen ~ repräsentiert) beispielsweise liefert ein Ergebnis, das sämtliche Bits des Operanden umkehrt. Wenn also an einer Stelle eine 0 stand, befindet sich nach Anwendung dieses Operators dort nun eine 1 und andersherum.

Der bitweise AND-Operator liefert für jede Stelle zweier Operanden das Resultat einer AND-Verbindung. Wenn in beiden zu verknüpfenden Ganzzahlen an einer bestimmten Stelle eine 0 steht, dann bekommt auch das Ergebnis der Operation an dieser Stelle eine 0. Steht an beiden Stellen eine 1, bekommt die Operation an dieser Stelle eine 1. Sind sie unterschiedlich, so ist das Ergebnis 0.

Das folgende Skript stellt Ihnen alle Bitoperatoren vor, die PHP zur Verfügung stellt. Beachten Sie, dass die echo-Anweisung Nullen, die am Anfang einer Binärzahl stehen, nicht mit anzeigt, 00001001 also als 1001 ausgibt.

Bitoperationen in PHP:
<?php

  $dezimalzahl1 = 3; // Binär = 00000011
  $dezimalzahl2 = 9; // Binär = 00001001

  $erg = $dezimalzahl1 & $dezimalzahl2; // AND
  echo "$dezimalzahl1 AND $dezimalzahl2 = $erg, also Binär: " . decbin($erg)."<br>";

  $erg = $dezimalzahl1 | $dezimalzahl2; // OR
  echo "$dezimalzahl1 OR $dezimalzahl2 = $erg, also Binär: " . decbin($erg)."<br>";

  $erg = $dezimalzahl1 ^ $dezimalzahl2; // XOR
  echo "$dezimalzahl1 XOR $dezimalzahl2 = $erg, also Binär: " . decbin($erg)."<br>";

  $erg = ~ $dezimalzahl1; // NOT (also im Bitbereich invertieren des Wertes)
  echo "~ $dezimalzahl1 = $erg, also Binär: " . decbin($erg)."<br>";

?>


Browserausgabe:
  3 AND 9 = 1, also Binär: 1
  3 OR 9 = 11, also Binär: 1011
  3 XOR 9 = 10, also Binär: 1010
  ~ 3 = -4, also Binär: 11111111111111111111111111111100

Bit Shifting

Das sogenannte Bit Shifting ("Shifting" bedeutet dabei soviel wie "Verschiebung") stellt eine interessante Rechenmethode auf Basis des binären / dualen Systems dar. Dabei werden die Nullen und Einsen der Binärform einer Zahl um eine zu beziffernde Anzahl von Stellen nach rechts oder links verschoben, was natürlich zu einer Wertänderung der Zahl führt. Sie können sich den Vorgang anhand einer Perlenkette mit 32 Perlen (PHP arbeitet mit 32-Bit-Zahlen) vorstellen, deren Perlen Sie um die gewünschte Anzahl von Stellen verschieben. Dabei rücken alle anderen Perlen um eine entsprechende Anzahl von Stellen nach. Nullen oder Einsen, die bei einem Shifting nach links die erste (besser gesagt die zweiunddreißigste) Stelle überschreiten, gehen verloren, da von rechts immer Nullen nachgeschoben werden.

Ein Beispiel:
Die binäre Entsprechung der Zahl 9 ist 00001001. Wenn wir ein Bit Shifting um drei Stellen nach links durchführen, ergäbe dies 01001000, also 72 in der Binärform. Wie Sie sehen, bedeutet um drei Stellen nach links schieben nichts anderes als mit acht (2 hoch drei) multiplizieren.

Wird eine negative Zahl nach rechts geschoben, bleibt sie negativ (das Vorzeichenbit wird vervielfältigt), die Bedeutung ist also grob die einer wiederholten Division durch zwei.

Da PHP mit 32-Bit-Zahlen arbeitet, können Sie Bits also um maximal 31 Stellen nach rechts oder links verschieben. Bei 32 oder mehr Stellen Verschiebung ist das Ergebnis nicht mehr definiert.

Bit Shifting in PHP:
<?php

  $dezimalzahl1 = 3; // Binär = 00000011
  $dezimalzahl2 = 9; // Binär = 00001001

  $erg = $dezimalzahl2 << $dezimalzahl1; // Verschieben von Bits nach links
  echo "$dezimalzahl2 << $dezimalzahl1 = $erg, also Binär: " . decbin($erg)."<br>";

  $erg = $erg >> $dezimalzahl1; // Verschieben von Bits nach rechts
  echo "72 >> $dezimalzahl1 = $erg, also Binär: " . decbin($erg)."<br>";

?>

Browserausgabe:
  9 << 3 = 72, also Binär: 1001000
  72 >> 3 = 9, also Binär: 1001

Kommentare (0)

Ihr Kommentar

Name