在我的生活中,我不记得如何设置,删除,切换或测试位域中的位。要么我不确定,要么我把它们弄混了,因为我很少需要它们。所以有一个“bit-cheat-sheet”会很好。
例如:
flags = flags | FlagsEnum.Bit4; // Set bit 4.
or
if ((flags & FlagsEnum.Bit4)) == FlagsEnum.Bit4) // Is there a less verbose way?
你能给出所有其他常见操作的例子吗,最好是在c#语法中使用[Flags]枚举?
c++语法,假设第0位是LSB,假设flags是unsigned long:
检查是否设置:
flags & (1UL << (bit to test# - 1))
检查是否未设置:
invert test !(flag & (...))
Set:
flag |= (1UL << (bit to set# - 1))
明确:
flag &= ~(1UL << (bit to clear# - 1))
切换:
flag ^= (1UL << (bit to set# - 1))
为了获得最佳性能和零垃圾,请使用以下代码:
using System;
using T = MyNamespace.MyFlags;
namespace MyNamespace
{
[Flags]
public enum MyFlags
{
None = 0,
Flag1 = 1,
Flag2 = 2
}
static class MyFlagsEx
{
public static bool Has(this T type, T value)
{
return (type & value) == value;
}
public static bool Is(this T type, T value)
{
return type == value;
}
public static T Add(this T type, T value)
{
return type | value;
}
public static T Remove(this T type, T value)
{
return type & ~value;
}
}
}