Muchas veces veo declaraciones de enumeración de bandera que usan valores hexadecimales. Por ejemplo:
[Flags]
public enum MyEnum
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4,
Flag4 = 0x8,
Flag5 = 0x10
}
Cuando declaro una enumeración, generalmente la declaro así:
[Flags]
public enum MyEnum
{
None = 0,
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8,
Flag5 = 16
}
¿Hay alguna razón o razón por la cual algunas personas eligen escribir el valor en hexadecimal en lugar de decimal? A mi modo de ver, es más fácil confundirse cuando se utilizan valores hexadecimales y escribir accidentalmente en Flag5 = 0x16
lugar de Flag5 = 0x10
.
c#
.net
enums
enum-flags
Adi Lester
fuente
fuente
10
lugar de0x10
usar números decimales? Particularmente ya que estos son números binarios con los que estamos tratando, y ¿hexadecimal es trivialmente convertible a / desde binario?0x111
es mucho menos molesto traducir en la cabeza que273
...Flag1 | Flag2
es 3 y 3 no corresponde a ningún valor de dominio deMyEnum
.Respuestas:
Los fundamentos pueden diferir, pero una ventaja que veo es que el hexadecimal te recuerda: "Está bien, ya no estamos tratando con números en el arbitrario mundo inventado por los humanos de la base diez. Estamos tratando con bits, el mundo de la máquina, y nosotros vamos a jugar según sus reglas ". El hexadecimal rara vez se usa a menos que se trate de temas de nivel relativamente bajo donde el diseño de memoria de los datos es importante. Usarlo sugiere el hecho de que esa es la situación en la que estamos ahora.
Además, no estoy seguro acerca de C #, pero sé que en C
x << y
hay una constante de tiempo de compilación válida. Usar cambios de bit parece lo más claro:fuente
x << y
notación.1 << 10 = KB
``1 << 20 = MB
,1 << 30 = GB
y así sucesivamente. Es realmente agradable si quieres hacer una matriz de 16 KB para un búfer, puedes irvar buffer = new byte[16 << 10];
Hace que sea fácil ver que estos son indicadores binarios .
Aunque la progresión lo hace aún más claro:
fuente
012
es en realidad10
.int
lugar. Sé que es estúpido ... pero los hábitos mueren mucho.Creo que es solo porque la secuencia siempre es 1,2,4,8 y luego agrego un 0.
Como puede ver:
y así sucesivamente, siempre que recuerde la secuencia 1-2-4-8, puede construir todas las banderas posteriores sin tener que recordar los poderes de 2
fuente
Porque
[Flags]
significa que la enumeración es realmente un campo de bits . Con[Flags]
usted puede usar los operadores bit a bit AND (&
) y OR (|
) para combinar las banderas. Cuando se trata con valores binarios como este, casi siempre es más claro usar valores hexadecimales. Esta es la razón por la que usamos hexadecimal en primer lugar. Cada carácter hexadecimal corresponde exactamente a un mordisco (cuatro bits). Con decimal, esta asignación de 1 a 4 no es verdadera.fuente
Porque hay una forma mecánica y simple de duplicar una potencia de dos en hex. En decimal, esto es difícil. Requiere una larga multiplicación en tu cabeza. En hexadecimal es un cambio simple. Puede llevar a cabo esto hasta el punto
1UL << 63
que no puede hacer en decimal.fuente
Porque es más fácil de seguir para los humanos donde están los bits en la bandera. Cada dígito hexadecimal puede caber en un binario de 4 bits.
Por lo general, desea que sus banderas no se superpongan bits, la forma más fácil de hacerlo y visualizarlo es utilizando valores hexadecimales para declarar sus banderas.
Entonces, si necesita banderas con 16 bits, usará valores hexadecimales de 4 dígitos y de esa manera puede evitar valores erróneos:
fuente