.NET 列挙型でのビット フラグの使用
MATLAB による System.Enum
でのビット演算のサポート
多くの .NET 言語では、System.Flags
属性で定義される列挙型でのビット演算がサポートされています。MATLAB® 言語にはこれと同等の演算がないため、列挙オブジェクトに対してビット演算を行うインスタンス メソッドが用意されています。ビット単位メソッドは、bitand
、bitnot
、bitor
、および bitxor
です。
列挙型では "ビット フラグ" を定義できます。ビット フラグを使用して、列挙型のインスタンスを作成し、メンバーによって定義される値の組み合わせを保存できます。たとえば、ファイルとフォルダーには Archive
、Hidden
、ReadOnly
などの属性があります。特定のファイルに対し、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.
参考
bitand
| bitnot
| bitor
| bitxor