.Net-Framework: Bitweise arbeiten
In vielen Programmier-Projekten speichere ich Zustände von Programmteilen oder Objekten bitcodoert ab.
Autodesk hat diese Möglichkeit z.B. bei der Systemvariable OSMODE, die die Objektfang-Einstellung speichert ebenfalls genutzt. Diese Variable ist bitcodiert.
Diese Systemvariable kann u.a. folgende Werte beinhalten (die vollständige Liste entnehmen Sie bitte aus der AutoCAD-Hilfe):
| 0 | KEIner |
| 1 | ENDPunkt |
| 2 | MITtelpunkt |
| 4 | ZENtrum |
| 8 | PUNkt |
| 16 | QUADrant |
| 32 | SCHnittpunkt |
| 64 | BASispunkt |
Sind mehrere Objektfänge aktiv, werden die Werte der einzelnen aktiven Objektfänge addiert. Möchte man nun feststellen welcher Objektfang aktiviert ist, muss nur überprüft werden welche Bits gesetzt sind und welche nicht.
Ein Beispiel:
Wir nehmen an, dass die Objektfänge ENDPunkt, SCHnittpunkt und ZENtrum aktiv sind. Addieren wir die Werte, so erhalten wir 37 (Addition von 1 + 4 + 32). Der Inhalt der Systemvariable OSMODE ist somit 37.
Müssen im Programm Objektfänge aktiviert oder aktiviert werden, können wir die Systemvariable nach obigen Muster einstellen.
Im Folgenden wir deine Konsolenanwendung vorgestellt, die das Arbeiten mit bitcodierten Variablen erläutert.
Die Methode “SetBit” setzt das gewünschte Bit und gibt den neuen bitcodierten Wert zurück. Die Methode “ToggleBits” löscht ein Bit und gibt ebenfalls den neuen bitcodierten Wert zurück.
Um zu Überprüfen ob ein Bit gesetzt ist oder nicht, wird die Methode “TestBit” benötigt. Diese Methode gibt true bei gesetzten und false bei nicht gesetzten Bit zurück.
namespace BitTest
{
class Program
{
public static void Main(string[] args)
{
UInt32 hByte = 0;
UInt32 hBit = Convert.ToUInt32(1);
hByte = SetBit(hBit, hByte);
hBit = Convert.ToUInt32(2);
hByte = SetBit(hBit, hByte);
hBit = Convert.ToUInt32(4);
hByte = SetBit(hBit, hByte);
hBit = Convert.ToUInt32(8);
hByte = SetBit(hBit, hByte);
hBit = Convert.ToUInt32(16);
if (TestBit(hBit, hByte))
{
Console.Write("\nbit 16 ist gesetzt. Ofang QUADrant");
}
else
{
Console.Write("\nbit 16 ist gesetzt. Ofang QUADrant");
}
hBit = Convert.ToUInt32(8);
hByte = ToggleBits(hBit, hByte);
if (TestBit(hBit, hByte))
{
Console.Write("\nbit 8 ist gesetzt. Ofang PUNkt");
}
else
{
Console.Write("\nbit 8 ist nicht gesetzt. Ofang PUNkt");
}
Console.ReadKey(true);
}
private static bool TestBit(UInt32 bit, uint mask)
{
return (mask & bit) == bit ? true : false;
}
private static UInt32 SetBit(UInt32 bit, uint mask)
{
return mask = (mask | bit);
}
private static UInt32 ToggleBits(UInt32 bit, uint mask)
{
return mask &= ~bit;
}
}
}
Viel Spaß beim Ausprobieren
Autor: Dipl.-Ing. Jürgen A. Becker
Kontakt: Juergen.Becker@CAD-Becker.de oder Juergen.Becker@AUGI.COM
- Langjährige Schulungserfahrung
- Autorisierter AutoCAD Trainer (AutoCAD, Mechanical Desktop etc.)
- Software- und Datenbankentwicklung
