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フィードバックを取得できます。ローカル設定は不要です。