普通にintにキャストしてもビット演算してもいいのですが、enumのままできる方法を調べた時のメモ。
確認した環境はmono4.0(C#6.0相当)
列挙定数を 2 の累乗 (1、2、4、8 ..,)と宣言するのに加え、FlagsAttribute属性を付与することでビットフィールドとして扱われ、ビット演算が可能となる。
[Flags]
enum language
{
CSharp = 1,
Java = 1 << 1,
Ruby = 1 << 2,
Perl = 1 << 3,
Python = 1 << 4,
}
OR演算を使って複数ビットをもたせる。
language mySkill = language.CSharp | language.Perl;
Console.WriteLine((int)mySkill); // => 9
Console.WriteLine(mySkill); // => CSharp, Perl
ちゃんとビット持っていることを確認。
特定ビットのON/OFFは、普通にビット演算すれば可能。
language mySkill = language.CSharp | language.Perl;
mySkill |= language.Java;
Console.WriteLine(mySkill); // => CSharp, Java, Perl
mySkill &= ~language.Perl;
Console.WriteLine(mySkill); // => CSharp, Java
特定ビットがONであるかどうかはAND演算で可能ですが、HasFlagメソッドを使えばスッキリ。
Enum.HasFlag メソッド
if (mySkill.HasFlag(language.CSharp)) {
Console.WriteLine ("I can write " + language.CSharp);
}
【2014/08/30追記】
HasFlagメソッドは、値型(enum)を参照型(Enum)として扱うため、ボックス化のコストが発生するため、パフォーマンスを気にする場合はAND演算のほうがよいようです。
Temarin_PITAさんコメントありがとうございます。