論理演算と論理回路
指導者向けの公開補足
学習本文に加えて、指導の視点・背景・授業での確かめ方を示します。どなたでも読めます。
指導の焦点
AND・OR・NOTを日常語の曖昧さから切り離し、入力と出力の対応で確かめる。「または」に両方が真の場合を含めるか明示する。
一歩踏み込んだ背景
真理値表は、すべての入力の組合せを列挙した仕様として読める。回路の図を暗記させるだけでなく、異なる式が同じ出力になるか比較できる。
授業での確かめ方
入室条件を架空の二つの条件で表し、4通りすべてを検査する。条件の否定を変えたときの違いを表にし、反例で誤りを説明させる。
制度・規格等は本文末尾の参考資料も確認してください。
JSFiddleでコードを試す
JSFiddleは、ブラウザーでHTML・CSS・JavaScriptを入力して実行できるサービスです。短い動作確認から始められます。
- 新しい編集画面を開きます。JavaScriptは通常のJavaScriptを選び、外部ライブラリは追加しません。
- HTML欄にはページの本文、CSS欄には見た目、JavaScript欄には処理を書きます。HTML欄に
<html>や<body>は不要です。JavaScript欄に<script>は付けません。 - DOMを使う例では、JavaScriptの実行タイミングを「On Load」「On DOM Ready」または「No wrap - bottom of body」にします。
- 「Run」を押してResult欄を確認します。書き換えたら再びRunを押します。
console.logの結果は通常、ページではなく開発者ツールのコンソールに出ます。このサイトの計算例をResult欄で読みたいときは、HTML欄に次を入れます。
<pre id="output"></pre>JavaScript欄には次を入れ、console.log(2 + 3);の行を、試したいコード一つに置き換えます。独立した例を複数まとめて貼らないでください。
{
const output = document.getElementById("output");
const console = {
log(...values) {
output.textContent += values.join(" ") + "\n";
}
};
console.log(2 + 3);
}Runを押すと「5」と表示されます。外側の波括弧の中だけで表示用のconsoleを用意しているため、ブラウザー本来のコンソールは変更しません。
HTMLとJavaScriptの両方を載せた実習例は、この表示用コードで囲まず、それぞれの欄へ分けて貼り付けます。保存・共有時は公開範囲を確認し、個人情報やパスワードを入力しないでください。コードは手元にも残しましょう。
この単元でできるようになること
Section titled “この単元でできるようになること”- 基本的な論理演算の出力を真理値表で求められる。
- 文章で示された条件を、曖昧さのない論理式に直せる。
- 一桁の二進数の加算を、論理回路と結び付けられる。
二つの状態で判断を表す
Section titled “二つの状態で判断を表す”論理演算では、条件が成り立つ真と、成り立たない偽を扱う。回路の説明では真を1、偽を0として表すことが多い。実物の回路では電圧の範囲などに対応させるが、ここでは電気の細部を省き、入力と出力の関係だけに注目する。
二つの入力があるなら、組合せは00、01、10、11の四通りである。真理値表は、そのすべてについて出力を列挙した表だ。代表的な場面だけを試すのではなく、条件を満たさない場面も含めて調べる道具になる。
| 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はちょうど一方だけが真のときに真になる。NOTは入力が一つで、真と偽を逆転する。ORとXORの違いは、二つとも真という一行に現れる。
ANDの出力をNOTで反転したものがNAND、ORの出力を反転したものがNORである。たとえば入力がともに0なら、NANDは1、NORも1になる。入力がともに1なら、両者は0になる。異なる入力ではNANDが1、NORが0なので、同じ回路ではない。回路を組み合わせる際は、中間の出力を次の回路の入力として順番に追う。
文章を分解してから結ぶ
Section titled “文章を分解してから結ぶ”架空の実験室で、「予約があり、かつ担当者がいる場合に利用できる」とする。予約の有無をA、担当者の有無をBにすれば、利用可能はA AND Bとなる。「予約がある、または当日券がある」ならORだが、「二種類の割引を重ねられない」といった規則は別の条件が必要だ。
条件に使う言葉は、測定や記録で判断できるように具体化する。「空いていそう」ではなく「利用中の人数が定員未満」とすれば、何を比較するかが決まる。自然な文章のまま式に直す前に、各入力が何を意味するかを揃えよう。
for (const reserved of [false, true]) { for (const staffed of [false, true]) { const allowed = reserved && staffed; console.log(Number(reserved), Number(staffed), Number(allowed)); }}出力は順に 0 0 0、0 1 0、1 0 0、1 1 1 である。JavaScriptの && がANDに相当し、ここでは入力を真偽値に限定している。Number は表示のため真偽値を0か1へ変換している。
否定の範囲とド・モルガンの法則
Section titled “否定の範囲とド・モルガンの法則”「予約と担当者の両方がそろうわけではない」は、少なくとも一方が欠けることである。これは「予約がない、または担当者がいない」と同じになる。一方、「予約も担当者もいない」は両方の否定をANDで結ぶため、意味が違う。
一般にNOT(A AND B)は(NOT A) OR (NOT B)と等しく、NOT(A OR B)は(NOT A) AND (NOT B)と等しい。これがド・モルガンの法則である。記号を機械的に書き換えるだけでなく、真理値表の各行で出力が一致することを確かめれば、否定の範囲を理解できる。
論理から一桁の足し算へ
Section titled “論理から一桁の足し算へ”二進数の一桁同士を足すと、0+0は0、0+1と1+0は1、1+1は二進数の10になる。結果の下の桁は、入力が異なるときだけ1なのでXORに対応する。次の桁への繰り上がりは、両方が1のときだけ1なのでANDになる。この二つを組み合わせたものが半加算器である。
半加算器は前の桁から来る繰り上がりを入力に持たない。複数桁を本格的に足すには、その繰り上がりも扱う全加算器などを組み合わせる。論理回路が判断専用なのではなく、演算にも使われることがここから分かる。
たとえば二進数11と01を足すなら、下の桁は1+1で和0、繰り上がり1になる。上の桁では1+0にその繰り上がり1も加え、再び和0、繰り上がり1となる。全体の結果は100である。一桁ごとの入力と出力を接続することで、複数桁の計算を構成できる。
注意: JavaScriptの & と | はビット単位の演算で、&& と || とは異なる。また && や || は一般には真偽値以外を返すこともある。この例では真偽値だけを入力するため、論理表と直接対応できる。
| 用語 | 意味 |
|---|---|
| 真理値表 | 入力の全組合せと出力を対応させた表 |
| AND | 両方が真のとき真になる演算 |
| OR | 少なくとも一方が真なら真になる演算 |
| XOR | ちょうど一方だけが真なら真になる演算 |
| 半加算器 | 一桁同士の和と繰り上がりを求める回路 |
- AとBがともに1のとき、ORとXORの出力はそれぞれいくつか。
- 「予約も担当者もいない」と「両方そろってはいない」を区別できる入力例を一つ挙げよう。
- 一桁の二進数1と1を半加算器に入力すると、和の桁と繰り上がりはどうなるか。
問1の解答例を見る
ORは1、XORは0。ORは少なくとも一方が1なら1になるが、XORは一方だけが1のときに1になる。
問2の解答例を見る
予約が1、担当者が0の場合。「予約も担当者もいない」は偽だが、「両方そろってはいない」は真になる。
問3の解答例を見る
和の桁は0、繰り上がりは1。二進数では1+1=10であり、半加算器ではXORで和、ANDで繰り上がりを求める。