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

可能的重复项:
在 Java 中移位是否比乘法和除法更快?.NET?
快速 Java 优化问题

许多年前,在大学里,我了解到右移位一与除以二完成相同的事情,但通常要快得多。我不确定Java在这方面是如何出现的,因为9-10年前我了解到这一点。Java 编译器是自动将二除法转换为位移操作,还是应该自己在代码中手动执行位移操作?


答案 1

除非你在一家商店和一个代码库中工作,在那里位移位是很常见的,那么,恕我直言,你有混淆的风险。是的,这些表达式在逻辑上可能是等效的,但是:

  • n00b 可能会被替代语法混淆
  • 一个自大学以来就不必做任何小转变的老家伙,就像我一样,可能会感到困惑
  • 如果你有点转变,觉得有必要评论你刚刚做了什么,那么你肯定不对劲。简单的除法是自我记录的,任何熟悉初级数学的人都会很清楚
  • 你不会在这么简单的事情上比编译器聪明地优化,所以不要费心尝试
  • 作为良好的编码实践,最好使代码简单/普通而不是聪明(er)

所有这些都是相对的,同样,实际上取决于您商店的标准。如果你的同事喜欢位移,那么一定要去位移位。


答案 2

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

即使他们没有这样做,这仍然是一个过早的微优化,应该避免,而让代码更清晰。


推荐