コンピュータではデータを二進数で表現する。 では、その足し算はどのような回路で実現されているのだろうか。

本当は複数桁の2進数の足し算を考えたいところである。 しかし、まずは最小の、1桁同士の2進数の簡単な足し算について考えるべきだろう。 難しい問題は分割して、より簡単な小さい問題から考えるとよいからだ。 そして、これを実現する回路が「半加算回路」である。

本記事では、半加算回路について論理式から解説する。 真理値表を機械的に埋めるのではなく、直感的な理解を提供する。

半加算回路の論理式

2つのオン(1)・オフ(0)の入力を受け取って、 その桁における和と次の桁への繰り上げの有無の2つを得られればいい感じだ。 これを組み合わせれば、複数桁の2進数の足し算に使えそうだ

和はSum、繰り上げはCarryなので、この2つの出力はSとCという文字で表す。

2つの入力をA,Bとする。 このとき、SとCはAとBを用いてどう表されるべきか。

  • 両方0の場合は、その桁は0で繰り上がりなし
  • 片方だけ1の場合は、その桁は1で繰り上がりなし
  • 両方1の場合は、その桁は0で繰り上がる

これを真理値表にまとめると以下となる。

|A B | S C| |0 0 | 0 0| |0 1 | 1 0| |1 0 | 1 0| |1 1 | 0 1|

こう考えると、 S = A XOR B C = A AND B

でよさそうだ。

ん?XORって何やねん。

排他的論理和 XOR

XORは eXclusive OR の略であり、排他的論理和と呼ばれる。 排他的論理和というと難しいが、日常の「どっち?」に近い。

「今日の晩飯は焼肉か寿司かどっち?」 と言う場合に、焼肉と寿司のどちらか片方だけだと思うのが普通だろう。

ORは、焼肉と寿司の両方を食べることを許してしまう。 XORは、焼肉か寿司か、どちらかだけだ。 一方が真である場合だけ真を返す。

排他的論理和の別表現

論理演算の基本は AND,OR,NOT だけであるが、XORもかなり身近なものだ。 そして、1桁同士の2進数のその桁の和をうまく表すことができる。

論理演算の基本に対応してそれぞれ、AND回路、OR回路、NOT回路がある。 これが論理回路の基本単位でもある。 XORは日常的に分かりやすいのだが、基本単位ではない。 ANDとORとNOTの組み合わせで表現できるからだ。

どう表現できるだろうか。日常会話から考えてみる。

A XOR B は「AかBかどちらかだけ」

A、かつBでない Aでない、かつB

のどちらか(OR)、で表せそうだ。

これを素直に書くと、 A XOR B = (A AND (NOT B)) OR ((NOT A) AND B)

となる。

A AND (NOT B) と (NOT A) AND B が同時になんて起こり得ない。 その場合は、AとBで二重で矛盾するからだ。

なので、両方が真であることを許容するORでも十分なのである。

真理値で確認してみる。

A B ¬A ¬B A(¬B) (¬A)B A(¬B)+(¬A)B

あとで表を書く

一致している。

半加算回路の基本論理回路による表現

1桁2進数の和Sと繰り上げCを計算する半加算回路をAND OR NOTでどう作ればよいだろうか。

S = A XOR B = (A AND (NOT B)) OR ((NOT A) AND B) C = A AND B

繰り上げCはANDのままである。 問題は排他的論理和で複雑なSである。

Sに A AND B が現れるように変形できれば、Cを流用できる。

ここでテクニカルだが、A(¬A)=0とB(¬B)=0 を加えると、 S = A(¬B) + (¬A)B + A(¬A) + B(¬B) = A(¬B + ¬A) + B(¬A + ¬B) = (A + B)(¬A + ¬B) = (A + B)(¬(AB)) = (A + B)(¬C)

となる。

変形後の式は、「少なくとも一方が1であり、繰り上げはなし」と読める。 両方が1なら繰り上がりが起きるので、結局これは「片方だけが1」という排他的論理和と同じである。 そして、Sには、Cの否定とA OR BのANDとして計算できることが分かる。

mermaidで半加算回路を書く

NANDによる表現

ここまでで、半加算回路はAND・OR・NOTだけで表現できた。 では、この3種類の回路をすべて用意しなければならないのだろうか。

実は、ANDとNOTを組み合わせたNAND回路だけでもAND・OR・NOTをすべて構成できる。 つまり、半加算回路も理論上はNANDだけで作れる。

NANDとは、AかつBを否定するものである。 つまり、

A NAND B = NOT(A AND B)

である。

NANDのmermaidの図

NOTのNAND表現

これを用いて、NOTを考える。

NOTは1つだけ入力を持つ単項演算である。 しかし、NANDは2つの入力を持つ。

どうするか。 同じ入力を2回入れちゃえばよいのだ。

AかつA とは要するにAであり、 それを否定すれば、単なる否定と同じである。

よって、

NOT(A) = A NAND A

ORのNAND表現

次に、ORはどうすればよいか。

否定によるORとANDの相互変換であるド・モルガンの法則と、 二重否定が使えるかもしれない。

A OR B = NOT(NOT(A OR B)) = NOT( NOT(A) AND NOT(B) ) = NOT(A) NAND NOT(B) = (A NAND A) NAND (B NAND B)

ANDのNAND表現

同様にANDも行けそうだ。 二重否定をうまく使えるかも。

A AND B = NOT(NOT(A AND B)) = NOT(A NAND B) = (A NAND B) NAND (A NAND B)

一度ド・モルガン則や分配則などを真理値表で証明してしまえば、それ以降は

分配則 ド・モルガン則 二重否定 吸収則 補元律

などを使って機械的に変形できます。