枚举标志上的按位操作

假设您有以下Enumeration,其中包含标志。

[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

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

在纸上按位操作。

应该有这种权利的某种按位操作? 请给我看答案,我会将其添加到我的技能组! :-)

答案是:

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

尝试^ ; 请注意, 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
链接地址: http://www.djcxy.com/p/72507.html

上一篇: Bitwise operations on Enum Flag

下一篇: Right Shift And Left Shift Operator in SQL Server