Zum Inhalt

TIL – Spaß mit Bitmasken

Häufiger hat man die Anforderung bestimmte Einstellungen zu speichern. In manchen Fällen kann man pro Einstellung bspw. ein Datenbankfeld verwenden und jeweils mit einem Tinyint den Zustand speichern. Allerdings gibt es auch Fälle in denen es Sinn ergeben kann hierfür eine Bitmaske zu verwenden.

Hilfreich ist, dass das .NET Framework alle Werkzeuge, auch für die Konvertierungen zwischen den verschiedenen Datentypen, von Haus aus schon mitbringt.

Hierzu kann man einfach eine simple Enumeration erzeugen und mittels des „Flags“ Attribut kennzeichnen, dass die Enumeration auch als Bitfeld genutzt werden kann.

Ein einfaches Beispiel hierfür kann wie folgt aussehen:

[Flags]
public enum EditDataMode
{
    Create = 1,
    Read = 2,
    Update = 4,
    Delete = 8
}

Eine Instanz kann nun wie folgt erzeugt werden.

EditDataMode dataMode = EditDataMode.Read | EditDataMode.Create | EditDataMode.Delete;

Mittels einer einfachen Hilfsmethode kann man nun prüfen, welches Flag gesetzt ist.

static bool IsFlagSet(EditDataMode bitmask, EditDataMode flag)
{
    return (bitmask & flag) != 0;
}

Nun kann man bspw. prüfen, ob das „Create“-Flag gesetzt ist.

if (IsFlagSet(dataMode, EditDataMode.Create))
{
    Console.WriteLine("Create flag is set.");
}

Praktisch ist, dass man diesen Wert, also die Repräsentierung der Instanz auch als int oder string ausgeben kann.

Console.WriteLine("From EditDataMode to int: {0}", (int)dataMode);
Console.WriteLine("From EditDataMode to string (bin): {0}", Convert.ToString((int)dataMode, 2));

Auch der umgekehrte Weg ist so einfach zu realisieren. Hat man die Bitmask in irgendeiner Form als string gespeichert, so kann man diesen auch einfach wieder in Klassen-Objekt verwandeln.

string input = "0011";
Console.WriteLine("Input: {0}", input);
int convertedInput2Bin = Convert.ToInt32(input, 2);
 
Console.WriteLine("Converted input from string to int: {0}", convertedInput2Bin);
EditDataMode inputDataMode = (EditDataMode) convertedInput2Bin;
Console.WriteLine("EditDataMode to string: {0}", inputDataMode.ToString());

Ein vollständiges Beispiel habe ich bei Github abgelegt.

ExploBitmask

Quellen:

Published in.NET

Schreibe den ersten Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.