gpt4 book ai didi

java - 除以 2 右移运算符和传统除法运算符哪个更好?

转载 作者:行者123 更新时间:2023-12-01 18:32:29 28 4
gpt4 key购买 nike

在阅读 Collections.reverse 的 Java 源代码时方法,Right Shift operator is used for finding middle.

......
for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--) // Right Shift
swap(list, i, j);
.....

使用传统的除以 2 方法也可以实现同样的效果。

我在堆栈上探索了Right Shift to perform division发现最好使用除法运算符而不是右移。

更新:But then why java guys used Right Shift and not division ?

<强> So which approach is better to use and Why ?

最佳答案

有符号除以 2 和右移 1 并不完全等效。除以 2 舍入到零,即使对于负数也是如此。向下右移 1 舍入,这意味着 -1 >> 1-1(而 -1/2 为零)。

具体来说,这意味着如果 JIT 编译器无法(或没有)证明数字不能为负数(如果您发布了完整的代码,我可能能够检查这一点),那么它必须这样做比仅仅右移更复杂的东西 - 像这样:(根据 GCC 输出将 eax 除以 2 并破坏 edi)

mov edi, eax
shr eax, 31
add eax, edi
sar eax, 1

如果你使用了右移 1,它就会像这样

sar eax, 1

这不是一个差异,但它一个差异,所以“没有任何区别”的人群现在可以回家了。好吧,它只是在循环初始化上,所以它不会对性能产生严重影响,但我们不要忘记这是库代码 - 应用不同的准则。具体来说,不太强调可读性,而是更强调“除非绝对必要,否则不要浪费性能”的准则。在这种情况下,没有充分的理由在那里写 size/2 ,这样做只会让性能稍微差一点。没有什么好处。

此外,我发现在这种情况下这种可读性有点愚蠢。如果有人真的不知道 size >> 1 的作用,那就是他们的问题 - 它只是基本运算符之一,甚至不是一些复杂的运算符组合,如果你看不懂,那么你就不懂 Java。

但请随意在您自己的代码中使用size/2。这个答案的要点不应该是“除以 2 不好”,而应该是“库代码不应该为了可读性而牺牲性能”。

关于java - 除以 2 右移运算符和传统除法运算符哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23534087/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com