• 締切済み

マイクロコンピュータ 乗算演算について

マイクロコンピュータで、8ビット演算回路の乗算演算を行ったのですが、その際、乗数の0、1パターンに応じて被乗数を左シフトさせ加算していくロジックで演算をするというアルゴリズムを組み立てて実行しました。 乗算演算をより高速化させるには、この他にどのような手段が考えられるのか教えていただけないでしょうか? お願いいたします。

みんなの回答

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

ソフトウェアでやるんだと, ほとんどどうしようもないですね. ハードウェアでやるんだったら.... やりそうなのは部分積 (64個) を全部 AND ゲートで作っておいてあとは Carry Save Adder で Wallace木組むかなぁ? Z80 でメモリから読み込む, というのであれば IO空間に置いておいて IN (C), A が常套手段? 1回の読み込みでは 16ビット取り出せないので 2回に分けて読み込んで ADD HL, DE を駆使するということで.

回答No.3

#1,2の回答の通り、乗数と被乗数でアドレスを生成して、そのアドレスから16ビットのデータ(積)を読み込めば、非常に高速です。8ビットマイコンの話しで言えば、メモリの読み出しと等価な速度になります。ただし、256*256*2バイトのアドレスが必要になるので、レトロなZ80では実現しにくいでしょう。 もうひとつは、質問者さんの案を、全てワイヤードロジックで組むことです。 必要なロジックは、 1. シフトレジスタ 桁取りのためのシフト 2. データセレクタ 乗数のパターンで被乗数か0を出力 3. 16ビット加算器 データセレクタから出力されたデータを「一気に」加算する。 でしょうか。実際には8+2ビットの加算器が8個必要になります。 結果は、クロック無しのデータフローで出力されます。 同様に、除算回路も作成可能です。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

ハードウェアでやるのかソフトウェアでやるのかでも変わってきますけど、どっちかな。 8ビットだとテーブルを用意してしまって参照することも可能だね。8ビット×8ビットで64Kエントリを用意する必要があるけど。 あとは、nビット乗算はn/2ビット乗算を3回と加減算で計算できるので、これを使って再帰的に1ビットまで展開する手法もある。ただ8ビットくらいだとかえって遅くなるかもしれない。

  • DIGAMMA
  • ベストアンサー率44% (620/1404)
回答No.1

こんにちは、  「九九の表」を暗記してれば、掛け算は早いですよね。コンピュータの世界は2進法ですから「二二の表」と言うことになります。  さて、人間が「九九の表」ではなく「0から99」あるいは「0から999」までの掛け算の表を暗記していたら、計算が素早くなるのと同様にコンピュータも「二二の表」ではなく、「256*256」の表をROMとかに記憶しておけば、理論上、8倍早くなります。  ハードウエアで実現するなら、ありとあらゆる掛け算の結果を、予めメモリに書き込んでおくという方法をとれば、(あたりまえですが)瞬時に回答が求まります。  ハードウエアを変えずに、ソフトのみで対処したいのならば、0から255までの掛け算の結果を、256掛ける256(=65536)の配列に予め定数値としてセットしたあと、1ビットづつ左シフトするのではなく、8ビットづつ左シフトするプログラムをくんでみてください。すごく早くなりますヨ。  具体的なソースコードは自分で考えてね。  ご参考まで。勉学がんばってください。

