• ベストアンサー

コンピュータはなぜ減算ができないのか?

たとえば コンピュータでは2-1を補数を利用して計算します。 しかし、繰り下がりの概念があれば以下のように 直接計算できるはずです。    0010 -) 0001 -----   0001 元々コンピュータには、繰り下がりに対応する演算回路が ないので、引き算が足し算のように簡潔にできない と思ってよいのでしょうか? また、掛け算は足し算のループを利用して計算しているのでしょうか? 割り算は、2の補数(ビット反転+1)の引き算をループさせて実現しているのでしょうか? ということは、計算のうち割り算が一番時間がかかると思ってよいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • hisappy
  • ベストアンサー率46% (184/392)
回答No.5

こんにちは。 「引き算が足し算のように簡潔にできない」と思ってよいのでしょうか? と聞かれたなら、「思ってよい」で正解です。 補数表現を使うことで、人間側で言う「加減算」を コンピュータ側は全て「加算」で計算できます。 オーバーフローやアンダーフローは除きますが・・・ また、「乗除算」はイメージとしては「ループで実現している」であっていると思います。 回路の作り方にもよるのでしょうが、 掛け算の回路に対して、割り算の回路はおよそ3倍の素子が必要となるらしいとか。 それによって…、処理時間は2倍程度に抑えられているとか。 システム屋さんの世界(いわゆるディープなプログラマ)や、 特に組み込み回路のプログラム設計では 可能ならば割り算を一切使わない、使うとしても処理を独立させたりなどのために プログラム最適化のための労力の半分を注ぎ込むほどのイメージだとか。 (注意:あくまでも私の偏見的イメージです。) 今時のプログラミングではコンパイラが大半の面倒をみてくれますが、 本当にカリカリチューンなシステムを作りたいなら どの回路(処理)が、どのくらいの時間をしようするかを把握していた方がわいらしいです。 その最初の一歩が「割り算の回路は処理に時間がかかる」らしいです。 ----- 現在の技術なら、減算器を組み込んだプロセッサも実用的かもしれませんが、 一般向けに導入されるだけの価値が、まだ見付かっていないようです。。。

その他の回答 (4)

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

直接引き算を行う回路 (減算器) 自体は存在します. ただ, ほかの回答者も言われているように「効率」を考えると, 減算器を実装するよりも加算器を使って 2の補数で引き算をした方が有利である, と.

  • utun01
  • ベストアンサー率40% (110/270)
回答No.3

単純に効率の問題だったはずです。 引き算の場合、補数で計算する回路と繰り下がりを実現した回路で、必要クロック数を比較してみて下さい。 補数計算の方が、性能が高いことが分かると思います。

  • MOMON12345
  • ベストアンサー率32% (1125/3490)
回答No.2

引き算をどう実現するかは機械の勝手で、演算式をどう見るかは人間の勝手です。 機械は機械としてもっとも効率の良い方法で演算を実行するだけです。 繰り上がりのキャリーに対して繰り下がりはボローですね。 概念としてはありますよ。 割り算はソフトウエアで処理しようとすると時間がかかります。 最近ではハードウエア割り算器(回路)などが入っていますので1クロックで処理出来たり、浮動小数点演算なども専用回路に任せる傾向ですね。 かけ算はかなり以前からハードウエア演算器やマイクロコードで書かれたものが使われています。 かけ算も割り算も単純なループで行うと時間がかかります。 プロセッサの能力や命令形によっても異なりますが、一般的にはシフトと加減算を組み合わせて実現します。 メモリ使用量は増えますがテーブル演算方式なんてのもあります。

  • TinyPine
  • ベストアンサー率30% (719/2386)
回答No.1

コンピューターの演算装置の元は半加算器で、これを2つ繋げて全加算器を構成していますが、これが加算しか出来ないので、引き算は2の補数を使っています。 http://wpedia.goo.ne.jp/wiki/%E5%8A%A0%E7%AE%97%E5%99%A8/?from=websearch 割り算は多分一番時間がかかると思います。 2の倍数の掛け算でMSB側に1ビットシフト、割り算ではLSB側に1ビットシフトを使っているプログラムがありました。 2の倍数であるかどうかは一番下の桁を参照すればわかりますよね。

関連するQ&A