AND・OR・XOR・NOTの違いと使い方|真理値表と計算例

この記事の要点

計算過程をビット単位で確認

入力形式とビット幅を選び、AND・OR・XOR・NOTの結果を比較できます。

ビット演算ツールを使う

AND・OR・XOR・NOTの違い

AND、OR、XORは2つのビットを受け取り、NOTは1つのビットを反転します。最初に1ビット分の真理値表を確認すると、複数桁の計算も同じ規則の繰り返しとして理解できます。

ABANDORXOR
00000
01011
10011
11110

覚え方は、ANDは「両方」、ORは「少なくとも一方」、XORは「どちらか一方だけ」です。

AND:必要なビットを取り出す

ANDは両方のビットが1のときだけ1になります。残したい位置を1、消したい位置を0にしたマスクと組み合わせると、必要な範囲だけを抽出できます。

11110000 (0xF0) AND 00111100 (0x3C) ------------- 00110000 (0x30)

また、value AND maskが0でなければ、マスクで指定したビットのどれかが立っていると判定できます。

OR:特定のビットを1にする

ORはどちらか一方でも1なら1になります。設定したい位置だけを1にしたマスクとORを取ると、元のほかのビットを保持したまま対象ビットを立てられます。

10100000 (0xA0) OR 00000100 (0x04) ------------- 10100100 (0xA4)

同じマスクを何度ORしても結果は変わりません。すでに1のビットを1にしても、そのまま1だからです。

XOR:異なるビットを検出・反転する

XORは2つのビットが異なるときだけ1になります。比較対象と違う位置を見つけるほか、マスクが1の位置だけを反転する操作に使えます。

10101010 (0xAA) XOR 11110000 (0xF0) ------------- 01011010 (0x5A)

同じマスクでもう一度XORすると元に戻ります。(value XOR mask) XOR mask = valueという性質があるためです。

NOT:すべてのビットを反転する

NOTは1つの値に対して、0を1、1を0に変えます。演算対象のビット幅が必要で、8ビットと16ビットでは反転する桁数が異なります。

8ビット NOT 00111100 (0x3C) = 11000011 (0xC3)

8ビットの11000011はUnsignedでは195、Signedでは−61です。NOTの結果が負数に見える場合は、符号付きとして解釈されていないか確認してください。

ビットマスクの実践例

例として、下位4ビットをフラグとして使い、ビット0を読み取り、ビット1を書き込み、ビット2を実行権限とします。

目的マスク演算
実行権限を確認00000100(value AND 0x04) != 0
書き込み権限を設定00000010value OR 0x02
読み取り権限を切替00000001value XOR 0x01
下位4ビットだけ抽出00001111value AND 0x0F

解除したいビットだけを0にする場合は、マスクをNOTで反転してからANDを取ります。8ビットでビット2を解除するなら、value AND (NOT 0x04)です。

よくある質問

AND・OR・XORの違いは何ですか?
ANDは両方が1のとき、ORはいずれかが1のとき、XORは2つが異なるときに結果が1になります。
特定のビットが1か確認するにはどの演算を使いますか?
確認したい位置だけが1のマスクとANDを取り、結果が0でなければそのビットは1です。
特定のビットを1にするにはどの演算を使いますか?
対象位置だけが1のマスクとORを取ります。ほかのビットを変えずに対象ビットを1にできます。
NOTの結果が負数になるのはなぜですか?
固定ビット幅の符号付き整数として結果が解釈されるためです。ビット列を比較するときはビット幅とSigned・Unsignedを確認してください。