Image courtesy of „Stuart Miles“ / FreeDigitalPhotos.net
Da ich mich wieder einmal in die Tiefen eines Protokolls herab wagen musste war ich auch mit Bitmasken konfrontiert. Da merkte ich, dass ich nicht mehr wusste, wie binäre Werte in C# anzugeben sind. Also kurz Dr. Google gefragt und die Antwort bei StackOverflow gefunden:
Geht nicht!
Mit der neuen Compiler-Platform „Roslyn“ (C# 6) waren „binary literals“ geplant (Das Feature war für C# im Status „planned“, für VB.NET schon „done“), sind nun aber nicht mehr für den nächsten Release vorgesehen.
Ein paar Vorschläge, wie man sich behelfen kann sind bei StackOverflow auch noch zu finden:
Ein anwendbarer Weg, wenn nicht zu viele Werte nötig sind, ist der Vorschlag von Markus Johnsson:
Man kann die Werte als Konstanten definieren, die mit b… beginnen:
const int b001 = 1;
const int b010 = 2;
const int b011 = 3;
// etc ...
Debug.Assert((b001 | b010) == b011);
Eine andere Variante (von Marc Gravell) ist, mit Strings zu arbeiten und diese zu Parsen:
int i = Convert.ToInt32("01101101", 2);
Sahuagin vertritt in seiner Antwort die Meinung, dass man gefälligst mit hexadezimalen Werten rechnen lernen soll…
Aber der Vorschlag von Dmitry Tashkinov dürfte mehr Ärger verursachen als helfen, wenn er angewendet wird:
long bitMask = 1011001;
// And later
int bit5 = BitField.GetBit(bitMask, 5);
// Or
bool flag5 = BitField.GetFlag(bitMask, 5);`
// Helper class
public static class BitField
{
public static int GetBit(int bitField, int index)
{
return (bitField / (int)Math.Pow(10, index)) % 10;
}
public static bool GetFlag(int bitField, int index)
{
return GetBit(bitField, index) == 1;
}
}
Entsprechend auch der Kommentar dazu: Using int thousand to mean 1-0-0-0 is just asking for trouble.