関連するQ&A

  • 【C言語】シフト演算による乗算

    正の整数を二つ読み込み、乗算をシフト演算によって行いたいです。 プログラムを作ったのですが、動きません・・・。強制終了されます。 (例)53×25=53×(2^4+2^3+2^0)  =(53を左に4ビットシフト)+(53を左に3ビットシフト)+(53を左に0ビットシフト) http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/4803.txt どこが悪いのでしょうか・・・。

  • 演算回路の能力について

    年々パソコン等の性能は向上していっていると思いますが その中で使われている加算器や乗算器などの演算回路は、現在はどのくらいの能力(演算速度・遅延時間)があるのでしょうか?64ビットの加算とかでも演算時間はピコセカンド単位になっているのですか?? お願いします。

  • 加算回路・乗算回路・除算回路について教えてください<(_ _)>

    四則演算回路実習装置(加算回路・乗算回路・除算回路)について質問です。 1.加算回路において、「A」加算器入力とADD加算器出力の結線は何のために行うのでしょうか? 2.乗算回路において、Mレジスタ入力とADD加算器入力の結線は何のために行うのでしょうか? 3.除算回路において、「A」累算器入力とMレジスタ出力の結線は何のために行うのでしょうか? この3つがわかりません((+_+)) 詳しい方がいましたら回答よろしくお願いいたします<m(__)m>

  • 乗算回路の問題

    加算回路を2つと、いくつかの論理ゲートを用いて 4bit(a2,a2,a1,a0)*3bit(b2,b1,b0)の乗算回路(出力7bit=c6,c5,c4,c3,c2,c2,c0) を設計せよ という問題です。 正直良く分かりませんが、4bitの加算回路と3bitの加算回路をANDゲートでつなげばいいのですか。 なんか全然あってないような気がします。 分かる方がいらっしゃいましたら、ご教授お願いします!

  • ビット演算で00000001と1の頭に0を付ける?

    https://www.grapecity.com/japan/powernews/column/clang/019/page02.htm ビット演算子 表1にCのビット演算子を掲げておきます。ビット演算とは言っても、扱う値はバイト単位などCの一般的な整数のデータ型です。ビット演算子は、それらの値をビット単位で計算します。 ビットシフト演算(<< >>)~2倍と1/2 例えばunsigned char型の1は、2進数では"00000001"という形のビット列(ビットパターン)になります。これを1桁左にずらす(シフトする)と"00000010"となります。ずらしてあふれた左端の0は消え、空いた右端には0が入ります。 "00000001"は10進数の「1」、"00000010"は10進数の「2」です。つまり、ビット列を左に1桁シフトすると値は2倍になるのです。 -----------------------------------------  以上ですが、C言語の、ビット演算の解説の抜粋です。ビット演算はまだ覚えたてですが、"00000001"整数1の頭にわざわざ、0を沢山 つける目的は何なのでしょうか!?  よろしくお願いします。

  • さまざまな加算器と減算器と乗算器について

    最近、論理回路の実験の授業で加算器・減算器・乗算器に取り組みました。 加算器については、半加算器と全加算器の機能や作り方がわかりますが、 Q1.なぜ二つの半加算器で全加算器が作られるのか、その理由が少し推測をしましたが、やはりはっきりとわかりません。 あと、何bitやら何bitやらの並列全加算器についてもよくわかりません。これは本間にレジュメを読みながらしないと、なかなか回路が作れません。 Q2.bitって何ですか?加算器の個数を示しているのか、それとも出力とか入力とかの個数を示していますか。 それから、減算器も全然原理がわかりません。 Q3.結果が1の補数か2の補数かはどのように決められていますか? 文がちょっと長くて失礼ですが教えていただければ感謝いたします!

  • 剰余演算を論理演算と加減算に置き換える方法

    剰余(割算の余り)を求める演算を論理演算と加減算とビットシフトのみで行う方法がありましたら教えてください。 言語はC/C++ではなくても大丈夫です(ロジックだけでも)。

  • [2進数 シフト演算 除算について]

    [2進数 シフト演算 除算について] シフト演算について勉強中です。ご協力お願い出来たら幸いです。 乗算について例えば『1010』(符号ビットを考えず)を2倍 4倍 8倍(2のn乗)した場合 ビットを2倍であれば1つ、4倍であれば2つ・・・左に シフトすれば良いというのは理解しました。 また3倍 5倍などのケースも、 3倍であれば1ケタ左にシフトした数+1010で求まる事も理解しました。 問題は除算です。他の質問を探ってみたのですが、考え方は一緒という回答で・・・詰まっています 除算は右シフトとの事ですが 先ほどの例である『1010』(10)ですがこれを1/2、つまり2で割ると 1つ右にシフトし1010→0101 となり 1010を1/4する場合右に2ビットシフトし 1010→0010.10 となり理解は出来ます。 しかし1/3 、1/5といった場合の計算の仕方が分かりません。 余りを出さないという考えで(近似値になると思いますが) 解き方をご教授願えたらと思います。

  • コンピュータアーキテクチャについて

    それぞれ2の補数表現による2進整数1001(被乗数)と0101(乗数)の乗算をしなさい.解答欄に計算結果を8ビット半角で解答すること.の答えを教えてください。お願いします。

  • Excelでビット演算子?

    Excelでビット演算子の 左シフト演算をさせることは でるでしょうか? 0xff<<8 の演算をさせたいのですが 何か関数はあるでしょうか?