元はと言えば、20世紀末期に、通産一種ネタで書いたのだけれど、再々・・・掲載。
コンピュータはハードウェアとして論理回路を組み合わせれば様々な機能の回路を作る事が出来、 一方、命令も、マイクロコードといったソフトウェアによって、同様に様々な機能を実現する事が出来るが、 その機能をハードウェアの回路で実現するか、 基本的な回路とマイクロコードといったソフトウェアで実現するか、という問題は有る。 以下は、四則演算のハードウェアとしては加算器のみが有る、という前提で説明をする。
コンピュータ内部での二進法による乗算は、 二進法には0と1しか存在しない事、算術シフトが可能である事を利用し、 一般的な筆算による乗算・除算と同じ手順で行う。
二進法8ビット整数型において、00000011 × 00000101 という乗算を行うとする。
※算術シフトした際に右端に追加される0は省略している。また、赤い桁は、シフトした分だけ桁あふれしている。
これは、
00000011 ← 掛けられる数 3
× 00000101 ← 掛ける数 5
ーーーーーーーーーー
00000011 ← 掛けられる数を0ビット左へ算術シフト 20=1倍 → 3
+ 00000011 ← 掛けられる数を2ビット左へ算術シフト 22=4倍 → 12
ーーーーーーーーーーーー
00001111 ← 計算結果 15
という計算をしている事になり、つまり、掛ける数の各桁の1のビットの位置に合わせて
掛けられる数のビットを左シフトしたものを、最後に加算すれば良い事になる。
5倍するからと言って、5回足し算をする訳では無いのよ。
計算結果の符号は、掛けられる数、掛ける数の符号によって判断する。
十進法では基数倍な10倍を二進法で行うなら、
00000011 ← 掛けられる数 3
× 00001010 ← 掛ける数 10
ーーーーーーーーーー
00000011 ← 掛けられる数を1ビット左へ算術シフト 21=2倍 → 6
+ 00000011 ← 掛けられる数を3ビット左へ算術シフト 23=8倍 → 24
ーーーーーーーーーーーーー
00011110 ← 計算結果 30
となる。
浮動小数点型では、指数部を操作する事で、実現出来る。
コンピュータ内部での二進法による除算も、 二進法には0と1しか存在しない事、算術シフトが可能である事を利用し、 一般的な筆算による除算と同じ手順で行う。