乗算(掛け算)はどうすればいいでしょう?
一番簡単で分かりやすい方法は、掛け算の基本理念に基づいて、掛けられる数(=被乗数)を掛ける数(=乗数)の回数だけ足せばいいのです。加算器とカウンタがあれば実現できます。しかし、乗数、被乗数が、1桁、2桁の数字なら可能ですが、32ビット(=32桁)の数字の掛け算になると、足し算の回数が最大で232すなわち42億9496万7296回も行わなくてはならず、いくらマイコンの計算が速くても、現実的ではありません。
そこで、2進数の掛け算を“筆算”で行ったときを思い出しましょう。
下の図3を見てください。これは[1010]×[10]の計算を筆算で行ったものです。図中の(1)は乗数の1桁目の乗算、(2)は乗数の2桁目の乗算です。(1)の計算は乗数の一桁目が[0]ですので、結果が[0000]になっています。(2)では乗数の二桁目が[1]ですので、被乗数が、乗数の2桁目にずれているだけになります。2進数の計算には[1]か[0]しかないので、結局、乗数の[1]の立っている桁に被乗数をずらして記述し、最後に全部足せばよいことになります。
数字をずらすことをシフトと呼び、シフトする演算器をシフタと呼びます。この演算器は反転回路のように容易に実現できますので、乗算はシフターと加算器があれば実現できることがお分かりになったと思います。
最も簡単な回路(必要最低限の回路)は1ビット(1桁)のシフタと加算器です。例えば2進数の32ビット(32桁)の数でも、32回シフトして、1が立っていれば最大32回の加算で掛け算を実現できることになります。42億9496万7296回も足し算をする必要はありません。
除算(割り算)も一番簡単で分かりやすい方法は、割り算の基本理念に基づいて、割られる数から割る数を引いていき、商が[1]以下になるまで何回引いたかをカウントする方法です。しかし、これも掛け算と同じように32ビット(32桁)データだと最大で42億9496万7296回も引き算を行わなくてはならず、引き算が必要な分、掛け算よりも手間がかかります。
そこで、これも筆算をして考えてみましょう。図4に[0110]÷[011]の筆算を示します。
割る数は3桁ですので、最初、割られる数[0110]の上位3桁([011])から[011]を割る計算をします。2進数は10進数と違って、[1]か[0]しかありませんから、割られる数の上位3桁から割る数を引けばよいことになります。この計算が終わると、その次の上位3桁と引き算を行い、これを最後の桁まで繰り返せば、商と余りが求められます。図4の場合は、割られる数が4桁、割られる数が3桁ですので、2回だけ計算すれば答えがでます。もし割る数と割られる数の桁が大きく異なっていると、ずらして引き算する回数が増えますので、計算時間が長くなります。しかし、同じ桁だと1回の引き算だけで済むので、短時間で計算が終わります。このアルゴリズムを使えば、やはりシフタと減算器があれば実現できることになります。
ARMのCPUコア「Cortex-M3」にはハードウェアの除算器が内蔵されています。除算の計算時間は2〜12サイクル(1サイクル=1回の計算にかかる時間)と幅があります。除算に必要なサイクル数は、割る数と割られる数の桁に依存しています。割る数と割られる数の桁が同じ場合は2サイクルで計算が完了しますが、異なった桁の数字の計算だと最大で12サイクル必要になります。
どうですか、なんとなくメカニズムを理解できませんか?
Copyright © ITmedia, Inc. All Rights Reserved.