2

使用 >> 运算符优于 / 运算符的优势是什么?它在我维护的代码中被广泛使用。例如, int width = previousWidth >> 2;

4

4 回答 4

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);

这显然是移动了不同的位数。你真的想用除法来表达吗?

当然,当你真正想要的是除法时,为了便于阅读,你应该使用除法运算符。有些人可能会为了性能而使用位移,但与以往一样,对于大多数代码来说,可读性比微优化更重要。因此,在您的情况下,如果实际需要除以 4,则代码​​应该*绝对反映widthpreviousWidth

int width = previousWidth / 4;

在证明性能差异显着之后,我只会使用位移位。

于 2013-02-13T08:19:05.827 回答
0

它们是不同的操作:

  • >> 2将位模式向右移动两位(本质上是将整数除以 2^2 = 4)。
  • / 2将数字除以 2(可以实现为>> 1)。

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

如果您的意思是“除以二”,请输入“/2”。阅读您的代码的人(包括您,一段时间后)会感谢您没有掩盖其含义。

于 2013-02-13T08:17:13.570 回答
0

很可能什么都没有。将除法转换为位移将是 JVM 优化。

如果它是对位掩码进行的,那么很好,但是如果在上述情况下,这似乎是一种编写数学运算的尴尬方式,那么考虑将其作为维护的一部分进行更改(或者只是接受它作为一个坏主意但离开单独)。

于 2013-02-13T08:18:10.720 回答
0

正如其他人已经说过的那样,我建议您始终偏爱更具可读性的选项而不是优化,除非您

  • 绝对需要优化
  • 知道它的工作原理
    • 了解你的编译器
    • 了解你的 JVM
    • 实施绩效衡量
    • 考虑对这些测量值的统计评估(极值、方差、第一次与后来的测量值,...)
于 2013-02-13T08:35:24.323 回答