web-dev-qa-db-ja.com

Javaで2で除算するためにビットシフトする必要がありますか?

可能な重複:
Javaでの乗算と除算よりもビットのシフトは高速ですか?.NET?
クイックJava最適化の質問

何年も前に大学で、1ビット右シフトすることで2で除算するのと同じことを実現できることを学びましたが、通常はかなり高速です。 Javaが9-10年前に私がそれについて学んで以来、その点でどのようにやってきたのかわかりません。Javaコンパイラは自動的に2で除算してビットシフト演算を実行するか、手動でコード内のビットシフト演算を手動で実行する必要がありますか?

29
Matt Huggins

あなたがビットシフトが一般的であるショップとコードベースで働いていない限り、私見では、難読化のリスクがあります。はい、式は論理的に同等ですが、

  • N00bは別の構文で混乱するかもしれません
  • 私のように大学以来ビットシフトをする必要がなかった老人は混乱するかもしれません
  • あなたが少しシフトして、あなたが今したことについてコメントする必要性を感じたら、あなたは間違いなくオフです。単純な除算は自己文書化されており、初等数学に精通している人なら誰でも明白です
  • 単純なものを最適化するためにコンパイラーよりも優れているわけではないので、気にしないでください。
  • 優れたコーディングプラクティスとして、コードを賢くするよりもシンプル/バニラにする方が良いです。

これはすべて相対的であり、繰り返しになりますが、実際にはショップの基準によって異なります。同僚がビットシフトを愛するなら、ぜひともビットシフトしてください。

59
Paul Sasik

最新のコンパイラーは、2での除算のための最速のコードを生成するのに十分なほど賢いです。それが速い場合、彼らはシフトを行います。達成したいものが2による除算である場合、除算を使用するとコードがより明確になります。そして、分割する数が負の場合、問題を回避します。

19
Rémi

はい、これはコンパイラの最適化を試みる誰もが行う最初のことであり(少なくとも50年間行われています)、おそらくJava JITコンパイラ、そしておそらく、それを実行しないコンパイラを見つけるのは非常に困難です。

そして、そうしなかったとしても、コードをより明確にするために避けるべきである時期尚早のマイクロ最適化です。

15

CPUの除算ルーチンがこれを処理します。あなたがそれをする必要はありません。

これは時期尚早の最適化として知られています。

11
Malfist