老实说,我对删除枚举标志感到有点困惑。
让我举个例子,假设我们有一个如下所示的枚举
[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用于删除枚举标志的运算符?显然肯定有一些我在这里没有看到的东西,所以详细的说明将不胜感激! :)
是的,异或运算符的问题是除非你know你已经拥有了所有其余的标志,它只会翻转它们。因此,您的 XOR 操作不是“删除除 C 之外的所有内容”,而是“切换 A 和 B 的值”。 (例如,如果输入是“A,C”,您最终会得到“B,C”。)
&
被使用是因为它是masking。基本思想是,您获得一个仅包含所需位的值,然后将该值与您的输入值按位与进行屏蔽。
要删除一个特定标志(而不是保留该特定标志),您通常会使用~
运算符创建“除该标志之外的所有内容”的掩码。例如:
var mask = ~Letter.A;
var newValue = originalValue & mask; // All previous values other than A
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)