繁体   English   中英

删除枚举标志

[英]Removing enum flags

老实说,我对删除枚举标志有点困惑。

让我举个例子,假设我们有一个看起来像这样的枚举

[Flags]
enum Letter 
{
    A = 1, // 1
    B = 2, // 10
    C = 4  // 100
}

现在,如果我想让一个变量保存标志Letter.AB我可以做foo = Letter.A | Letter.B foo = Letter.A | Letter.B 现在这对我来说很有意义,我可以计算它并且它会有意义:

   01
OR 10
 = 11 = 3 = 1 + 2 = A + B = AB

然而,当谈到删除标志时,我很困惑,直觉上我想做的是使用XOR运算符来执行此操作,如下所示:

bar = Letter.A | Letter.B | Letter.C // Set bar to ABC
// Now let's remove everything but Letter.C
bar = bar ^ (Letter.A | Letter.B)

手动计算应该产生:

    111
XOR 011
  = 100 = 4 = C = ABC - (A + B) = 7 - (1 + 2)

但这不是人们在删除枚举标志时似乎做的事情,他们使用AND运算符,这对我来说完全没有意义。 使用XOR运算符删除枚举标志有什么缺点吗? 显然一定有我在这里没有看到的东西,因此非常感谢详细的说明! :)

是的,XOR 运算符的问题在于,除非您知道您已经获得了所有其余的标志,否则它只会翻转它们。 因此,您的 XOR 操作不是“删除除 C 之外的所有内容”——而是“切换 A 和 B 的值”。 (例如,如果输入是“A,C”,您最终会得到“B,C”。)

&是因为它屏蔽了 基本思想是你得到一个只包含你想要的位的值,然后该值与你的输入值的按位 AND 屏蔽它。

要删除一个特定标志(而不是保留该特定标志),您通常会使用~运算符来创建“除该标志之外的所有标志”的掩码。 例如:

var mask = ~Letter.A;
var newValue = originalValue & mask; // All previous values other than A

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM