Benutzer-Werkzeuge

Webseiten-Werkzeuge


php:bitweise

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Both sides previous revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
php:bitweise [2017/11/23 11:46]
webproducer Beispiel für mySQL hinzugefügt
php:bitweise [2021/01/05 09:59] (aktuell)
webproducer PHP-Beispiel für die Überprüfung von Öffnungszeiten
Zeile 2: Zeile 2:
  
 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: 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:
-^Wochentag^date("​w"​)^Dezimal-Wert^Binär-Wert^ +^Wochentag^date("​w"​)^Rechenformel^Dezimal-Wert^Binär-Wert^ 
-| Sonntag | 0 | 1 | 00000001 | +| Sonntag | 0 | 2 hoch 0 |1 | 00000001 | 
-| Montag | 1 | 2 | 00000010 | +| Montag | 1 | 2 hoch 1 | 2 | 00000010 | 
-| Dienstag | 2 | 4 | 00000100 | +| Dienstag | 2 | 2 hoch 2 | 4 | 00000100 | 
-| Mittwoch | 3 | 8 | 00001000 | +| Mittwoch | 3 | 2 hoch 3 | 8 | 00001000 | 
-| Donnerstag | 4 | 16 | 00010000 | +| Donnerstag | 4 | 2 hoch 4 | 16 | 00010000 | 
-| Freitag | 5 | 32 | 00100000 | +| Freitag | 5 | 2 hoch 5 | 32 | 00100000 | 
-| Samstag | 6 | 64 | 01000000 |+| Samstag | 6 | 2 hoch 6 | 64 | 01000000 |
  
 Für die Erstellung unseres Beispiel sind zunächst nur die Dezimal-Werte interessant. Für die Erstellung unseres Beispiel sind zunächst nur die Dezimal-Werte interessant.
Zeile 23: Zeile 23:
 $weekdays = 72; // Wert aus der Datenbank: Mittwoch und Samstag $weekdays = 72; // Wert aus der Datenbank: Mittwoch und Samstag
  
-$values = array( 1, 2, 4, 8, 16, 32, 64 ); 
 $today = date( "​w"​ ); // heutiger Wochentag (0 bis 7) $today = date( "​w"​ ); // heutiger Wochentag (0 bis 7)
-$value = $values[$today]; // heutigen ​Wert aus Wertezuordnung ermitteln+$value = pow( 2, $today ​); // Potzenzwert des heutigen ​Wochentags
  
-if( $value & $weekdays )+if( $value & $weekdays ) // wenn der Potzenwert in den Wochtentagen enthalten ist
 { {
     echo "Heute ist Mittwoch oder Samstag!";​     echo "Heute ist Mittwoch oder Samstag!";​
 } }
 </​code>​ </​code>​
 +
 +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 [[php:​pow|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 [[php_isopen|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 ==== ==== Überprüfung mit mySQL ====
Zeile 49: Zeile 57:
 Das Ergebnis ist die Summe der gesetzten Bits. Das Ergebnis ist die Summe der gesetzten Bits.
  
-^Wochentag^Dezimal-Wert^Binär-Wert^ +^Wochentag^Bedeutung^Dezimal-Wert^Binär-Wert^ 
-| Mittwoch | 8 |00001000 | +Mittwoch | nur Mittwoch | 8 |00001000 | 
-| Samstag ​ | 64| 01000000 | +| Samstag  ​| nur Samstag ​| 64| 01000000 | 
-| **Ergebnis** | **72** | **01001000** |+| **Ergebnis** ​| Mittwoch UND Samstag ​| **72** | **01001000** |
  
 Im Umkehrschluss ist nun durch das Ergebnis zu erkennen, welche Wochentage hier gesetzt wurden. 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. Nämlich alle, für die im Ergebnis eine 1 zu sehen ist.
- 
-PHP zieht 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. 
  
 ==== Performance-Vorteil ==== ==== Performance-Vorteil ====
  
-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 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.
- +
-==== Umsetzung in PHP ==== +
- +
-Der Bit-Operator wird durch die Verwendung eines einfachen kaufmännischen Undzeichens "&"​ gekennzeichnet und gibt als Ergebnis true oder false zurück. Daher müssen UND-Überprüfungen in if-Bedingungen zwingend mit einem doppelten Undzeichen "&&"​ versehen werden. +
- +
- +
- +
php/bitweise.1511434012.txt.gz · Zuletzt geändert: 2017/11/23 00:00 (Externe Bearbeitung)