論理演算の組合せ
論理演算を組み合わせることで、以下の結果が求められる。
$A \land B$(論理積 / AND)
「AとBのどちらも成り立つときだけ正解(真)になる」というルールである。
$A \land B$により、A のうち、Bが1である部分のみを抜き出す。
ビットマスクともいう。 例は、以下の通りである。

A∧(A-1)
A∧(A-1)により、1である右端ビットよりも左側部分だけを抜き出す。
言い換えれば、「Aの一番右端にある1を0に変える」という操作である。
A から1を引くと、ビットの状態は次のように変化する。
- 一番右側にある
1が0に変わる。 - その さらに右側にある
0がすべて1に変わる。 - それより左側のビットは変わらない。
この状態で、元の A と論理積(AND)をとると、変化した部分がすべて 0 になる。
なお、「A∧(A-1)により、1である右端ビットよりも左側部分だけを抜き出す」例は、以下の通りである。

$A \land (A – 1)$ は、一番右の 1 を消去する魔法の式。
2のべき乗の判定 や ビットカウントの高速化 に使われる。
A V B(論理和 / OR)
A V Bにより両者の1の部分を合体する。 ビットセットともいう。
「どちらか片方でも 1(真)なら、結果は 1(真)になる」というルールである。
プログラミングでは | という記号で書かれることが多く、ビット操作においては主に「特定のビットを強制的に 1 にする(フラグを立てる)」目的で使われる。
例は、以下の通りである。

ビット操作において OR は、「今の状態を壊さずに、特定のフラグを ON にする」ときに力を発揮する。
$A \oplus 11111111$(XOR演算)
$A \oplus 11111111$により、Aの全ビットを反転させる。
これはビット操作の中でも非常にスマートでよく使われるテクニックである。
例は、以下の通りである。

「1 と XOR をとる」ことは「ビットを反転させる」ことと同じ意味になる。そのため、すべてのビットが 1 である 11111111 と XOR をとれば、全ビットがひっくり返る(NOT演算と同じ結果になる)。
ビット操作の「3大基本」
ビット操作を使いこなすには、AND、OR、XOR の 3つを「やりたいこと」に合わせて使い分けるのがコツである。
| 演算子 | 役割 | イメージ |
| AND ($\land$) | 取り出す・消す | 特定の場所が 1 かどうか確認する(マスク) |
| OR ($\lor$) | セットする | 特定の場所を強制的に 1 にする |
| XOR ($\oplus$) | 反転させる | 1 を 0 に、0 を 1 に入れ替える |
(参考)
情報処理教科書 出るとこだけ!基本情報技術者[科目B]第4版 橋本 祐史 (著) 翔泳社


コメント