我应该在Java中按位移2除以?

时间:2010-11-01 20:15:47

标签: java performance bit-manipulation division bit-shift

  

可能重复:
  Is shifting bits faster than multiplying and dividing in Java? .NET?
  Quick Java Optimization Question

许多年前,在大学里,我学会了正确地按位移动实现与除以2相同的操作,但通常要快得多。自从9-10年前我了解到这一点以来,我不确定Java在这方面是如何出现的。 Java编译器是否自动将二分频转换为位移操作,还是应该自己在代码中手动执行位移操作?

4 个答案:

答案 0 :(得分:59)

除非你在一个商店和代码库中工作,其中比特移位是常见的,恕我直言,你冒着混淆的风险。是的,表达式可能在逻辑上等同,但是:

  • n00b可能会被替代语法
  • 弄糊涂
  • 一个自从大学以来没有做过任何改变的老人,就像我一样,可能会感到困惑
  • 如果你有点转变并觉得有必要评论你刚刚做了什么,那么你肯定是关闭的。简单的划分是自我记录,任何熟悉基本数学的人都会清楚。
  • 你不会超越一个编译器来优化那些简单的事情,所以不要再费力了
  • 作为良好的编码实践,最好让你的代码简单/香草而不是聪明(呃)

所有这些都是相对的,而且,真的取决于您的商店标准。如果你的同事喜欢按位移动,那么无论如何都要按顺序转移。

答案 1 :(得分:19)

现代编译器非常聪明,能够为两个部门生成最快的代码。如果速度更快,他们会做出改变。如果你想要实现的是除以2,使用除法将使你的代码更清晰。当要分割的数字是负数时,你将避免出现问题。

答案 2 :(得分:15)

是的,这是任何尝试进行编译器优化的人都会做的第一件事(并且已经完成了至少50年),它肯定是由Java JIT编译器完成的,你可能有一个非常好的很难找到任何不这样做的编译器。

即使他们没有,但仍然应该避免过早的微优化,以使代码更清晰。

答案 3 :(得分:11)

CPU的分区例程将处理此问题。你没有必要这样做。

这称为过早优化