1. ホーム
  2. c++

[解決済み】C言語でシフト演算子を使った掛け算・割り算は実は速い?

2022-03-29 04:04:49

質問

乗算と除算は、ビット演算子を使って実現することができます。

i*2 = i<<1
i*3 = (i<<1) + i;
i*10 = (i<<3) + (i<<1)

といった具合です。

を使用した方が速いのでしょうか? (i<<3)+(i<<1) を使うよりも、10を掛けるために i*10 を直接使うのですか?この方法で掛け算や割り算ができない入力の種類はあるのでしょうか?

どのように解決するのですか?

簡単な答えです。 ありえません。

長い答え コンパイラは、ターゲットとなるプロセッサ・アーキテクチャが可能な限り高速に乗算を行う方法を知っているオプティマイザを備えています。 あなたの最善の策は、コンパイラにあなたの意図を明確に伝え(例えば、i << 1ではなくi*2)、最速のアセンブリ/マシンコード・シーケンスが何であるかを決定させることです。 プロセッサ自身が乗算命令をシフトと加算のシーケンスとしてマイクロコードに実装している可能性さえあります。

結論から言うと、このことを気にすることに時間をかける必要はありません。 シフトするのであれば、シフトすればいい。 乗算するのであれば、乗算してください。 意味的に最も明確なことをすれば、同僚は後であなたに感謝するだろう。 あるいは、そうしなければ、後であなたを罵るかもしれない。