Attribute Bitweise mit Logischem Oder verknüpfen
Inhaltsverzeichnis
Einleitung[Bearbeiten]
Egal ob in CPlusPlus, was hier als Beispiel dienen soll, oder in anderen Programmiersprachen. Grundsätzlich lassen sich Attribute oder andere Informationen Über Bitweise Logische Oder Operationen zu einem Wert verknüpfen und somit in einer Variable speichern.
Beispiel[Bearbeiten]
Wenn man beispielsweise die CPlusPlus Windows Bibliotheken nutzt um Dateien zu verarbeiten stößt man auf Funktionen, die die Dateiattribute einzelner Dateien als "DWORD" also "Unsigned Long Integer" zurückliefern. Dies ist nur ein Wert, der aber viele Attribute enthalten kann.
Erklärung[Bearbeiten]
Hier werden "einfach" Attribute für jedes Bit Definiert. Siehe: https://docs.microsoft.com/en-us/windows/desktop/fileio/file-attribute-constants
Z.B stehen hier folgende Werte für verschiedene Attribute, die in entsprechend bezeichneten Konstanten hinterlegt sind.
Konstante | Wert | Hexadezimal | Binär |
---|---|---|---|
FILE_ATTRIBUTE_ARCHIVE | 32 | 0x20 | 00100000 |
FILE_ATTRIBUTE_DIRECTORY | 16 | 0x10 | 00010000 |
FILE_ATTRIBUTE_HIDDEN | 2 | 0x2 | 00000010 |
Wenn ich nun z.B. Einen Ordner habe, der sowohl die Eigenschaft "Archiv" als auch "Versteckt" hat wird werden die Eigenschaftsbits auf Bitebene einfach per logischem Oder verknüpft und können so in einem Integer gespeichert werden.
z.B.
00100000 (32) 00010000 (16) 00000010 (2) ------------ (logische ODER Verknüpfung aller drei Werte) 00110010 (ergibt 50)
In C++:
int attributes; attributes = FILE_ATTRIBUTE_DIRECTORY | FILE_ATTRIBUTE_ARCHIVE | FILE_ATTRIBUTE_HIDDEN; cout << endl << attributes;
Ausgabe von Attributes ergibt somit 50 !
Auswertung[Bearbeiten]
Die Auswertung kann sehr leicht durch eine Umkehrung der Prozedur veranlasst werden. Durch die logische UND Verknüpfung.
Wenn wir bei unserem Beispiel bleiben und wir bekommen nun von einer Funktion/Methode den Wert 50 zurückgeliefert, dann müssen wir prüfen ob ein bestimmtes Attribut enthalten ist oder nicht.
Bsp: Ist das Objekt ein Odner (FILE_ATTRIBUTE_DIRECTORY - 16 - 00010000)
00010000 (16 - FILE_ATTRIBUTE_DIRECTORY) 00110010 (50 - Der Wert mit allen Attributen) ------------- (logisches UND) 00010000 (ergibt 16 = FILE_ATTRIBUTE_DIRECTORY)
In C++:
if ((FileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY) //bedeutet also quasi.. "ist dieses attribut enthalten?" !!! { cout << endl << "Das ist ein Verzeichnis"; }
durch die logische UND Verknüpfung mit dem Gesamtergebnis erhalten wir also genau dann das Gesuchte Attribut zurück, wenn es auch enthalten ist.
Fazit[Bearbeiten]
Ein Ziemlich Effektiver Weg also um viele verschiedene Attribute in einer Variablen zu speichern.
H@ppy H@cking