Der Martin: Bitweiser Zugriff

Beitrag lesen

Hallo Peter,

mich interessiert, wie bitweiser Zugriff auf low-level-Ebene ausgeführt wird.

das ist eine Operation, die in "Hochsprachen" fast so abgebildet wird, wie sie auf Assemblerebene funktioniert.

Mit PHP schreibt man z.B.

$bit = $foo >> 5 & 1

für das 5. Bit von rechts.

Ja, das ist eine Möglichkeit; wenn man ein Bit testet, ist aber der exakte numerische Wert dieses Bits unerheblich, deswegen wird man in der Regel auf die Shift-Operation verzichten. Schließlich reicht es zu wissen, ob
 $foo & 0x20
ungleich 0 ist.

Wieviele Schritte führt der Prozessor nun aus?

Normalerweise zwei:
 - Operand in ein Register laden
 - UND-Verknüpfung mit Registerinhalt und Konstante
Der dritte Schritt wäre dann schon ein Sprungbefehl, der abhängig davon, ob das Ergebnis der Operation 0 ist, entweder ausgeführt wird oder nicht.

  • 5 Schritte für den Bitshift

Nein, selbst wenn man den Shift ausführen würde (was man meist bleiben lässt), ist das bei modernen CPUs nur ein einziger Schritt. Okay, mehrere Arbeitsschritte, aber nur eine Maschineninstruktion.

  • 1 Schritt für die and-Verknüpfung (oder sind das 32, weil alle Bits verglichen werden?)

Normalerweise wird eine UND-Verknüpfung mit ALLEN Bits im Register parallel durchgeführt, also je nach Architektur 8, 16, 32 oder gar 64 Bits auf einmal.

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).

Viele Compiler sind in der Tat so schlau, diesen Ausdruck zu optimieren.

In welchen Programmiersprachen ist ein solcher direkter Zugriff (entweder per Adressierung im Programmoce oder durch die Compiler-Optimierung) möglich? Ist das überhaupt möglich?

In Assembler auf jeden Fall, aber C ist nahe dran.

Hängt die Sache vielleicht vom verwendeten Prozessor ab?

Ja, natürlich auch. Der legendäre 8bit-Prozessor des C64 (6502 bzw. 6510) konnte zum Beispiel nur um ein Bit pro Befehl schieben. Aber wenn man das sowieso weglässt ...

Schönen Abend noch,
 Martin

--
Gültig sind Frauen ab 16, wohlgeformt ab 160 Pfund.
  (Gunnar Bittersmann)