枚举标志上的按位运算

问题描述:

假设您有以下枚举,其中包含标志。枚举标志上的按位运算

[Flags] 
public enum MyFlag 
{ 
    None = 0, 
    Foo = 1 << 0, 
    Bar = 1 << 1, 
    Baz = 1 << 2, 
    Quuz = 1 << 3 
} 

你实例化一个新老:

var newF = MyFlag.Foo | MyFlaq.Quuz; // 1001 
var oldF = MyFlag.Foo | MyFlag.Baz; // 0101 

我的第一个问题:如何在新老执行按位运算,得到了XOR标志?

var xor = ????? // -> should be 1100 

然后一个额外的问题:如何使用该XOR标志来计算添加和删除的标志?

MyFlag added = ????? // Do something with new and xor -> should result in : 1000 
MyFlag removed = ????? // Do same thing with old and xor -> should result in: 0100 

在一张纸上手动执行此操作非常简单。

Bitwise operation on paper.

应该有某种位运算可用于这一权利?请给我看答案,我会将其添加到我的技能组! :-)

的答案是:

var xor = newF^oldF; 
var added = newF & xor; 
var removed = oldF & xor; 
+0

为什么不ÿ你只是谷歌的“C#按位运算符”? –

+1

'^':例如'var xor = @new^old;'请注意,由于'new'是C#中的一个关键字,因此在使用名称时应该将它作为'@ new'。 –

+0

SO不是问这种问题的格式。查看它[文档](https://msdn.microsoft.com/en-us/library/17zwb64t.aspx) – dlatikay

尝试^;请注意,new是在C#关键字那就是当它被用来作为名字,为什么要放在为@new

var @new = MyFlag.Foo | MyFlag.Quuz; // 1001 
    var old = MyFlag.Foo | MyFlag.Baz; // 0101 

    var xor = @new^old; // <- xor 

测试

// 1100 
    Console.Write(Convert.ToString((int)xor, 2)); 

最后,似乎你正在寻找按位&获得addedremoved值:

MyFlag added = xor & @new; // 1000 
    MyFlag removed = xor & old; // 0100 
+0

请添加'var added = newF & xor;'部分,我会接受你的回答。 –