矢沢 久雄 グレープシティ アドバイザリースタッフ

 連載の第1回で,コンピュータを構成するICの中に論理演算を行う論理回路が入っていることを説明しました。連載の第2回では,論理演算の用途として,マスク,セット,反転があることを説明しました。ここで疑問に思ってほしいことがあります。それは「どうやらコンピュータは,ハードウエア的に論理演算しかできないようだ。それでも,コンピュータで加減乗除の四則演算ができるのは,なぜだろうか?」ということです。実はコンピュータは,論理演算を組み合せて四則演算を行うのです。今回は,その仕組みを説明しましょう。

表1●2進数の加算結果(その1)

●シンプルな半加算回路

 コンピュータは,内部的にすべてのデータを2進数で取り扱います。そこで,2進数で四則演算を行う方法を考えてみましょう。まずは加算からです。2進数の1けた(0または1)で加算を行うと,その結果は表1[拡大表示]のようになります。ここではけた上がりを考えていません。1+1の結果は10ですが,下位けたは0なので,1+1=0としています。

 表1に見覚えがありませんか? そうです。XOR演算の真理値表と同じです。すなわち2進数1けたの加算結果は,XOR演算で求められるのです。

表2●2進数の加算結果(その2)
 今度はけた上がりも含めて2進数1けたの加算を考えてみましょう。加算結果は,表2[拡大表示]のようになります。先ほど説明したように,加算結果の下位1けたはXOR演算そのものです。それでは,けた上がりの結果はどうでしょう? 表1をよく見てください。そうです。1+1の場合だけ,けた上がりが1となるので,これはAND演算そのものです。

図1●半加算回路
 ICの中には,論理回路が入っているわけですが,そのICに加算機能があるなら,XOR演算とAND演算が使われているはずです。このような回路を「半加算回路(half adder)」と呼びます。なぜ「半」なのかと言うと,下位けたからのけた上がりを考えない中途半端な加算回路だからです。半加算回路をMIL記号で表すと図1[拡大表示]のようになります。2つの論理演算を組み合せていることに注目してください。

●下位けたからのけた上がりも考えた全加算回路

図2●8ビットの2進数を加算する例
 下位けたからのけた上がりを含めて,加算が行える回路を「全加算回路(full adder)」と呼びます。全加算回路は,入力が3つあります。該当するけたの2つの値と,下位けたからけた上がりした値で3つです。ちょっとイメージがわかないという人のために,8けたの2進数を加算する手順を図2[拡大表示]に示しておきます。

 全加算回路の3つの入力と演算結果を表3に示します。cは下位けたからのけた上がりです。表3をよく見て,a+b+cとそのけた上がりがどのような論理演算の組み合せで表せるか考えてください。

表3●2進数の加算結果(その3)

aの値bの値cの値a+b+cの値けた上がり
00000
00110
01010
01101
10010
10101
11001
11111

 こう言うことは,難しく考えないことです。冷静になりましょう。表3のa+b+cの値は表2のa+bの値と同じくけた上がりを考えていません。そこでa+b+cの値は,「aとbの加算結果にcを加算する」すなわち「aとbのXOR演算の結果と,cをXOR演算する」と言えます。したがって論理演算を以下のように組み合わせればよいのです。

a+b+c=(a XOR b)XOR c

 表3のけた上がりは,「a,b,cの中で1であるものが少なくとも2つある」すなわち「aとbが1,またはaとcが1,またはbとcが1」と言えます。したがって論理演算を以下のように組み合わせればよいのです。右辺の末尾にOR(a AND b AND c)も加えるべきだと思われるかもしれませんが,a AND b AND cすなわちa,b,cがすべて1なら(a AND b)OR(a AND c)OR(b AND c)のカッコ内のどれかに一致するので,OR(a AND b AND c)を書く必要はないのです。正しい結果が得られるなら,無駄な論理演算を追加するべきではありません。

けた上がり=(a AND b)OR(a AND c)OR(b AND c)

図3●全加算回路
 以上のことから,全加算回路をMIL記号で表すと図3[拡大表示]のようになります。回路図と論演算の式を見比べて納得してください。

●その他の演算はどうするか?

 加算以外の演算(減算,乗算,除算)は,どのように実現したらよいでしょうか?考えただけでも頭が痛くなりそうですね。でも心配は無用です。コンピュータは,補数を使うことでマイナスの値を表すので,補数の加算で減算を実現できます。補数は,もとの値を反転して1を加えることで実現できるので,aというデータの補数は,(NOT a)+1(補数についてはこちらで詳しく説明しています)となります。乗算は,加算の繰り返しで実現できます。例えば,2×3は,2を3回加算するのと同じです。除算は,減算の繰り返しで実現できます。例えば,10÷2は,10から2が何回引けるかをカウントするのと同じです。これで,四則演算すべてが論理演算で実現できることをご理解いただけましたね。

 論理演算の用途である,マスク,セット,反転といった知識は,実際のプログラミングなどでも大いに役に立ちます。それに対して,今回説明した半加算回路や全加算回路は,それを知ったからといって何かの役に立つわけではありません。とは言え,こういう知識を得ると,コンピュータをより身近に感じられるようになるはずです。次回は,「ド・モルガンの法則」を説明します。お楽しみに!