ビットフラグはなぜ1・2・4? ― PowerShellとVBAでOR・ANDを目で見る

プログラミング・Web開発カテゴリを表すパンダのイラスト プログラミング・Web開発

この記事について
この記事は、生成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を比較する再利用版を置いています。

公式情報

文書情報

記事タイトル
ビットフラグはなぜ1・2・4? ― PowerShellとVBAでOR・ANDを目で見る
作成日
更新日
Source URL
https://papanda925.com/?p=17999

ライセンス: 本記事のうち、当サイトが権利を有する本文・自作図表は、特記なき限り CC BY 4.0 で利用できます。生成AIを活用して作成・編集した内容を含みます。コードについて、別途ライセンス表示またはリンク先GitHubリポジトリのライセンスがある場合は、その条件を優先します。引用・第三者資料・画像・商標等は本ライセンスの対象外です。 利用ポリシー

タイトルとURLをコピーしました