小学校で習った多桁の掛け算のやり方は、被乗数(Multiplicand)に乗数(Multiplier)の最下位の数を掛け、次に被乗数に乗数の次の桁を掛けたものを1桁ずらして足し込むということを順に繰り返すやり方である。例えば、1234 x 368を計算する場合は、次のようになる。
1234 x 8 = 9 8 7 2
1234 x 6 = 7 4 0 4 0
1234 x 3 = 3 7 0 2 0 0
----------------------------
4 5 4 1 1 2
コンピュータで乗算を行う場合も原理は同じであり、違っているのは、2進数で計算を行うので、乗数の一桁が"0"か"1"であるという点である。従って、10進の場合と違って、乗数の各桁について、それが"1"の場合は被乗数の1倍を加え、"0"の場合は何も加えないという選択を行えば良い。
加算器(アダー)を使って、乗算を行う回路を次の図に示す。この回路で、矢印をつけた乗数と積のレジスタは1回の加算ごとに、内容を1ビット右側にシフトするレジスタである。
アダーとシフトレジスタを用いる乗算器の構成 |
まず、積のレジスタはゼロクリアし、乗数、被乗数のレジスタにそれぞれの値を格納して置き、それから乗数レジスタの内容を最下位ビットから順に検査して乗算を行っていく。乗数レジスタの最下位ビットが"0"であれば、ANDゲートによりアダーには"0"が入力され、"1"であればアダーに被乗数が入力される。そして、積レジスタの上位のビット群との加算結果が積レジスタに格納される。
次に、乗数レジスタの内容を1ビット右側にシフトするので、乗数の下位から2ビット目がANDゲートに入力されることになる。また、同時に積レジスタの内容も右に1ビットシフトされるので、アダーの入力で見ると相対的に被乗数入力は1ビット分左シフトされたことになり、筆算で2行目を1桁左にずらしたのと同じことになる。
NビットとNビットの数の積は2N-1ビットの長さになるので、積レジスタは2N-1ビットの長さが必要であるが、このようにシフトを行うことにより、アダーの幅はNビット(とキャリーアウト)で済む。
電卓が出現する昭和40年ころまでは計算機(いわゆる大型の電子計算機は別として)の主流はタイガー計算機であった。機械式のコンピュータである。乗算を行う場合は右上の窓が被乗数レジスタであり、右側の縦縞状に見えるレバーでホイールを廻して被乗数をセットする。そして、右下の窓が積レジスタとなる。そして、右の手前のハンドルを廻す。1回廻すごとに被乗数レジスタの値が積レジスタにメカニカルに加算されるので、乗数の最下位の数字の回数だけハンドルを廻すと、結果として被乗数と乗数の最下位の桁の積が積レジスタに入る。また、同時に廻した回数が左下の窓に表示される。この部分は表示だけであるが、乗数レジスタになる。
そして、次に積レジスタと乗数レジスタの部分をメカニカルに一桁分、右側にスライドする。それから、被乗数の次の桁についてハンドルを廻して、同じように処理を行うと、積レジスタと乗数レジスタは1ポジション右にスライドしているので、前回より一桁上の位置に足し込みが行われ、ハンドルの回転数も乗数レジスタの次の桁に表示される。つまり、前にあげた加算回路は2進法になっているだけで、構造や動作原理はそれ以前のタイガー計算機と全く同じである。
寄り道はこのくらいにして2進の乗算回路に戻ると、この図ではAND回路により被乗数と(その時点での)乗数レジスタの最下位ビットの積を作る形になっているが、アダーでゼロを加算するのは無駄であり、乗数レジスタの最下位ビットが"0"の場合は加算を行わず、乗数レジスタと積レジスタの右シフトだけを行えば良い。但し、この方式では加算と結果の積レジスタへの格納は省略できるが、乗数レジスタの各ビットを順に検査するので、乗算に必要なサイクルはN回で、変わらない。
しかし、この考えを更に進めて乗数レジスタの最下位からの2ビットを同時に検査し、両者ともゼロの場合には、乗数レジスタと積レジスタを2ビット右シフトする構成とすると、ゼロの連続が多い場合には、最良の場合は、乗算に必要なサイクル数が半減する。シフト回路が複雑になるが、同時に検査するビット数を3ビット、4ビットと増やせば、更に高速化が可能である。