首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么标志枚举通常定义为十六进制值

为什么标志枚举通常定义为十六进制值
EN

Stack Overflow用户
提问于 2012-11-05 04:39:50
回答 4查看 38.8K关注 0票数 131

我经常看到使用十六进制值的标志枚举声明。例如:

代码语言:javascript
复制
[Flags]
public enum MyEnum
{
    None  = 0x0,
    Flag1 = 0x1,
    Flag2 = 0x2,
    Flag3 = 0x4,
    Flag4 = 0x8,
    Flag5 = 0x10
}

当我声明一个枚举时,我通常这样声明它:

代码语言:javascript
复制
[Flags]
public enum MyEnum
{
    None  = 0,
    Flag1 = 1,
    Flag2 = 2,
    Flag3 = 4,
    Flag4 = 8,
    Flag5 = 16
}

为什么有些人选择用十六进制而不是十进制来写值,有什么原因或理由吗?在我看来,在使用十六进制值和意外地编写Flag5 = 0x16而不是Flag5 = 0x10时,更容易混淆。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-11-05 04:47:40

理由可能不同,但我看到的一个好处是,十六进制提醒你:“好吧,我们不再处理人类发明的以十为基数的任意世界中的数字。我们处理的是位--机器的世界--我们将按照它的规则行事。”十六进制很少使用,除非您正在处理数据的内存布局很重要的相对低级主题。使用它暗示了一个事实,那就是我们现在的情况。

此外,我不确定C#,但我知道在C中,x << y是一个有效的编译时常量。使用位移位似乎是最清楚的:

代码语言:javascript
复制
[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
}
票数 194
EN

Stack Overflow用户

发布于 2014-08-05 22:02:48

我认为这只是因为序列总是1,2,4,8,然后加一个0。

如你所见:

代码语言:javascript
复制
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的幂

票数 44
EN

Stack Overflow用户

发布于 2012-11-09 05:04:39

因为有一种机械的,简单的方法可以将十六进制中的2次方加倍。用十进制表示,这很难。它需要在你的头脑中进行长时间的乘法运算。在十六进制中,这是一个简单的更改。你可以一直执行到1UL << 63,这是不能用十进制数表示的。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13222671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档