Souvent, je vois des déclarations d'énumération de drapeau qui utilisent des valeurs hexadécimales. Par exemple:
[Flags]
public enum MyEnum
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4,
Flag4 = 0x8,
Flag5 = 0x10
}
Lorsque je déclare une énumération, je la déclare généralement comme ceci:
[Flags]
public enum MyEnum
{
None = 0,
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8,
Flag5 = 16
}
Y a-t-il une raison ou une justification pour laquelle certaines personnes choisissent d'écrire la valeur en hexadécimal plutôt qu'en décimal? À mon avis, il est plus facile de se tromper lors de l'utilisation de valeurs hexadécimales et d'écrire accidentellement à la Flag5 = 0x16
place de Flag5 = 0x10
.
c#
.net
enums
enum-flags
Adi Lester
la source
la source
10
plutôt que0x10
si vous utilisiez des nombres décimaux? D'autant que ce sont des nombres binaires avec lesquels nous avons affaire, et hex est trivialement convertible vers / depuis le binaire?0x111
est beaucoup moins ennuyeux à traduire dans sa tête que273
...Flag1 | Flag2
est 3 et 3 ne correspond à aucune valeur de domaine deMyEnum
.Réponses:
Les raisonnements peuvent différer, mais un avantage que je vois est que l'hexadécimal vous rappelle: "D'accord, nous n'avons plus affaire à des nombres dans le monde arbitraire inventé par l'homme de la base dix. Nous avons affaire à des bits - le monde de la machine - et nous va jouer selon ses règles. " L'hexadécimal est rarement utilisé, sauf si vous avez affaire à des sujets de niveau relativement bas où la disposition de la mémoire des données est importante. Son utilisation laisse entendre que c'est la situation dans laquelle nous nous trouvons actuellement.
De plus, je ne suis pas sûr de C #, mais je sais qu'en C
x << y
est une constante de compilation valide. L'utilisation des décalages de bits semble la plus claire:la source
x << y
notation.1 << 10 = KB
,1 << 20 = MB
,1 << 30 = GB
Et ainsi de suite. C'est vraiment bien si vous voulez créer un tableau de 16 Ko pour un tampon, vous pouvez simplement y allervar buffer = new byte[16 << 10];
Cela permet de voir facilement que ce sont des indicateurs binaires .
Bien que la progression le rend encore plus clair:
la source
012
est en fait10
.int
place. Je sais que c'est stupide ... mais les habitudes meurent dur.Je pense que c'est juste parce que la séquence est toujours 1, 2, 4, 8 et ensuite ajouter un 0.
Comme vous pouvez le voir:
et ainsi de suite, tant que vous vous souvenez de la séquence 1-2-4-8, vous pouvez construire tous les drapeaux suivants sans avoir à vous souvenir des pouvoirs de 2
la source
Parce
[Flags]
que cela signifie que l'énumération est vraiment un bitfield . Avec,[Flags]
vous pouvez utiliser les opérateurs binaires AND (&
) et OR (|
) pour combiner les indicateurs. Lorsqu'il s'agit de valeurs binaires comme celle-ci, il est presque toujours plus clair d'utiliser des valeurs hexadécimales. C'est la raison même pour laquelle nous utilisons l' hexadécimal en premier lieu. Chaque caractère hexadécimal correspond à exactement un quartet (quatre bits). Avec décimal, ce mappage 1 à 4 n'est pas vrai.la source
Parce qu'il existe un moyen mécanique et simple de doubler une puissance de deux dans l'hexagone. En décimal, c'est difficile. Cela nécessite une longue multiplication dans votre tête. En hexadécimal, c'est un simple changement. Vous pouvez effectuer cela jusqu'au bout,
1UL << 63
ce que vous ne pouvez pas faire en décimal.la source
Parce qu'il est plus facile à suivre pour les humains où les bits sont dans le drapeau. Chaque chiffre hexadécimal peut contenir un binaire de 4 bits.
En général, vous voulez que vos indicateurs ne chevauchent pas les bits, le moyen le plus simple de le faire et de le visualiser consiste à utiliser des valeurs hexadécimales pour déclarer vos indicateurs.
Donc, si vous avez besoin de drapeaux de 16 bits, vous utiliserez des valeurs hexadécimales à 4 chiffres et vous éviterez ainsi les valeurs erronées:
la source