Benutzer-Werkzeuge

Webseiten-Werkzeuge


php:bitweise

Bitweiser Operator

Ein praktisches Anwendungsbeispiel für die Nutzung von Bit-Operatoren ist die Speicherung von allen möglichen Kombinationen von Wochentagen in nur einem einzigen Datenbankfeld. Hierfür wird jedem Wochentag ein fester Wert zugeordnet:

Wochentagdate(„w“)RechenformelDezimal-WertBinär-Wert
Sonntag 0 2 hoch 0 1 00000001
Montag 1 2 hoch 1 2 00000010
Dienstag 2 2 hoch 2 4 00000100
Mittwoch 3 2 hoch 3 8 00001000
Donnerstag 4 2 hoch 4 16 00010000
Freitag 5 2 hoch 5 32 00100000
Samstag 6 2 hoch 6 64 01000000

Für die Erstellung unseres Beispiel sind zunächst nur die Dezimal-Werte interessant. Der Standardwert für unser Datenbankfeld wäre 127, da dieser Wert alle Wochentage beinhaltet. Da wir maximal nur einen Byte zur Darstellung aller möglichen Kombinationen von Wochentagen benötigen reicht ein Datenbankfeld vom Typ „tinyint(3)“ aus. Tinyint kann nämlich alle Werte bis genau 127 aufnehmen.

Wenn wir jetzt z. B. ein Script nur an den Tagen der Lottoziehung 6 aus 49, nämlich Mittwoch (Dezimal-Wert 8) und Samstag (Dezimal-Wert 64), ausführen wollen speichern wir in dem Datenbankfeld den addierten Wert 72.

Überprüfung mit PHP

Um festzustellen, ob der heutige Tag einem Wochentag des Datenbankfeldes entspricht übersetzen wir das Ergebnis des PHP-Aufrufes date(„w“) gegen die entsprechenden Dezimal-Werte durch ein Array, wobei wir uns die Angabe des keys sparen, da dieser beim nummerischen Array automatisch von 0 an hochzählt. Als nächstes überprüfen wir, ob unser Wert 72 dem heutigen Wochentag entspricht.

$weekdays = 72; // Wert aus der Datenbank: Mittwoch und Samstag
 
$today = date( "w" ); // heutiger Wochentag (0 bis 7)
$value = pow( 2, $today ); // Potzenzwert des heutigen Wochentags
 
if( $value & $weekdays ) // wenn der Potzenwert in den Wochtentagen enthalten ist
{
    echo "Heute ist Mittwoch oder Samstag!";
}

Der Bit-Operator wird durch die Verwendung eines einfachen kaufmännischen Undzeichens „&“ gekennzeichnet und gibt als Ergebnis true oder false zurück. Aus diesem Grund müssen UND-Überprüfungen in if-Bedingungen zwingend mit einem doppelten Undzeichen „&&“ versehen werden.

Wenn mehr als die 7 oben angegebenen Potenzwerte benötigt werden können diese auch per Funktion ermittelt werden. Da ein MySQL-Datenbankfeld vom Typ int (32 Bit) höchstens einen Wert von 2.147.483.647 (2^32) annehmen kann können in diesem Datenbankfeld maximal 31 gleichzeitige Zustände gespeichert werden. Das übrig gebliebene 32. Bit muss für den Fall, dass alle Zustände auf „aktiv“ gesetzt werden, reserviert bleiben da die Summe aller 31 Zustände genau dem Wert 2^32 entsprechen.

PHP-Beispiel für die Überprüfung von Öffnungszeiten

Mit dieser PHP-Funktion "isOpen" kann anhand von übergebenden Öffnungszeiten überprüft werden, ob z. B. ein Ladengeschäft aktuell geöffnet ist. Hierbei werden für die Angabe von Wochentagen ebenfalls deren Dezimal-Werte verwendet.

Überprüfung mit mySQL

Seit der mySQL-Version 5.5 werden Bit-Funktionen und -Operatoren unterstützt. Mit der folgenden SQL-Anweisung können wir alle Spielscheine aus der Datenbank suchen, die an einer Mittwochsziehung teilnehmen. Ausgegeben werden alle Spielscheine, die nur an der Mittwochsziehung oder an der Mittwochs- und Samstagsziehung teilnehmen.

SELECT * FROM spielscheine WHERE (Wochentag & 8) > 0

Technischer Hintergrund

Die Spalte „Binär-Wert in der oberen Tabelle soll Aufschluss darüber geben, wie der Bit-Operator intern arbeitet.

In unserem Beispiel werden zwei Bits gesetzt: Eins für Mittwoch und eins für Samstag. Das Ergebnis ist die Summe der gesetzten Bits.

WochentagBedeutungDezimal-WertBinär-Wert
Mittwoch nur Mittwoch 8 00001000
Samstag nur Samstag 64 01000000
Ergebnis Mittwoch UND Samstag 72 01001000

Im Umkehrschluss ist nun durch das Ergebnis zu erkennen, welche Wochentage hier gesetzt wurden. Nämlich alle, für die im Ergebnis eine 1 zu sehen ist.

Performance-Vorteil

PHP und MySQL ziehen letztlich zum Vergleich ausschließlich den Binär-Wert des Ergebnisses heran um zu überprüfen, welche Bits, also in diesem Falle Wochentage, gesetzt wurden. Die Überprüfung eines Wertes durch den Bitweisen Operator ist um ein vielfaches schneller als gleichwertige Vergleiche mit Dezimalzahlen, da der Computer standardmäßig mit Binärzahlen arbeitet und diese hierbei nicht erst in Dezimalzahlen umgewandelt werden müssen.

php/bitweise.txt · Zuletzt geändert: 2021/01/05 09:59 von webproducer