正在删除枚举标志

本文关键字:标志 枚举 删除 | 更新日期: 2023-09-27 18:26:18

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

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

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

现在,如果我想让一个变量包含标志Letter.AB,我可以执行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