LoginSignup
47
45

More than 5 years have passed since last update.

C#のenumでビット演算をする

Last updated at Posted at 2015-08-29

普通にintにキャストしてもビット演算してもいいのですが、enumのままできる方法を調べた時のメモ。
確認した環境はmono4.0(C#6.0相当)


列挙定数を 2 の累乗 (1、2、4、8 ..,)と宣言するのに加え、FlagsAttribute属性を付与することでビットフィールドとして扱われ、ビット演算が可能となる。

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さんコメントありがとうございます。

47
45
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
45