Main Content

.NET 列挙型でのビット フラグの使用

MATLAB による System.Enum でのビット演算のサポート

多くの .NET 言語では、System.Flags 属性で定義される列挙型でのビット演算がサポートされています。MATLAB® 言語にはこれと同等の演算がないため、列挙オブジェクトに対してビット演算を行うインスタンス メソッドが用意されています。ビット単位メソッドは、bitandbitnotbitor、および bitxor です。

列挙型では "ビット フラグ" を定義できます。ビット フラグを使用して、列挙型のインスタンスを作成し、メンバーによって定義される値の組み合わせを保存できます。たとえば、ファイルとフォルダーには ArchiveHiddenReadOnly などの属性があります。特定のファイルに対し、1 つ以上のこれらの属性に基づいて演算を行います。ビット演算子により、組み合わせを作成しテストすることができます。

ビット演算子を使用するには、列挙型に以下が含まれていなければなりません。

  • Flags 属性。Framework Version 4 では、これらの列挙型には HasFlag メソッドもあります。

  • 2 のべき乗に対応する値。

.NET 列挙型のビット フラグの作成

以下の例では、MATLAB の例 NetDocEnum.MyDays 列挙型を使用します。

以下のようなアクティビティがスケジュールされているとします。

  • 月曜日 — 10:00 に部門の会議

  • 水曜日と金曜日 — 2:00 にチームの会議

  • 木曜日 — 夜はバレーボール

MyDays 列挙型のメンバーを組み合わせ、2 つのメンバーを結合する bitor メソッドを使用して MATLAB 変数を作成できます。たとえば、チームの会議を行う曜日を示す変数 teamMtgs を作成するには、以下を入力します。

teamMtgs = bitor(...
    NetDocEnum.MyDays.Friday,...
    NetDocEnum.MyDays.Wednesday);

会議のあるすべての曜日を示す変数 allMtgs を作成します。

allMtgs = bitor(teamMtgs,...
    NetDocEnum.MyDays.Monday);

各変数に属する曜日を表示するには、以下を入力します。

teamMtgs
allMtgs
teamMtgs = 
Wednesday, Friday

allMtgs = 
Monday, Wednesday, Friday

変数からのフラグの削除

マネージャーが今週水曜日の会議をキャンセルするとします。変数 allMtgs から Wednesday を削除するには、bitxor メソッドを使用します。

thisWeekMtgs = bitxor(allMtgs,NetDocEnum.MyDays.Wednesday)
thisWeekMtgs = 
Monday, Friday

allMtgs に対して bitxor などのビット単位メソッドを使用しても、allMtgs の値は変更されません。この例では変数 thisWeekMtgs を作成し、演算結果を格納します。

変数のフラグの置換

チームの会議を今後ずっと Wednesday から Thursday に変更するとします。Wednesday を削除するには、bitxor を使用し、bitor を使用して Thursday を追加します。これは永久的な変更であるため、teamMtgs 変数および allMtgs 変数を更新します。

teamMtgs = bitor(...
    (bitand(teamMtgs,...
        bitnot(NetDocEnum.MyDays.Wednesday))),...
    NetDocEnum.MyDays.Thursday);
allMtgs = bitor(teamMtgs,...
    NetDocEnum.MyDays.Monday);
teamMtgs
allMtgs
teamMtgs = 
Thursday, Friday

allMtgs = 
Monday, Thursday, Friday

メンバーシップのテスト

以下のような関数 RemindMe を作成します。

function RemindMe(day)
% day = NetDocEnum.MyDays enumeration
teamMtgs = bitor(...
    NetDocEnum.MyDays.Friday,...
    NetDocEnum.MyDays.Wednesday);
allMtgs = bitor(teamMtgs,...
    NetDocEnum.MyDays.Monday);

if eq(day,bitand(day,teamMtgs))
    disp("Team meeting today.")
elseif eq(day,bitand(day,allMtgs))
    disp("Meeting today.")    
else
    disp("No meetings today!")
end
end

関数 RemindMe を使用します。

today = NetDocEnum.MyDays.Monday;
RemindMe(today)
Meeting today.

参考

| | |

関連するトピック