如何编写可自动计算2的幂次取值的枚举(Enum)?
自动生成2的幂次取值的枚举编写方法
你要实现的是用于位运算场景的标记枚举(Flags Enum),这类枚举的每个有效取值对应二进制的独立位,因此取值天然是2的整数次幂。你之前示例的错误在于误用了^运算符:在VB语法中^是按位异或运算符,不是求幂运算,因此得不到预期的幂次结果。
正确写法不需要手动计算幂值,使用左移位运算符<<即可按序号自动生成对应取值:
<Flags> Public Enum eSomething NotDefined = 0 ' 0代表无任何标记的默认状态,无需位移 Max = 1 << 0 ' 运算结果为1 → 2^0 Jeff = 1 << 1 ' 运算结果为2 → 2^1 Lisa = 1 << 2 ' 运算结果为4 → 2^2 Donald = 1 << 3 ' 运算结果为8 → 2^3 ' 后续新增枚举项时,仅需将<<后的数字按顺序+1即可,比如下一项写1 << 4 自动得到16,无需手动算值 End Enum
编写注意事项
- 必须在枚举定义前加
<Flags>特性,这是标记枚举的标准约定,编译器、调试器会自动识别其位运算语义,ToString输出时也会自动匹配组合值对应的多个枚举项名称 - 固定保留取值为0的枚举项,用来表示未选中任何标记的状态,命名通常用
None或者你示例里的NotDefined - 新增枚举项时完全不需要记忆或计算2的幂次,只要按顺序给移位操作的右参数递增加1就行,和你预期的“填序号自动得幂值”的效果完全一致
- 如果是C#环境,逻辑完全相同,仅需把特性写法换成
[Flags]即可,移位运算符用法和VB一致。
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

