プロが教える店舗&オフィスのセキュリティ対策術

CPUの二進数の乗除算の計算で二進数は左にシフトしていけば
2倍、4倍、8倍と増えていくことはわかるのですが、
3倍、5倍、6倍、7倍のときはどのように計算しているのでしょうか?また
1/3倍、1/5倍、1/6倍、1/7倍のときはどのように計算しているのですか?
もし、的確なアルゴリズムがあるのならば教えてほしいですが、
わからなければ上の八通りだけでもいいです。
お願いします。

A 回答 (4件)

CPUでとのことでしたらハードウェアに乗算器、除算器というアーキテクチャがありますのでそれを活用するになると思います。



乗算器、除算器がない場合は乗数、除数の前提条件により
組むべきアルゴリズムが変わります。

乗数、除数が不定値のときは加算、減算で行います。
(例 5×3だと5を0に3回足す)
乗数、除数が固定値のときはビットシフト+加算、減算で行います。
(例 5×3だと5を1回左シフトして5を足す)

以外とこうすれば効率がいいという方法はありません。
    • good
    • 0
この回答へのお礼

「意外とこうすれば効率がいいという方法はありません。」

そうなんですか。それを知れただけでとてもうれしいと思いました。
自分もそういうアルゴリズムだろうなとは思っていたんですが。
日々考えている方がいるのですかね。

お礼日時:2009/03/06 19:26

シフトと加算で行います。


例えば 10x5 を計算する時はまずそれぞれを2進数で表しておいて
A=1010 B= 0101 K = AxB として
最初に
K = 00000000 とする。
sterp1:
 Bの最下位が1なので K = K+A = 00001010 とする。
 Aを左シフトして A=10100
 Bを右シフトして B=010
step2:
 Bの最下位が0なので K はそのまま
 Aを左シフトして A=101000
 Bを右シフトして B=01
sterp3:
 Bの最下位が1なので K = K+A = 00110010 とする。
 Aを左シフトして A=1010000
 Bを右シフトして B=0
sterp4:
 Bの最下位が0なので K はそのまま
かける数が4ビットなのでこれで計算の終わり。
答えは16進で0x32、10進では50となります。
    • good
    • 0
この回答へのお礼

ありがとうございます。
うむ~、ちょっとイメージしづらかったですね。
でもほかとの回答がやや違うような気がするので興味を持ちました。
ありがとうございます。

お礼日時:2009/03/06 19:22

結局のところ、一番近い2のべき乗までシフトして、過不足を引いたり足したりするしか方法はありません。

小さい数どうしの乗算の場合は、下手に考えるよりもループで1つずつ足していった方が速い場合だってありえます。

桁数が大きくなると、一番近い2のべき乗からでもけっこう遠くなるので、その場合は同様にまた一番近い2のべき乗を…という考え方になります。100倍だと、64+32+4などですね。数によっては、わざとオーバーさせて引いたり、端数調整を途中で行って最後に一回シフトする方が速くなる場合もあり得るので、そこには工夫の余地がありますけど、逆を言えばそれくらいしかアルゴリズムらしきものが介在するところはないと思います。
    • good
    • 0
この回答へのお礼

自分もそれくらいしか思いつきませんでした。
桁数が大きくなるにつれて難しくなりそうですね。
回答ありがとうございました。

お礼日時:2009/03/06 19:28

大雑把に言うとだいたいこういう考え方



3a = a + a + a = 2a + a
    • good
    • 0
この回答へのお礼

回答ありがとうございました。

お礼日時:2009/03/06 19:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!