Bit Operatoren arbeiten mit Ausdrücken oder Werten vom Typ Lange Ganzzahl.
Hinweis: Übergeben Sie einem Bit Operator einen Wert vom Typ Ganzzahl oder Zahl, wertet 4D diesen vor der Berechnung mit einem Bit Operator als Lange Ganzzahl.
Beim Arbeiten mit Bit Operatoren müssen Sie sich den Wert vom Typ Lange Ganzzahl als Array mit 32 Bits vorstellen. Bits sind von rechts nach links von 0 bis 31 durchnumeriert.
Da jedes Bit entweder 0 oder 1 ist, können Sie sich einen Wert vom Typ Lange Ganzzahl auch als Wert vorstellen, der 32 Boolean Werte speichern kann. Ein Bit gleich 1 bedeutet Wahr, ein Bit gleich 0 bedeutet Falsch.
Ein Ausdruck mit Bit Operator gibt einen Wert von Typ Lange Ganzzahl zurück, mit Ausnahme des Operators Bit Test. Hier wird ein Wert vom Typ Boolean zurückgegeben. Es gibt folgende Bit Operatoren:
Operation | Operator | Syntax | Ergibt |
Bitweises UND | & | Lang & Lang | Lang |
Bitweises ODER (inklusiv) | | | Lang | Lang | Lang |
Bitweises ODER (exklusiv) | ^| | Lang ^| Lang | Lang |
Left Bit Shift | << | Lang << Lang | Lang (1) |
Right Bit Shift | >> | Lang >> Lang | Lang (1) |
Bit setzen | ?+ | Lang ?+ Lang | Lang (2) |
Bit löschen | ?- | Lang ?- Lang | Lang (2) |
Bit Test | ?? | Lang ?? Lang | Boolean (2) |
Hinweise
- Für die Operationen Left Bit Shift und Right Bit Shift gibt der zweite Operand die Stellen an, um die die Bits des ersten Operanden verschoben werden. Deshalb sollte dieser zweite Operand zwischen 0 und 31 liegen. Beachten Sie jedoch, dass das Verschieben von 0 einen unveränderten Wert zurückgibt und mehr als 31 Bits 0x00000000 zurückgibt, da hier alle Bits verloren gehen. Übergeben Sie als zweiten Operanden einen anderen Wert, ist das Ergebnis nicht signifikant.
- Für die Operationen Bit setzen, Bit löschen und Bit Test gibt der zweite Operand die Stelle des entsprechenden Bit an. Deshalb muss dieser zweite Operand zwischen 0 und 31 liegen. Sonst ist das Ergebnis des Ausdrucks nicht signifikant.
Folgende Tabelle zeigt die Bit Operatoren und ihre Auswirkung:
Operation | Beschreibung |
Bitweises UND | Jedes resultierende Bit ist das logische UND der Bits in den beiden Operanden. |
| Hier ist die logische UND Tabelle: |
| 1 & 1 --> 1 |
| 0 & 1 --> 0 |
| 1 & 0 --> 0 |
| 0 & 0 --> 0 |
| Das resultierende Bit ist 1, wenn beide Bits der Operanden 1 sind; sonst ist das resultierende Bit 0. |
Bitweises ODER (inkl.) | Jedes resultierende Bit ist das logische ODER der Bits in den beiden Operanden. |
| Hier ist die logische ODER Tabelle: |
| 1 | 1 --> 1 |
| 0 | 1 --> 1 |
| 1 | 0 --> 1 |
| 0 | 0 --> 0 |
| Das resultierende Bit ist 1, wenn mindestens ein Bit der beiden Operanden 1 ist; sonst ist das resultierende Bit 0. |
Bitweises ODER (exkl.) | Jedes resultierende Bit ist das logische ODER (exkl.) der Bits in den beiden Operanden. |
| Hier ist die logische ODER (exkl.) Tabelle: |
| 1 ^| 1 --> 0 |
| 0 ^| 1 --> 1 |
| 1 ^| 0 --> 1 |
| 0 ^| 0 --> 0 |
| Das resultierende Bit ist 1, wenn nur ein Bit der beiden Operanden 1 ist; sonst ist das resultierende Bit 0. |
Left Bit Shift | Der resultierende Wert wird auf den ersten Operanden gesetzt, dann werden die Bits um die im zweiten Operanden angegebenen Stellen nach links verschoben. Die Bits auf der linken Seite gehen verloren, die neuen Bits auf der rechten Seite werden auf 0 gesetzt. |
| Hinweis: Werden nur die positiven Werte berücksichtigt, ist das Verschieben um N Bits nach links dasselbe wie das Multiplizieren mit 2^N. |
Right Bit Shift | Der resultierende Wert wird auf den ersten Operanden gesetzt, dann werden die Bits um die angegebenen Stellen nach rechts verschoben. Die Bits auf der rechten Seite gehen verloren, die neuen Bits auf der linken Seite werden auf 0 gesetzt. |
| Hinweis: Werden nur die positiven Werte berücksichtigt, ist das Verschieben um N Bits nach rechts dasselbe wie das Dividieren durch 2^N. |
Bit setzen | Der resultierende Wert wird auf den ersten Operanden gesetzt, dann wird das Bit, dessen Stelle im zweiten Operanden angegeben ist, auf 1 gesetzt. Die anderen Bits bleiben unverändert. |
Bit Löschen | Der resultierende Wert wird auf den ersten Operanden gesetzt, dann wird das Bit, dessen Stelle im zweiten Operanden angegeben ist, auf 0 gesetzt. Die anderen Bits bleiben unverändert. |
Bit Test | Ergibt wahr, wenn im ersten Operanden das Bit, dessen Stelle im zweiten Operanden angegeben ist, gleich 1 ist. Ergibt Falsch, wenn im ersten Operanden das Bit, dessen Stelle im zweiten Operanden angegeben ist, gleich 0 ist. |
1) Folgende Tabelle zeigt für jeden Bit Operator ein Beispiel:
Operation | Beispiel | Ergebnis |
Bitweises UND | 0x0000FFFF & 0xFF00FF00 | 0x0000FF00 |
Bitweises ODER (incl.) | 0x0000FFFF | 0xFF00FF00 | 0xFF00FFFF |
Bitweises ODER (excl.) | 0x0000FFFF ^| 0xFF00FF00 | 0xFF0000FF |
Left Bit Shift | 0x0000FFFF << 8 | 0x000FFFF0 |
Right Bit Shift | 0x0000FFFF >> 8 | 0x00000FFF |
Bit setzen | 0x00000000 ?+ 16 | 0x00010000 |
Bit löschen | 0x00010000 ?- 16 | 0x00000000 |
Bit Test | 0x00010000 ?? 16 | True |
2) 4D bietet viele vordefinierte Konstanten. Ihre Bezeichnung endet in einigen Fällen mit “bit” oder “mask.” Das gilt zum Beispiel für die Konstanten unter dem Thema
Ressourcen Eigenschaften:
Konstante |
Typ |
Wert |
Changed resource bit |
Lange Ganzzahl |
1 |
Changed resource mask |
Lange Ganzzahl |
2 |
Locked resource bit |
Lange Ganzzahl |
4 |
Locked resource mask |
Lange Ganzzahl |
16 |
Preloaded resource bit |
Lange Ganzzahl |
2 |
Preloaded resource mask |
Lange Ganzzahl |
4 |
Protected resource bit |
Lange Ganzzahl |
3 |
Protected resource mask |
Lange Ganzzahl |
8 |
Purgeable resource bit |
Lange Ganzzahl |
5 |
Purgeable resource mask |
Lange Ganzzahl |
32 |
System heap resource bit |
Lange Ganzzahl |
6 |
System heap resource mask |
Lange Ganzzahl |
64 |
Mit diesen Konstanten können Sie den Wert testen, den die Funktion Get resource properties zurückgibt oder den Wert erstellen, der im Befehl _o_SET RESOURCE PROPERTIES übergeben wurde. Konstanten mit der Endung “bit” liefern die Position des Bit, das Sie testen, löschen oder setzen wollen. Konstanten mit der Endung “mask” liefern einen Wert vom Typ lange Ganzzahl, in der nur das Bit, das Sie testen, löschen oder setzen wollen, den Wert 1 hat.
Sie wollen zum Beispiel prüfen, ob eine Ressource (deren Eigenschaften Sie aus der Variablen $vlResAttr erhalten haben) aus dem Speicher entfernbar ist:
If($vlResAttr ?? Purgeable resource bit)
oder:
Umgekehrt können Sie mit diesen Konstanten dasselbe Bit setzen. Schreiben Sie:
$vlResAttr:=$vlResAttr ?+Entfernbares Ressourcen Bit
oder:
$vlResAttr:=$vlResAttr |Entfernbares Ressourcen Bit
3) Dieses Beispiel speichert zwei Werte vom Typ Zahl in einem Wert vom Typ Lange Ganzzahl:
$vlLong:=($viIntA<<16)|$viIntB
$vlIntA:=$vlLong>>16
$viIntB:=$vlLong & 0xFFFF
Tipp: Seien Sie vorsichtig beim Bearbeiten von Werten vom Typ Ganzzahl oder Zahl in Ausdrücken, die sowohl numerische als auch Bit Operatoren einsetzen. Das hohe Bit (Bit 31 für Lange Ganzzahl, Bit 15 für Zahl) bestimmt das Vorzeichen des Wertes—positiv, wenn es gelöscht wird, negativ, wenn es gesetzt wird. Numerische Operatoren finden anhand dieses Bits das Vorzeichen des Wertes heraus, für Bit Operatoren ist dieses Bit nicht relevant.