Oft sehe ich Flag-Enum-Deklarationen, die hexadezimale Werte verwenden. Beispielsweise:
[Flags]
public enum MyEnum
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4,
Flag4 = 0x8,
Flag5 = 0x10
}
Wenn ich eine Aufzählung deklariere, erkläre ich sie normalerweise so:
[Flags]
public enum MyEnum
{
None = 0,
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8,
Flag5 = 16
}
Gibt es einen Grund oder eine Begründung dafür, warum manche Leute den Wert lieber hexadezimal als dezimal schreiben? So wie ich es sehe, ist es einfacher, verwirrt zu werden, wenn Hex-Werte verwendet werden und versehentlich Flag5 = 0x16
statt geschrieben werden Flag5 = 0x10
.
c#
.net
enums
enum-flags
Adi Lester
quelle
quelle
10
als0x10
wenn Sie Dezimalzahlen verwenden würden? Zumal es sich um Binärzahlen handelt, mit denen wir es zu tun haben, und hex trivial in / von Binärzahlen konvertierbar ist?0x111
Es ist weit weniger ärgerlich, im Kopf zu übersetzen als273
...Flag1 | Flag2
ist 3 und 3 entspricht keinem Domänenwert vonMyEnum
.Antworten:
Rationales mögen unterschiedlich sein, aber ein Vorteil, den ich sehe, ist, dass Sie hexadezimal daran erinnert werden: "Okay, wir haben es nicht mehr mit Zahlen in der willkürlich vom Menschen erfundenen Welt der Basis zehn zu tun. Wir haben es mit Bits zu tun - der Welt der Maschine - und wir Ich werde nach seinen Regeln spielen. " Hexadezimal wird nur selten verwendet, wenn Sie sich mit Themen auf relativ niedriger Ebene befassen, bei denen das Speicherlayout von Daten von Bedeutung ist. Die Verwendung deutet darauf hin, dass dies die Situation ist, in der wir uns gerade befinden.
Ich bin mir auch nicht sicher über C #, aber ich weiß, dass in C
x << y
eine gültige Konstante für die Kompilierungszeit ist. Die Verwendung von Bitverschiebungen scheint am klarsten zu sein:quelle
x << y
Notation.1 << 10 = KB
,1 << 20 = MB
,1 << 30 = GB
Und so weiter. Es ist wirklich schön, wenn Sie ein 16-KB-Array für einen Puffervar buffer = new byte[16 << 10];
Es macht es leicht zu erkennen, dass dies binäre Flags sind.
Obwohl der Fortschritt es noch deutlicher macht:
quelle
012
ist es eigentlich10
.int
stattdessen sicher fühlen würde . Ich weiß, dass es dumm ist ... aber Gewohnheiten sterben schwer.Ich denke, es liegt nur daran, dass die Sequenz immer 1,2,4,8 ist und dann eine 0 hinzufügt.
Wie Sie sehen können:
und so weiter, solange Sie sich an die Sequenz 1-2-4-8 erinnern, können Sie alle nachfolgenden Flags erstellen, ohne sich an die Potenzen von 2 erinnern zu müssen
quelle
Denn
[Flags]
bedeutet, dass die Aufzählung wirklich ein Bitfeld ist . Mit können[Flags]
Sie die bitweisen Operatoren AND (&
) und OR (|
) verwenden, um die Flags zu kombinieren. Bei solchen Binärwerten ist es fast immer klarer, hexadezimale Werte zu verwenden. Dies ist genau der Grund, warum wir in erster Linie Hexadezimal verwenden . Jedes Hex-Zeichen entspricht genau einem Halbbyte (vier Bits). Mit Dezimalzahl gilt diese 1-zu-4-Zuordnung nicht.quelle
Weil es eine mechanische, einfache Möglichkeit gibt, eine Zweierpotenz in hex zu verdoppeln. In Dezimalzahlen ist dies schwierig. Es erfordert eine lange Vermehrung in Ihrem Kopf. In hex ist es eine einfache Änderung. Sie können dies bis zu einem Punkt ausführen,
1UL << 63
den Sie nicht dezimal ausführen können.quelle
Weil es für Menschen einfacher ist, zu folgen, wo sich die Bits in der Flagge befinden. Jede hexadezimale Ziffer kann in eine 4-Bit-Binärzahl passen.
Normalerweise möchten Sie, dass Ihre Flags keine Bits überlappen. Die einfachste Möglichkeit, dies zu tun und zu visualisieren, besteht darin, Ihre Flags mit hexadezimalen Werten zu deklarieren.
Wenn Sie also Flags mit 16 Bit benötigen, verwenden Sie 4-stellige Hexadezimalwerte. Auf diese Weise können Sie fehlerhafte Werte vermeiden:
quelle