指定した桁だけを 強制的に 0 にしたいとき、その桁を 1 にしたマスクを NOT で反転 してから AND を取ります。他の桁は元の値のまま。
ビットマスクで 0 にするとは、ビット列の中で狙った桁だけを強制的に 0 にする操作のことです。日常で例えるなら「マスキングテープで塗り潰さない部分を保護してから塗装する」イメージ。塗装される(0 になる)のはマスクのある桁、保護された桁は元のままです。
やり方は決まったパターンで、「0 にしたい桁を 1 にしたマスク」を作り、それを NOT で反転してから値と AND を取るだけ。プログラミング言語では value & ~mask と書きます。上のツールで mask スライダーや個別ビットを動かすと、結果が連動して 1 が 0 に塗り替わる様子が見えます。
なぜ AND と「反転マスク」で 0 にできるのか、AND の性質から確かめます。AND は「両方 1 なら 1、片方でも 0 なら 0」。これを 1 桁ずつ当てはめると次のようになります。
・反転後のマスクが 0 の桁:値が何であっても x AND 0 = 0。必ず 0 になる
・反転後のマスクが 1 の桁:x AND 1 = x。元の値がそのまま残る
重要なのは「0 にしたい桁を 1 にしたマスク」を作る、ということです。直感的にはマスクの 1 の位置が 0 になるので逆に感じますが、NOT で反転すると意味が反転します。具体例:
value: 1111 1111 (= 255)
mask: 0000 1111 (= 15) ← 下位4ビットを 0 にしたい
~mask: 1111 0000 ← NOT で反転
─────────────────────────
AND => 1111 0000 (= 240) ← 下位4ビットが 0 に
「OR で 1 にする」とのペアとして覚えると整理しやすいです。OR は 1 を立てる演算、AND は 0 で落とす演算。マスクの 1 の位置が「操作対象」になる点は両者共通です。
ビットマスクで 0 にする操作は、実務で次のような場面でよく使われます。
・フラグのクリア(OFF にする):1 つのバイトに複数の権限フラグが詰まっているとき、特定の権限だけを剥奪する。「書き込み権限フラグ」だけを落としたい、など
・下位ビットの切り落とし(アドレスのアライメント):メモリアドレスを 16 バイト境界に揃える場合、下位 4 ビットを 0 にする必要がある。これは addr & ~0xF で実現
・カラーチャネルの分離・除去:32 ビット ARGB のうち α チャネル(最上位 8 ビット)だけを 0 にして「不透明度を強制リセット」する処理
・レジスタの特定ビットのリセット:マイコンや CPU で、I/O 制御レジスタの特定ピンだけ無効化したいとき
たとえば「下位 4 ビットを 0 にするマスク」を作るときは、「0 にしたい桁を 1 にする」→「NOT で反転」→「AND を取る」の 3 ステップで求められます。