Hallo Martin,
$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.
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.
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. 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.
Grüße
Daniel