作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下声明
private uint mask;
Action<FlagEnum> setField = new Action<FlagEnum>(x => this.mask = (uint)x);
例如下面的枚举:
[Flags]
public enum FlagEnum : uint
{
Clear = 0x0,
F1 = 0x1,
F2 = F1 << 1,
F3 = F2 << 1,
F4 = F3 << 1,
F5 = F4 << 1,
F6 = F5 << 1
}
现在我想设置除“清除”标志之外的所有标志。我试过这个:
setField(!FlagEnum.Clear);
但我收到以下消息
Operator '!' cannot be applied to perand of type 'BitMask.FlagEnum'
设置标志,例如:
setField(FlagEnum.F1)
工作正常。
所以问题是我如何使用我的方法设置 FlagEnum 的所有字段而不是“清除”字段?或者这是不可能的,我必须执行此要求。
最佳答案
在您的特定情况下,FlagEnum.Clear
设置为零,这意味着它不能被“设置”。您的标志定义如下(缩短为 8 位):
Clear = 00000000
F1 = 00000001
F2 = 00000010
F3 = 00000100
F4 = 00001000
F5 = 00010000
F6 = 00100000
因此,假设 F2
、F3
和 F5
组合在一起,您的值的二进制表示将是 00010110
- 它是从这三个标志的按位或运算中获得的组合。
但是,应该如何将 Clear
添加到那里? Clear
为零,因此将其与值进行或运算不会改变任何内容。相反,仅当未设置任何其他标志时,您的值才会自动为 Clear
。
如果这不是您想要的,请从将 0x01
分配给 Clear
开始。
通常,您确实可以从标志变量中删除单个值,并且您关于取反标志值的想法是正确的 - 只是在 C# 中,按位 NOT 由波浪号表示 (~
) 而不是用于逻辑非的感叹号。
因此,F2
的反转位模式是 11111101
。要从 00010110
中删除 F2
,OR 将不起作用,因为结果将是 11111111
。相反,取反值必须与之前的标志组合进行 AND 运算:
00010110 & 11111101 = 00010100 (F3, F5)
关于c# - 设置 Flag 枚举的所有值,一个字段除外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14808223/
我是一名优秀的程序员,十分优秀!