Bitweise Operatoren

Wussten Sie, dass FrameScript über bitweise Operatoren verfügt und auch komfortable Möglichkeiten bereit stellt mit Binär- und Hex-Zahlen zu arbeiten?

Zunächst zur Darstellung von Ganzzahlen (Integer), da haben Sie drei Möglichkeiten:

  • 123 — als Folge von Ziffern ist es eine Dezimalzahl, das wussten Sie 🙂
  • 7Bh — als Folge von Hex-Buchstaben mit einem »h« am Ende ist es eine hexadezimal notierte Zahl, hier also 7 × 16 + 11 = 123
  • 01111011b — als Folge von Nullen und Einsen mit einem »b« am Ende haben wir die Binärzahl, hier also 64 + 32 + 16 + 8 + 2 + 1 = 123

Wenn es jetzt darum geht, mit diesen Ganzzahlen zu rechnen, gibt es folgendes beachten:

  • Bei der Hex-Notation muss als erstes Zeichen immer einen Ziffer stehen, d.h. statt A0h (für 160) schreiben Sie dann 0A0h.
  • FrameScript unterscheidet nicht zwischen Groß- und Kleinschreibung, d.h. Sie können auch 7bh oder 7bH oder 7BH schreiben, mir erscheint aber 7Bh am übersichtlichsten.
  • Die Division zweier Ganzzahlen wird als Integer-Division ausgeführt: 9 / 4 = 2, wenn Sie hier ein Gleitkommaergebnis wollen, muss einen der Zahlen eine Real-Zahl werden, also z.B. 9.0 / 4 = 2.25

Mit Integer-Zahlen können aber auch die bitweisen Operationen ODER bzw. UND durchgeführt werden:

  • ODER: 0101b #| 0011b = 0111b , 5 #| 3 = 7
  • UND: 0101b #& 0011b = 0001b , 5 #& 3 = 1

Eine direkte Anwendung im FrameMaker-Umfeld ist die Einstellung, auf welchen Farbauszügen einen Farbe sichtbar, ausgeblendet oder ausgespart sein soll (Menüpunkt Darstellung > Farbe > Darstellung). Dafür zuständig ist die Eigenschaft ColorViewCtl, eine 12-Bit-Nummer. Um zu überprüfen, ob einen Farbe in Farbauszug 3 unsichtbar ist, muss Bit 5 gesetzt sein (= eine 1 enthalten). Das kann man sehr komfortabel folgendermaßen überprüfen:

If (lcColor.ColorViewCtl #& 10000b)
  // weitere Operationen
EndIf

In komplexeren Anwendungen kommen auch Shift-Vorgänge (Verschieben aller Bits nach rechts oder links) vor, die durch die Operatoren >> bzw. << dargestellt werden. Diese Operationen entsprechen einer Integer-Division bzw. Multiplikation mit Zweierpotenzen, sind aber performanter:

  • LINKS-SHIFT um 2 Bits: 0101b << 2 = 10100b , 5 * 2² = 20
  • RECHTS-SHIFT um 1 Bit: 1100b >> 1 = 0110b , 12 / 2¹ = 6

Eine letzte Bemerkung: Die bitweisen Operatoren haben einen höheren Rang als die anderen arithmetischen Operatoren, d.h. bei Kombinationen müssen Sie andere Operationen möglicherweise in Klammern setzen.