Hallo Peter,
- 5 Schritte für den Bitshift
- 1 Schritt für die and-Verknüpfung (oder sind das 32, weil alle Bits verglichen werden?)
Prozessorinstruktionen werden das wohl 2 sein. Ich habe das mal kurz für x86 nachgeguckt. Dort gibt es Shift-Anweisungen, um mehrere Bits weit zu shiften. Der Prozessor muss da natürlich mehrere Schritte durchführen (Ein Schieberegister mehrmals ein Bit weiter setzen oder sowas). Im Vergleich zu Operationen wie einer Multiplikation ist das aber noch ziemlich einfach.
Die &-Verknüpfung geht auf einen Schlag, um zwei Register bitweise & zu Verknüpfen wird es eine Schaltung geben, die das parallel für alle Bits ausführt.
Evtl. kann man auch ein Schieberegister bauen, das mehrere Bit weit in einem Schritt schieben kann, aber solche Überlegungen sind für's Programmieren uninteressant. Selbst auf Maschinensprachebene geht das "in einem Schritt".
2.)
Der Compiler erkennt solche Konstrukte und ersetzt sie durch einen direkten Zugriff auf das Bit. Zur Laufzeit ist das also 1 Schritt (unabhängig vom zu betrachtenden Bit).
Wenn der Prozessor so ein Kommando hat, könnte er das tun. Ich würde jetzt aber vermuten, dass es so etwas idR. nicht gibt und da normalerweise genau die zwei Kommandos "shift" und "&" beim Prozessor auch ankommen.
Wenn die Argumente des Shifts Konstanten sind, kann es noch sein, dass der Compiler das erkennt, den Shift sofort durchführt und direkt das Ergebnis in den erzeugten Maschinencode schreibt.
3.)
Hängt die Sache vielleicht vom verwendeten Prozessor ab?
Klar, Optimierung hängt immer vom Prozessor ab. Die Prozessoren unterstützen ja unterschiedliche Kommandos und diese auch unterschiedlich effizient. Ich würde aber bei so einfachen Sachen nicht erwarten, dass es da nennenswerte Unterschiede gibt.
Grüße
Daniel