我经常看到使用十六进制值的标志枚举声明。例如:
[Flags]
public enum MyEnum
{
None = 0x0,
Flag1 = 0x1,
Flag2 = 0x2,
Flag3 = 0x4,
Flag4 = 0x8,
Flag5 = 0x10
}
当我声明一个枚举时,我通常这样声明它:
[Flags]
public enum MyEnum
{
None = 0,
Flag1 = 1,
Flag2 = 2,
Flag3 = 4,
Flag4 = 8,
Flag5 = 16
}
为什么有些人选择用十六进制而不是十进制来写值,有什么原因或理由吗?在我看来,在使用十六进制值和意外地编写Flag5 = 0x16
而不是Flag5 = 0x10
时,更容易混淆。
发布于 2012-11-05 04:47:40
理由可能不同,但我看到的一个好处是,十六进制提醒你:“好吧,我们不再处理人类发明的以十为基数的任意世界中的数字。我们处理的是位--机器的世界--我们将按照它的规则行事。”十六进制很少使用,除非您正在处理数据的内存布局很重要的相对低级主题。使用它暗示了一个事实,那就是我们现在的情况。
此外,我不确定C#,但我知道在C中,x << y
是一个有效的编译时常量。使用位移位似乎是最清楚的:
[Flags]
public enum MyEnum
{
None = 0,
Flag1 = 1 << 0, //1
Flag2 = 1 << 1, //2
Flag3 = 1 << 2, //4
Flag4 = 1 << 3, //8
Flag5 = 1 << 4 //16
}
发布于 2014-08-05 22:02:48
我认为这只是因为序列总是1,2,4,8,然后加一个0。
如你所见:
0x1 = 1
0x2 = 2
0x4 = 4
0x8 = 8
0x10 = 16
0x20 = 32
0x40 = 64
0x80 = 128
0x100 = 256
0x200 = 512
0x400 = 1024
0x800 = 2048
以此类推,只要您记住序列1-2-4-8,您就可以构建所有后续标志,而不必记住2的幂
发布于 2012-11-09 05:04:39
因为有一种机械的,简单的方法可以将十六进制中的2次方加倍。用十进制表示,这很难。它需要在你的头脑中进行长时间的乘法运算。在十六进制中,这是一个简单的更改。你可以一直执行到1UL << 63
,这是不能用十进制数表示的。
https://stackoverflow.com/questions/13222671
复制相似问题