使用 >> 运算符优于 / 运算符的优势是什么?它在我维护的代码中被广泛使用。例如,
int width = previousWidth >> 2;
问问题
163 次
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,则代码应该*绝对反映width
:previousWidth
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 回答