基本情報技術者試験対策(75)「擬似言語(36)ビット列(5)8ビット型(論理演算の組合せ)」

スポンサーリンク
IT系

論理演算の組合せ

論理演算を組み合わせることで、以下の結果が求められる。

$A \land B$(論理積 / AND)

「AとBのどちらも成り立つときだけ正解(真)になる」というルールである。

$A \land B$により、A のうち、Bが1である部分のみを抜き出す。
ビットマスクに AND を使う。 例は、以下の通りである。

A∧(A-1)

A ∧ (A-1) は「一番右側ある1のビットを0にする」操作である。

計算機科学において非常に有名なビット操作のテクニックである。
A から1を引くと、ビットの状態は次のように変化する。

  1. 一番右側にある 10 に変わる。
  2. その さらに右側にある 0 がすべて 1 に変わる。
  3. それより左側のビットは変わらない。

この状態で、元の A と論理積(AND)をとると、変化した部分がすべて 0 になる。

(テクニック)A∧(A-1)により、1である右端ビットよりも左側部分だけを抜き出す。
この例は、以下の通りである。

$A \land (A – 1)$ は、一番右側の 1 を消去する魔法の式。
2のべき乗の判定ビットカウントの高速化 に使われる。

1. 「2のべき乗」かどうかの判定(A>0)

2のべき乗(2, 4, 8, 16, …)は、2進数にすると必ず 1 は一つだけである。 そのため、この操作を一回行って結果が 0 になれば、それは2のべき乗であると一瞬で判定できる。

  • 判定式: (A > 0) && (A & (A - 1)) == 0
  • (A>0)の理由: A=0の場合、0 & (0-1) = 0 & 0xFFFFFFFF = 0 となり、条件を満たしてしまうため、0を除外する必要がある。

2. 立っているビット(1)の数を数える

整数の中に 1 がいくつあるかを数える際、通常は全ビットをチェックするが、この操作を使えば 1 の数と同じ回数のループ だけで計算が終わる(ブライアン・カーニハン法)。

  • 例:1011000 のように 1 が少ない数なら、3回の操作で済む。

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$)反転させる10 に、01 に入れ替える

参考
 情報処理教科書 出るとこだけ!基本情報技術者[科目B]第4版 橋本 祐史 (著) 翔泳社


コメント

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