Bitweise Operationen mit ganzen Zahlen

Mit dieser Funktion können Ganzzahlen als Bitmuster behandelt werden, die die Zweierkomplementwerte darstellen, bei denen die Bitposition N den Wert 2**N aufweist. Bit werden beginnend bei 0 nummeriert. Diese Operationen funktionieren so, als ob das Vorzeichenbit einer ganzen Zahl endlos nach links erweitert wird. Daher weisen positive ganze Zahlen überall oberhalb des werthöchsten 0-Bits auf, negative ganze Zahlen 1-Bits.

Tabelle 1. Bitweise Ganzzahloperationen von CLEM
Funktion Ergebnis Beschreibung
~~ GANZZ1 ganze Zahl Ergibt das bitweise Komplement der ganzen Zahl GANZZ1. Im Ergebnis steht also eine 1 für jede Bitposition, bei der GANZZ1 den Wert 0 aufweist. Es gilt immer: ~~ GANZZ = -(GANZZ + 1).
GANZZ1 || GANZZ2 ganze Zahl Das Ergebnis dieser Operation ist das bitweise "inklusive Oder" von GANZZ1 und GANZZ2. Im Ergebnis steht also eine 1 für jede Bitposition, bei der bei GANZZ1 und/oder bei GANZZ2 der Wert 1 steht.
GANZZ1 ||/& GANZZ2 ganze Zahl Das Ergebnis dieser Operation ist das bitweise "exklusive Oder" von GANZZ1 und GANZZ2. Im Ergebnis steht also eine 1 für jede Bitposition, bei der entweder bei GANZZ1 oder bei GANZZ2 der Wert 1 steht, nicht jedoch bei beiden.
GANZZ1 && GANZZ2 ganze Zahl Ergibt das bitweise "Und" der ganzen Zahlen GANZZ1 und GANZZ2. Im Ergebnis steht also eine 1 für jede Bitposition, bei der sowohl bei GANZZ1 als auch beiGANZZ2 der Wert 1 steht.
GANZZ1 &&~~ GANZZ2 ganze Zahl Ergibt das bitweise "Und" von GANZZ1 und das bitweise Komplement von GANZZ2. Im Ergebnis steht also eine 1 für jede Bitposition, bei der bei GANZZ1 der Wer 1 und beiGANZZ2 der Wert 0 steht. Diese Operation ist identisch mit GANZZ1 && (~~GANZZ2) und ist sinnvoll zum Bereinigen von in GANZZ2 gesetzten Bits von GANZZ1.
GANZZ << N ganze Zahl Ergibt das Bitmuster von GANZZ1, um N Positionen nach links verschoben. Ein negativer Wert von N führt zu einer Verschiebung nach rechts.
GANZZ >> N ganze Zahl Ergibt das Bitmuster von GANZZ1, um N Positionen nach rechts verschoben. Ein negativer Wert von N führt zu einer Verschiebung nach links.
GANZZ1 &&=_0 GANZZ2 boolesch Entspricht dem booleschen Ausdruck GANZZ1 && GANZZ2 /== 0, ist jedoch effizienter.
GANZZ1 &&/=_0 GANZZ2 boolesch Entspricht dem booleschen Ausdruck GANZZ1 && GANZZ2 == 0, ist jedoch effizienter.
integer_bitcount(GANZZ) ganze Zahl Zählt die Anzahl der 1- oder 0-Bits in der Zweierkomplementdarstellung von GANZZ. Wenn GANZZ nicht negativ ist, ist N die Anzahl der 1-Bits. Wenn GANZZ negativ ist, gibt dieser Wert die Anzahl der 0-Bits an. Aufgrund der Vorzeichenerweiterung gibt es unendlich Viele 0-Bits in nicht negativen ganzen Zahlen bzw. 1-Bits in negativen ganzen Zahlen. Es gilt immer: integer_bitcount(GANZZ) = integer_bitcount(-(GANZZ+1)).
integer_leastbit(GANZZ) ganze Zahl Gibt die Bitposition N des niedrigstwertigen Bits an, das in der ganzen Zahl GANZZ gesetzt wurde. N ist die höchste Potenz von 2, durch die sich GANZZ ohne Rest teilen lässt.
integer_length(GANZZ) ganze Zahl Ergibt die Länge von GANZZ als ganze Zweierkomplementzahl in Bit. N ist also die kleinste ganze Zahl, sodass gilt: GANZZ < (1 << N), wenn GANZZ >= 0. GANZZ >= (-1 << N), wenn GANZZ < 0. Wenn GANZZ nicht negativ ist, ist für die Darstellung von GANZZ als ganze Zahl ohne Vorzeichen ein Feld mit mindestens N Bit erforderlich. Alternativ sind, unabhängig vom Vorzeichen, mindestens N+1 Bit erforderlich, um GANZZ als ganze Zahl mit Vorzeichen darzustellen.
testbit(GANZZ, N) boolesch Testet das Bit an Position N in der ganzen Zahl GANZZ und ergibt den Status von Bit N als booleschen Wert, der bei 1 "wahr" und bei 0 "falsch" ist.