この記事について
この記事は、生成AIを活用した自動生成フローで作成しています。Microsoft公式のPowerShellとVBAのビット演算仕様を確認し、1・2・4のフラグをORで組み合わせ、ANDで判定する理由を小さな整数だけで説明します。検証ステータス:📘 Microsoft公式仕様確認済み・PowerShell/VBA実機未確認
情報確認基準日:2026年10月5日
Windows APIや古いVBAコードを見ると、オプション値が 1、2、4、8 のように並び、それらを組み合わせて1つの整数へ入れていることがあります。
これは各機能を別々のbitへ割り当てるビットフラグです。
1・2・4を2進数で見る
Read = 1 = 0001 Write = 2 = 0010 Delete = 4 = 0100
各値で 1 になっている位置が重なっていません。
ReadとWriteを有効にするとき、PowerShellでは -bor を使えます。
$Read = 1 $Write = 2 $flags = $Read -bor $Write $flags
結果は 3 です。
2進数では、
0001 0010 ---- 0011
です。
ORは「どちらかのbitが1なら1」
flowchart LR
A["Read 0001"] --> C["OR"]
B["Write 0010"] --> C
C --> D["0011 = 3"]
PowerShellの -bor は整数の各bitを比較し、どちらか一方または両方が1なら結果を1にします。
VBAでは数値に対する Or がbit単位のORとして働きます。
Const FlagRead As Long = 1 Const FlagWrite As Long = 2 Dim flags As Long flags = FlagRead Or FlagWrite
ANDで「その機能が入っているか」を見る
Readが入っているか確認します。
PowerShell:
($flags -band $Read) -ne 0
VBA:
(flags And FlagRead) <> 0
0011 AND 0001 は 0001 なので、0ではありません。つまりRead bitが立っています。
Deleteは、
0011 AND 0100 = 0000
なので含まれていません。
「足し算でも3になる」からといって同じではない
ここが一番重要です。
1 + 2 = 3 1 OR 2 = 3
だけを見ると、フラグは足し算でよいように見えます。
しかし同じbitを重ねると違います。
1 + 1 = 2 1 OR 1 = 1
足し算は桁上がりします。ORは「そのbitを立てる」操作なので、すでに1なら1のままです。
したがって、値が重ならない2の累乗だから結果がたまたま同じになるケースがあるのであって、足し算とORは同じ演算ではありません。
1か所だけ変えてみる
Read + Writeの状態へDeleteも足します。
PowerShell:
$Delete = 4 $flags = $Read -bor $Write -bor $Delete
期待する値は 7、2進数なら 0111 です。
次にWriteだけを確認します。
($flags -band $Write) -ne 0
bitごとに機能を持たせると、1つの整数で複数のON/OFF状態を表現できます。
AnyとAllは違う
複数の必要フラグを判定するときは、「どれか1つあればよい」のか「全部必要」なのかを分けます。
例えば必要マスクが Read OR Write = 3、現在のflagsが Read OR Delete = 5 の場合です。
$required = 3 $flags = 5 $common = $flags -band $required $hasAny = $common -ne 0 $hasAll = $common -eq $required
この場合、Readは共通なので hasAny=True、Writeがないので hasAll=False です。
Windows APIの定数でよく出てくる理由
Win32 APIなどでは、1つの引数へ複数オプションを渡すためにフラグ値を組み合わせる設計がよくあります。
00000001 = Option A 00000010 = Option B 00000100 = Option C 00001000 = Option D
それぞれ別bitなら、整数1つを見れば複数状態を保持できます。
ただし、実際のAPIには「単独フラグ」だけでなく、複数bitをまとめた複合定数もあります。値を見て勝手に足し算せず、そのAPIの公式仕様を確認します。
chmodの数字にも似た見方がある
Linuxのpermissionで使う 4、2、1 も、
read = 4
write = 2
execute = 1
というbitの組み合わせで理解できます。
7 は 4+2+1 と表現できますが、本質的には3つのpermission bitがすべて立っている状態です。
実務で使うなら型にも注意する
フラグを扱うときは、
32bitか64bitか
signedかunsignedか
未知bitをどう扱うか
複合マスクか単独フラグか
を確認します。
教材の 1/2/4 をそのまま実システムの権限値へ流用してはいけません。
Daily-Code-Samples
PowerShell版、VBA版、Any/Allを比較する再利用版を置いています。
