その昔、CPUアーキテクチャでは、機械語命令レベルで掛け算命令を備えているものはありませんでした。
なので、例えば電卓アプリなどを作りたい場合は、自分で掛け算命令にあたる処理を組む必要がありました。
そのため、ひと昔前の基本情報技術者試験でも午後問題のCASL(アセンブラ)で、数年に一度くらいは掛け算処理の問題が出ていました。
さて、掛け算処理A×Bをどうやってアセンブラレベルで実行するかです。
※前提としてCPUに加算命令、シフト命令は機械語命令として備わっているとします。
A×Bの処理を加算に直すとどういう意味になるのかというと、
A+A+…(B回繰り返し)
という意味ですね。難しく考えることありません。
なので、Aの加算処理をB回ループするだけで処理自体は出来上がります。
これで終了です…
…この処理ロジックには致命的な欠陥があります。
Bの掛けたい値が小さい値なら良いのですが、大きくなればなるほど計算量が増えてしまいます。
16bitアーキテクチャだと最大65535倍できるのですが(まぁ65535倍だと大抵の計算結果はオーバーフローしてしまうのですが)、これだと、処理速度的に使い物になりません。
というわけで、この加算処理を効率良く実行する方法を探ります。
(中学数学の知識でOKです…分配の法則って覚えているでしょうか?)
例えば、掛けたい数Bが55だとします。
そうすると「A×55 = A×50 + A×5」のように分離できるという法則です。
これは我々が暗算するときに使う常套手段として、十進数で都合の良い(計算しやすい)数に分離する方法でよく使うのですが、同じようにコンピューターが扱うのに都合の良い数というものがあります。
それが「2のべき乗」です。
55を「2^5(32) + 2^4(16) + 2^2(4) + 2^1(2) + 2^0(1)」と分離して、
A×55 = A×2^5 + A×2^4 + A×2^2 + A×2^1 + A×2^0
このような計算式とします。
そして、上記の計算結果を以下のように求めます。
(xbitの左シフトは2^x倍するという意味です)
①A×2^5 はAを5bit分左シフトして求めます。
②A×2^4 はAを4bit分左シフトして求めます。
…
という形で、シフトする処理を掛けたい数の最大→最小bitまで繰り返して、すべてのシフトした結果の値の累計を求めると掛け算の答えが出ます。
以下、フローチャートです。
(掛ける値Bは2のべき乗の集合体であるというところがミソです)
仕組みを覚えれば、上記のフローチャートも丸暗記する必要はありません。
これで、基礎情報処理のCASLはばっちりだと思います。(CASLの問題では今は出ないかな?)
個人の感想ですが基本情報技術者試験の午後問題では掛け算のアルゴリズムが題材の問題テーマが最難問かと思っています。
これが理解できるレベルであれば他の問題は恐るるに足らずです!
P.S.
上記フローチャートではBを1bit左シフトしながら計算していますが、上位ビットから(下位からでも大丈夫)順番にbitテストして~という流れで組むのも問題ないかと思います。
(signed/unsigned考えるとbitテストの方が良いかも?)
唯一の答えではなく、あくまでいくつかある例の一つになります。