利用C# [Flags] 枚举进行位运算
带有[Flags] 属性的枚举允许操作底层整型表示中的单个位。这使得能够简洁地表示位掩码,其中每一位代表一个特定的标志或选项。
设置位
要设置[Flags] 枚举中的位,请使用按位或运算符 (|):
<code class="language-csharp">flags = flags | FlagsEnum.Bit4; // 设置位 4</code>
测试位
要测试是否设置了位,请使用按位与运算符 (&):
<code class="language-csharp">bool isBit4Set = (flags & FlagsEnum.Bit4) != 0;</code>
切换位
要切换位(如果未设置则设置,如果已设置则清除),请使用按位异或运算符 (^):
<code class="language-csharp">flags = flags ^ FlagsEnum.Bit4; // 切换位 4</code>
清除位
要清除位,请使用按位与运算符 (&) 和位掩码的反码:
<code class="language-csharp">flags = flags & ~FlagsEnum.Bit4; // 清除位 4</code>
自定义扩展方法
为方便起见,可以定义以下扩展方法来简化这些操作:
<code class="language-csharp">public static bool Has<T>(this System.Enum type, T value) { return (((int)(object)type & (int)(object)value) == (int)(object)value); } public static bool Is<T>(this System.Enum type, T value) { return (int)(object)type == (int)(object)value; } public static T Add<T>(this System.Enum type, T value) { return (T)(object)(((int)(object)type | (int)(object)value)); } public static T Remove<T>(this System.Enum type, T value) { return (T)(object)(((int)(object)type & ~(int)(object)value)); }</code>
这些扩展方法可以如下使用:
<code class="language-csharp">SomeType value = SomeType.Grapes; bool isGrapes = value.Is(SomeType.Grapes); // true bool hasGrapes = value.Has(SomeType.Grapes); // true value = value.Add(SomeType.Oranges); value = value.Add(SomeType.Apples); value = value.Remove(SomeType.Grapes); bool hasOranges = value.Has(SomeType.Oranges); // true bool isApples = value.Is(SomeType.Apples); // false bool hasGrapes = value.Has(SomeType.Grapes); // false</code>
以上是如何对 C# [Flags] 枚举执行按位运算?的详细内容。更多信息请关注PHP中文网其他相关文章!