Peter Thomassen: Bitweiser Zugriff

Beitrag lesen

Hallo ihr zwei,

$bitmask = Array(0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80);
if ($foo & $bitmask[$botposition])
Uh, das würde ich dann aber wirklich ausprobieren vorher. Dafür muss der Prozessor ja die Speicherposition ausrechnen (ok, da das Array keine komplexeren Datentypen enthält, ist das nicht besonders schwierig) und erstmal den Wert in ein Register laden. Ist das Array dann nicht schon im Prozessor-Cache hat man wahrscheinlich sowieso schon verloren und selbst wenn würde ich nicht erwarten, dass das schneller geht, als ein Shift. Maximal auf dem von Dir genannten Prozessor mit nur 1-Bit-Shift.

Hab die Probe aufs Exempel gemacht und festgestellt, dass es mindestens eine Größenordnung langsamer ist. Der Spontantest war mittels PHP, daher nicht besonders repräsentativ, aber ganz zu vernachlässigen ist das sicher nicht.

Ich glaube, hier ist PHP wirklich ein schlechtes Beispiel; als Scriptsprache, die erst zur Laufzeit interpretiert wird, sind solche Optimierungen da wohl ein Tropfen im Ozean.
Das sind sie ja sowieso fast überall. In einer Scriptsprache aber natürlich erst recht. Was da wirklich abläuft, ist kaum vorhersagbar.

Wie eingangs erwähnt war PHP ja nur ein Beispiel :-) Es kommt vielmehr darauf an, wie man in der Theorie schnellstmöglich auf ein Bit zugreift (dessen Position erst zur Laufzeit feststeht).

Nun kann ich 0x20 entweder als Potenz von 2 oder per links-Shift herstellen, oder aber gleich das zu betrachtende Bit nach rechts schieben, wie es das obigen Codebeispiel tut. Oder gibt es hier eine bessere Vorgehensweise?
Hier sollte man wohl noch anmerken: Auf keinen Fall die Variante mit der Potenz nehmen.

Ja, sowieso :-) Habe es nur der Vollständigkeit halber erwähnt.

Potenzieren ist in irgend welchen Bibliotheken implementiert und wird nicht direkt vom Prozessor umgesetzt. Da erkennt ein Compiler nicht mehr, dass sich das nur um eine Shift-Operation handelt, sondern führt mehrere Multiplikationen aus.

Darauf würde ich jetzt nicht schwören. Der Compiler müsste ja nur sehen, ob die Basis 2 ist (oder allgemein eine Potenz davon, d.h. ob die Basis nur ein 1-Bit enthält).

Bye,
Peter