枚举标志位运算
Bitwise operations on Enum Flag
假设您有以下枚举,其中包含标志。
[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
我的第一个问题:如何对new和old进行位运算,得到异或标志?
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));
最后,您似乎正在寻找按位 &
以获得 added
和 removed
值:
MyFlag added = xor & @new; // 1000
MyFlag removed = xor & old; // 0100
假设您有以下枚举,其中包含标志。
[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
我的第一个问题:如何对new和old进行位运算,得到异或标志?
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));
最后,您似乎正在寻找按位 &
以获得 added
和 removed
值:
MyFlag added = xor & @new; // 1000
MyFlag removed = xor & old; // 0100