0Pricing
C# Academy · レッスン

Flags列挙型とビット演算による組み合わせ

Flags属性を使って列挙値を組み合わせます。

「Flags列挙型とビット演算による組み合わせ」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全4レッスンが含まれています。

フラグ列挙型

フラグ列挙型は、複数のオプションの組み合わせを表します。[Flags] 属性を付け、各メンバーには異なる2のべき乗を割り当てます。

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Write;
        Console.WriteLine(a);
    }
}

2のべき乗

各フラグは一意のビットを占有する必要があります。値は1、2、4、8、16のようになります。これにより、値を重複なく組み合わせられます。

using System;

[Flags]
enum Perm { Read = 1, Write = 2, Delete = 4, Share = 8 }
class Program {
    static void Main() {
        Console.WriteLine((int)Perm.Share);
    }
}

OR による組み合わせ

ビット単位の OR(|)を使うと、複数のフラグを1つの値にまとめられます。

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Execute;
        Console.WriteLine((int)a);
    }
}

HasFlag による確認

HasFlag は、組み合わせた値に特定のフラグが含まれているかを確認します。

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Write;
        Console.WriteLine(a.HasFlag(Access.Write));
        Console.WriteLine(a.HasFlag(Access.Execute));
    }
}

ビット単位の AND による確認

& を使ってフラグを確認し、結果が0以外かどうかを比較することもできます。この方法は高速で、処理内容も明確です。

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Write;
        bool canWrite = (a & Access.Write) != 0;
        Console.WriteLine(canWrite);
    }
}

フラグの削除

補数との AND を使ってフラグをクリアします。a &= ~Access.Write のように記述します。

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Write;
        a &= ~Access.Write;
        Console.WriteLine(a);
    }
}

フラグの追加

OR でフラグを追加します。すでに存在する場合は、値は変わりません。

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read;
        a |= Access.Execute;
        Console.WriteLine(a);
    }
}

フラグの切り替え

XOR(^)を使うと、フラグのオンとオフを1ステップで切り替えられます。

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2 }
class Program {
    static void Main() {
        Access a = Access.Read;
        a ^= Access.Write;
        Console.WriteLine(a);
        a ^= Access.Write;
        Console.WriteLine(a);
    }
}

[Flags] が重要な理由

[Flags] 属性を付けると、ToString は単一の数値ではなく、組み合わせたメンバー名を表示します。

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4 }
class Program {
    static void Main() {
        Access a = Access.Read | Access.Execute;
        Console.WriteLine(a);
    }
}

組み合わせたメンバーの定義

All のように、複数のメンバーを組み合わせた便利なメンバーを定義できます。

using System;

[Flags]
enum Access { None = 0, Read = 1, Write = 2, Execute = 4, All = Read | Write | Execute }
class Program {
    static void Main() {
        Console.WriteLine((int)Access.All);
    }
}

実際のフラグの使用

フラグを使うと、アクセス許可、機能の切り替え、オプションの集合を1つの整数で効率よく表現できます。

using System;

[Flags]
enum Feature { None = 0, Dark = 1, Beta = 2, Sync = 4 }
class Program {
    static void Main() {
        Feature f = Feature.Dark | Feature.Sync;
        Console.WriteLine(f.HasFlag(Feature.Beta));
    }
}

クイックチェック

フラグ列挙型についての理解度を確認しましょう。

まとめ

[Flags] 列挙型では各メンバーに一意の2のべき乗を割り当てるため、フラグを | で組み合わせ、HasFlag または & で確認できます。|= で追加し、&= ~ で削除し、^= で切り替えます。

この属性を付けると ToString は組み合わせたメンバー名を表示します。また、All のような便利なメンバーも定義できます。

よくある質問

「Flags列挙型とビット演算による組み合わせ」レッスンは無料ですか?

はい。「Flags列挙型とビット演算による組み合わせ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全4レッスンが含まれています。

「Flags列挙型とビット演算による組み合わせ」で何を学びますか?

Flags属性を使って列挙値を組み合わせます。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C# Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。

「Flags列挙型とビット演算による組み合わせ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC# Academyレッスンでコードを書いて実行できますか?

はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 列挙型の定義と使用
  2. Flags列挙型とビット演算による組み合わせ
  3. 列挙型の変換と解析
  4. 列挙値の反復処理
← C# Academyに戻る