gpt4 book ai didi

c# - 设置 Flag 枚举的所有值,一个字段除外

转载 作者:行者123 更新时间:2023-11-30 22:20:47 25 4
gpt4 key购买 nike

我有以下声明

 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

因此,假设 F2F3F5 组合在一起,您的值的二进制表示将是 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com