C# [Flags] 列挙を使用してビット操作を実行します
[Flags] 属性を持つ列挙では、基になる整数表現の個々のビットを操作できます。これにより、各ビットが特定のフラグまたはオプションを表すビット マスクの簡潔な表現が可能になります。
ビットをセット
[Flags] 列挙にビットを設定するには、ビットごとの OR 演算子 (|) を使用します。
<code class="language-csharp">flags = flags | FlagsEnum.Bit4; // 设置位 4</code>
テストポジション
ビットが設定されているかどうかをテストするには、ビットごとの AND 演算子 (&) を使用します。
<code class="language-csharp">bool isBit4Set = (flags & FlagsEnum.Bit4) != 0;</code>
位置を切り替えます
ビットを切り替えるには (設定されていない場合は設定、設定されている場合はクリア)、ビットごとの XOR 演算子 (^) を使用します。
<code class="language-csharp">flags = flags ^ FlagsEnum.Bit4; // 切换位 4</code>
クリアビット
ビットをクリアするには、ビットごとの AND 演算子 (&) とビット マスクの補数を使用します。
<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# [フラグ] 列挙型でビット単位の操作を実行する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。