2013-02-13 114 views
2

使用>>运营商超过/运营商的优势是什么?它在我所维护的代码中被广泛使用。 对于例如 int width = previousWidth >> 2;>>运营商超过/运营商的优势

+3

除非另有说明,否则认为是优化。但也见http://stackoverflow.com/questions/1168451/is-shifting-bits-faster-than-multiplying-and-dividing-in-java-net – 2013-02-13 08:20:20

+0

一个世纪以前的时间,这真的做了一个区别。今天,这可能意味着编写这段代码的人要么是编程老手,要么从旧书中学习,要么试图混淆你...... ;-) – Axel 2013-02-13 08:44:26

回答

7

当您想要将某个值移位一定数量的位时,理解起来会相当简单。例如:

byte[] bits = new byte[4]; 
bits[0] = (byte) (value >> 24); 
bits[1] = (byte) (value >> 16); 
bits[2] = (byte) (value >> 8); 
bits[3] = (byte) (value >> 0); 

这显然是由不同数量的位移位。你会真的想要在分裂方面表示呢?

现在当然,当你真正想要的是除法时,为了可读性的缘故,你应该使用除法运算符。有些人为了性能可能会使用偏移,但是一如既往,对于大多数代码而言,可读性比微优化更重要。所以你的情况,如果有什么实际上期望的是widthpreviousWidth除以4,代码应该*绝对反映:

int width = previousWidth/4; 

我只用bitshifting这个证明的性能差异后意义重大。

0

它们是不同的操作:

  • >> 2移位的位模式的两个位到右侧(基本上分割的整数由2^2 = 4)。
  • / 2将数字除以2(可以实现为>> 1)。

请注意,使用>> 1将其他数字类型除以2可能会给出意想不到的结果。

如果您的意思是“除以二”,请键入“/ 2”。阅读你的代码的人(包括你,在一段时间之后)会感谢你没有模糊意思。

+1

我敢打赌,他的意思是'1'。 – 2013-02-13 08:19:49

+0

@ Eng.Fouad:我敢打赌他的意思是'/ 2';) – Johnsyweb 2013-02-13 08:24:15

+0

你是对的!我添加了这个代码片段,仅仅为 – Abichellam 2013-02-13 08:31:46

0

最有可能什么也没有。这将是一个JVM优化,将一个分区转变为bitshift。

如果它正在做一个位掩码,那么很好,但是如果在上面的情况下,它似乎是写一个数学运算的一种尴尬的方式,然后考虑将它作为维护的一部分进行更改(或者只是将它接受为不好的主意,但保持独立)。

+0

nup ..这不会发生!..为自己测试它 – Anirudha 2013-02-13 08:33:40

0

正如其他人已经说过,我建议你总是青睐在优化更具可读性选项,除非你

  • 肯定需要最优化
  • 知道它的工作原理是
    • 知道你的编译器
    • 知道你的JVM
    • 把性能测量到位
    • 考虑统计评估这些测量(极值,方差,第一次和以后的测量,......)