Bitmasken und Binäre Schalter
Bitmasken oder Binärschalter (binary flags) kommen eigentlich aus grauer Vorzeit der Programmierung und wurden hauptsächlich aus zwei Gründen eingesetzt: Sie sind performant und sie kosten wenig Speicher. Heutzutage hat man eigentlich von beidem mehr als genug, was eine solche Technik an und für sich überflüssig macht.
Grundsätzlich stimmt das auch… für Desktop Anwendungen. Im Bereich der Webapplikationen sieht die Sache allerdings etwas anders aus. Eine Webapplikation ist in der Regel 24/7 online und für jedermann verfügbar. Beliebte Websites müssen enorme Mengen an gleichzeitigen Anfragen bearbeiten und ausliefern. Da kann jedes bisschen Leistungssteigerung eine enorme Hilfe sein.
Wie Funktionierts
Als ambitionierte Entwickler sollten wir wissen, dass ein Bit genau zwei Zustände haben kann, genau wie ein Schalter (von Dimmern mal abgesehen). Ein Byte kann man also auch als 8-Schalter Reihe betrachten. Jede Binärstelle kann man so als für sich allein stehenden EIN/AUS Schalter verwenden.
Angenommen, wir haben ein Userprofil das vier verschiedene Anzeigeelemente hat, die einzeln ein und ausgeschaltet werden können.
- Benutzerbild
- Signatur
- Echter Name
Hierfür können wir uns Binärschalter definieren, die wiefolgt aussehen könnten:
define('SHOW_PICTURE',1); // 00000001 define('SHOW_SIGNATURE',2); // 00000010 define('SHOW_EMAIL',4); // 00000100 define('SHOW_REALNAME',8); // 00001000
Jede dieser Konstanten dient zum ein- und ausschalten einer Position. Will man jetzt alle Features einschalten könnte man das so tun:
// kombiniert $state = (SHOW_PICTURE|SHOW_SIGNATURE|SHOW_EMAIL|SHOW_REALNAME); // oder direkt $state = 15; //00001111
Die Obere Zeile verwendet den Binär-Operator ODER um jeden Schalter auf EIN zu stellen. Die Untere Zeile vermeidet das, indem direkt ein Wert zugewiesen wird, der alle Schalter auf EIN stellt. Um bei den Konstanten zu bleiben, definieren wir uns den doch auch direkt mal als
define('SHOW_ALL',15); //00001111;
Auf EIN oder AUS prüfen
Abzuprüfen ob ein Schalter EIN oder AUS ist wird mit logisch UND geprüft. Der UND Operator gibt nur dann WAHR zurück, wenn beide Operanden EIN sind. Will man also beispielsweise wissen ob man die Signatur anzeigen kann man das beispielsweise so prüfen:
if($state & SHOW_SIGNATURE) { // signatur anzeigen }
Ein- und Ausschalten
Will man jetzt einen speziellen Schalter ein oder Ausschalten macht man sich den XOR (^) Operator zu Nutze. Diese Operation ergibt nur dann EIN wenn einer der beiden Opreanden AUS (oder 0) ist.
$state ^= SHOW_REALNAME;
Wenn der Schalter vorher EIN war, ist er jetzt AUS. War er AUS ist er jetzt EIN.
Alle Schalter umkehren
Durch XOR ergibt sich noch die Möglichkeit alle Schalterzustände umzukehren. In dem Beispiel mit dem Userprofil sehe ich zwar keinen wirklichen Sinn darin, warum man das machen wollen würde, aber es gibt ja noch reichlich andere Anwendungsbereiche.
$state ^= SHOW_ALL;
Krass… und was ist daran jetzt so toll?
Ganz einfach, jede dieser Operationen kostet genau einen Prozessor-Tick im gegensatz zum Vergleich von Zeichenketten oder Ähnlichem und der Speicherverbrauch für die komplette Schalttafel ist genau 4 Byte groß.
Keine Kommentare