Warum werden Flag-Enums normalerweise mit Hexadezimalwerten definiert?
Viele Male, die ich finden-flag-enum-Deklarationen, die Verwendung von hexadezimalen Werten. Zum Beispiel:
[Flags]
public enum MyEnum
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4,
Flag4 = 0x8,
Flag5 = 0x10
}
Wenn ich das deklarieren einer Enumeration, die ich normalerweise erklären es so:
[Flags]
public enum MyEnum
{
None = 0,
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8,
Flag5 = 16
}
Gibt es einen Grund oder Gründe, warum manche Menschen wählen, um Schreibe den Wert in hexadezimal statt dezimal? So wie ich das sehe, ist es leichter zu bekommen verwirrt, wenn Sie mit hex-Werten und versehentlich schreiben Flag5 = 0x16
statt Flag5 = 0x10
.
Kommentar zu dem Problem
Was würde es weniger wahrscheinlich, dass Sie werde schreiben
10
statt 0x10
, wenn Sie Dezimalzahlen? Zumal sind diese binäre zahlen, die wir zu tun haben, und hex ist trivial Cabrio zum/vom binäre? 0x111
ist weit weniger nervig zu übersetzen im Kopf als 273
... Es ist eine Schande, dass C# nicht haben eine syntax, die nicht ausdrücklich verlangen, schreiben die Potenzen von zwei.
Du tust etwas unsinnig hier. Die Absicht hinter Fahnen, dass Sie bitweise kombiniert. Aber die bitweise Kombinationen sind nicht Elemente des Typs. Der Wert
Flag1 | Flag2
ist 3 und 3 nicht entsprechen Domänen-Wert von MyEnum
. Wo siehst du das? mit Reflektor?
@giammin Es ist eine Allgemeine Frage, nicht um eine bestimmte Implementierung. Sie können nehmen, open-source-Projekte oder einfach nur code auf dem Netz zum Beispiel.
InformationsquelleAutor der Frage Adi Lester | 2012-11-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Begründungen mögen unterschiedlich sein, aber ein Vorteil den ich sehe, ist, dass hexadezimal erinnert Sie: "Okay, wir sind nicht der Umgang mit zahlen in der willkürlich Menschen erfunden, die Welt von Basis zehn mehr. Wir sind den Umgang mit bits - der Maschine der Welt - und wir sind gonna spielen das durch seine Regeln." Hexadezimal ist nur selten verwendet, es sei denn, Sie beschäftigen sich mit der relativ low-level-Themen, bei denen das Speicher-layout von Daten ankommt. Verwenden Sie Hinweise auf die Tatsache, dass dies der situation in der wir jetzt sind.
Auch, ich bin mir nicht sicher über C#, aber ich weiß, dass in C
x << y
ist eine gültige Konstante zur Kompilierungszeit.Mit bit-Verschiebungen scheint den meisten klar:
InformationsquelleAutor der Antwort SelectricSimian
Macht es leicht zu sehen, dass diese binäre flags.
Obwohl die progression macht es noch deutlicher:
InformationsquelleAutor der Antwort Oded
Ich denke, es ist nur, weil der Ablauf immer 1,2,4,8 und fügen Sie dann eine 0.
Wie Sie sehen können:
und so weiter, so lange wie Sie sich erinnern die Reihenfolge 1-2-4-8 können Sie bauen alle folgenden flags, die die zimmerreserviereung, ohne das zu erinnern, die Potenzen von 2
InformationsquelleAutor der Antwort VRonin
Weil
[Flags]
bedeutet, dass die enum-ist wirklich ein Bitfeld. Mit[Flags]
Sie den bitweisen UND (&
) und /ODER (|
) Operatoren zur Verknüpfung der flags. Beim Umgang mit binären Werte wie diese, es ist fast immer klar für die Verwendung von hexadezimalen Werten. Dies ist der eigentliche Grund, warum wir verwenden hexadezimal in den ersten Platz. Jedes hex-Zeichen entspricht genau ein nibble (vier bit). Mit dezimal -, diese 1-zu-4-Zuordnung nicht zutreffend.InformationsquelleAutor der Antwort Jonathon Reinhart
Weil es ist ein mechanischer, einfacher Weg, um doppelte power-of-two in hex. In dezimal, das ist hart. Es erfordert lange Multiplikation in Ihrem Kopf. In hex ist es eine einfache änderung. Können Sie diese den ganzen Weg bis zu
1UL << 63
was Sie nicht tun können, in dezimal.InformationsquelleAutor der Antwort usr
Weil es einfacher ist, zu Folgen für die Menschen, wo die bits sind in der Flagge. Jede hexadezimale Ziffer kann passen ein 4-bit-Binär.
In der Regel Sie möchten, dass Ihre Fahnen nicht überlappen bits, die einfachste Weg zu tun und zu visualisieren, ist die Verwendung von hexadezimalen Werten zu erklären, Ihre Fahnen.
Also, wenn Sie brauchen Fahnen mit 16 bits, die Sie verwenden 4-stellige hexadezimal-Werte und auf diese Weise vermeiden Sie fehlerhafte Werte:
InformationsquelleAutor der Antwort Only You