AND・OR・XOR・NOTの違いと使い方|真理値表と計算例
この記事の要点
- ANDは抽出・確認、ORは設定、XORは切り替え、NOTは全ビットの反転に向いています。
- 演算は2進数の同じ桁を右からそろえ、1ビットずつ真理値表に当てはめます。
- ビットマスクを使うと、ほかの桁を変えずに特定のビットだけを操作できます。
AND・OR・XOR・NOTの違い
AND、OR、XORは2つのビットを受け取り、NOTは1つのビットを反転します。最初に1ビット分の真理値表を確認すると、複数桁の計算も同じ規則の繰り返しとして理解できます。
| A | B | AND | OR | XOR |
|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
覚え方は、ANDは「両方」、ORは「少なくとも一方」、XORは「どちらか一方だけ」です。
AND:必要なビットを取り出す
ANDは両方のビットが1のときだけ1になります。残したい位置を1、消したい位置を0にしたマスクと組み合わせると、必要な範囲だけを抽出できます。
また、value AND maskが0でなければ、マスクで指定したビットのどれかが立っていると判定できます。
OR:特定のビットを1にする
ORはどちらか一方でも1なら1になります。設定したい位置だけを1にしたマスクとORを取ると、元のほかのビットを保持したまま対象ビットを立てられます。
同じマスクを何度ORしても結果は変わりません。すでに1のビットを1にしても、そのまま1だからです。
XOR:異なるビットを検出・反転する
XORは2つのビットが異なるときだけ1になります。比較対象と違う位置を見つけるほか、マスクが1の位置だけを反転する操作に使えます。
同じマスクでもう一度XORすると元に戻ります。(value XOR mask) XOR mask = valueという性質があるためです。
NOT:すべてのビットを反転する
NOTは1つの値に対して、0を1、1を0に変えます。演算対象のビット幅が必要で、8ビットと16ビットでは反転する桁数が異なります。
8ビットの11000011はUnsignedでは195、Signedでは−61です。NOTの結果が負数に見える場合は、符号付きとして解釈されていないか確認してください。
ビットマスクの実践例
例として、下位4ビットをフラグとして使い、ビット0を読み取り、ビット1を書き込み、ビット2を実行権限とします。
| 目的 | マスク | 演算 |
|---|---|---|
| 実行権限を確認 | 00000100 | (value AND 0x04) != 0 |
| 書き込み権限を設定 | 00000010 | value OR 0x02 |
| 読み取り権限を切替 | 00000001 | value XOR 0x01 |
| 下位4ビットだけ抽出 | 00001111 | value AND 0x0F |
解除したいビットだけを0にする場合は、マスクをNOTで反転してからANDを取ります。8ビットでビット2を解除するなら、value AND (NOT 0x04)です。