首页 >后端开发 >C++ >如何对 C# [Flags] 枚举执行按位运算?

如何对 C# [Flags] 枚举执行按位运算?

Patricia Arquette
Patricia Arquette原创
2025-01-13 11:37:44726浏览

How to Perform Bitwise Operations on C# [Flags] Enums?

利用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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn