「正しいかどうか」を計算できる値に変える

論理演算で扱う真と偽は、文章の内容について感想を述べる言葉ではなく、条件が成立しているかを表す値です。たとえば「気温が25度以上である」という条件は、実際の気温が30度なら真、20度なら偽になります。このように、比較の結果を二つの値のどちらかに決めることで、コンピュータは次に何をするかを選べます。

プログラムでは、数値や文字列を入れる変数と同じように、真偽値を変数へ入れることもできます。真偽値を直接扱えるため、「ログイン済みか」「在庫があるか」「入力内容に誤りがないか」といった状態を、条件式の部品として再利用できます。論理演算は、こうした複数の部品を組み合わせ、一つの判断結果を作る計算です。

真と偽は、しばしば1と0で表されます。ただし、数値の1を足したり0を掛けたりする計算と、真偽値に対する論理演算は目的が異なります。1と0は二つの状態を表す記号として使われているのであり、どの演算規則を適用するかは文脈で決まります。二進法との対応を考えるときも、この区別が大切です。

AND・OR・NOTの結果は真理値表で確かめる

AND(論理積)は、入力した条件が両方とも真のときだけ真になります。「会員である、かつ、期限内である」のように、すべての条件を満たす必要がある場面で使います。一方、OR(論理和)は、少なくとも一方が真なら真です。「現金またはカードで支払える」なら、どちらか一つを選べれば条件を満たします。NOT(否定)は入力が一つで、その真偽を反転させます。「満席である」のNOTは「満席ではない」です。

入力と出力の全組合せを並べた表を真理値表といいます。AとBがそれぞれ真か偽なので、二つの入力には四通りの組合せがあります。

ABA AND BA OR B

真理値表は、条件式の意味を漏れなく確認する道具です。文章だけでは判断しにくい複雑な式でも、入力の組合せごとに結果を書けば、意図した条件になっているかを検証できます。

括弧の位置が複数条件の意味を分ける

論理演算を続けて書くときは、どの演算を先に行うかで結果が変わることがあります。たとえば「A AND (B OR C)」は、BかCのどちらかが真で、さらにAも真であることを求めます。「(A AND B) OR C」では、AとBが両方真である場合に加え、Cだけが真の場合も全体が真になります。同じ三条件を使っていても、要求している内容は同じではありません。

プログラミング言語には演算の優先順位がありますが、括弧を使うと評価する順序を明示できます。読み手に意図を伝え、修正時の取り違えを防ぐためにも、まとまりを括弧で示すことが有効です。また、条件が長くなったら、「年齢の条件」「利用資格の条件」のように途中の結果へ意味の分かる名前を付けると、式の役割を追いやすくなります。

条件の一部を落としたり、ANDとORを取り違えたりすると、本来許可すべき処理を拒否する、または拒否すべき処理を許可することがあります。アルゴリズムの手順が正しくても、分岐に使う論理式が誤っていれば、期待する結果にはなりません。

真偽の規則が論理回路の動作になる

デジタル回路では、二つの区別できる状態を0と1に対応させて情報を扱います。AND、OR、NOTの動作を行う回路は論理ゲートと呼ばれます。複数の論理ゲートを組み合わせると、入力に応じて出力を決める回路を構成できます。数の加算や、記憶する位置の選択など、コンピュータ内部の処理も、基本的な論理演算を組み合わせて実現されます。

ここで重要なのは、回路が文章の意味を理解して「判断」しているわけではないことです。設計された規則に従い、入力の状態から出力の状態を決めています。プログラムの条件式と論理回路は表現の仕方こそ違いますが、真偽の組合せに対して結果を定める点で同じ考え方を共有しています。

論理演算の「または」は両方を含む

日常会話の「紅茶またはコーヒーを選ぶ」は、どちらか一方だけを選ぶ意味で使われることがあります。しかし、通常のORは、一方だけが真の場合に加えて、両方が真の場合も真です。このORは「包含的論理和」と呼ばれます。日常語の感覚だけで条件式を読むと、両方が成立する場合を見落とすことがあります。

二つのうち一方だけが真のときに真としたい場合は、排他的論理和(XOR)を使います。AとBが同じ真偽なら偽、異なる真偽なら真になる演算です。たとえば二つのスイッチの状態が異なるかを判定できます。ORとXORの違いは「両方とも真」の行に現れるため、真理値表で比べると明確です。言葉を演算へ置き換える際には、「少なくとも一つ」なのか「ちょうど一つ」なのかを確かめる必要があります。