Muitas vezes, vejo declarações de flag enum que usam valores hexadecimais. Por exemplo:
[Flags]
public enum MyEnum
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4,
Flag4 = 0x8,
Flag5 = 0x10
}
Quando declaro uma enumeração, geralmente a declaro assim:
[Flags]
public enum MyEnum
{
None = 0,
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8,
Flag5 = 16
}
Existe uma razão ou razão para que algumas pessoas escolham escrever o valor em hexadecimal em vez de decimal? Na minha opinião, é mais fácil ficar confuso ao usar valores hexadecimais e escrever acidentalmente em Flag5 = 0x16
vez de Flag5 = 0x10
.
c#
.net
enums
enum-flags
Adi Lester
fonte
fonte
10
do que0x10
se usasse números decimais? Principalmente porque estamos lidando com números binários e hex é trivialmente conversível de / para binário?0x111
é muito menos irritante para traduzir em sua cabeça do que273
...Flag1 | Flag2
é 3 e 3 não corresponde a nenhum valor de domínio deMyEnum
.Respostas:
As razões podem diferir, mas uma vantagem que vejo é que o hexadecimal lembra: "Ok, não estamos mais lidando com números no mundo arbitrário e inventado pelo homem da base dez. Estamos lidando com bits - o mundo da máquina - e nós vai jogar de acordo com suas regras. " O hexadecimal raramente é usado, a menos que você esteja lidando com tópicos de nível relativamente baixo, onde o layout da memória dos dados é importante. Usá-lo sugere que essa é a situação em que estamos agora.
Além disso, não tenho certeza sobre C #, mas sei que em C
x << y
é uma constante válida em tempo de compilação. Usar deslocamento de bits parece o mais claro:fonte
x << y
notação.1 << 10 = KB
,1 << 20 = MB
,1 << 30 = GB
E assim por diante. É muito bom se você quiser fazer uma matriz de 16 KB para um buffer que você pode simplesmente irvar buffer = new byte[16 << 10];
Torna fácil ver que esses são sinalizadores binários .
Embora a progressão torne ainda mais claro:
fonte
012
é verdade10
.int
. Eu sei que é estúpido ... mas os hábitos morrem muito.Eu acho que é só porque a sequência é sempre 1,2,4,8 e depois adiciona um 0.
Como você pode ver:
e assim por diante, desde que você se lembre da sequência 1-2-4-8, poderá criar todas as sinalizações subseqüentes sem precisar se lembrar dos poderes de 2
fonte
Porque
[Flags]
significa que o enum é realmente um campo de bits . Com[Flags]
você, você pode usar os operadores AND (&
) e OR (|
) bit a bit para combinar os sinalizadores. Ao lidar com valores binários como esse, é quase sempre mais claro usar valores hexadecimais. Esta é a razão pela qual usamos hexadecimal em primeiro lugar. Cada caractere hexadecimal corresponde a exatamente uma mordidela (quatro bits). Com decimal, esse mapeamento de 1 para 4 não é verdadeiro.fonte
Porque existe uma maneira mecânica e simples de dobrar uma potência de dois em hexadecimal. Em decimal, isso é difícil. Requer longa multiplicação em sua cabeça. Em hexadecimal, é uma mudança simples. Você pode fazer isso até o máximo
1UL << 63
que não puder fazer em decimal.fonte
Porque é mais fácil seguir para humanos onde os bits estão na bandeira. Cada dígito hexadecimal pode caber em um binário de 4 bits.
Normalmente, você deseja que seus sinalizadores não se sobreponham aos bits, a maneira mais fácil de visualizá-lo e usando valores hexadecimais para declarar seus sinalizadores.
Portanto, se você precisar de sinalizadores com 16 bits, usará valores hexadecimais de 4 dígitos e poderá evitar valores errados:
fonte