Pra*_*eek 1 java bitwise-operators
在阅读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);
.....
Run Code Online (Sandbox Code Playgroud)
使用传统的除以 2 方法也可以完成同样的任务。
我探索了堆栈右移来执行除法,发现最好使用除法运算符而不是右移。
更新: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 编译器不能(或没有)证明一个数字不能为负数(如果您发布了完整的代码,我可能能够检查这一点),它必须做更多的事情比仅仅右移更复杂 - 像这样:(除以eax2 和 clobbers edi,基于 GCC 输出)
mov edi, eax
shr eax, 31
add eax, edi
sar eax, 1
Run Code Online (Sandbox Code Playgroud)
如果你使用了右移 1,它就会像这样
sar eax, 1
Run Code Online (Sandbox Code Playgroud)
差别不大,但就是有差别,所以“没有什么差别”——人群现在可以回家了。好吧,它只是在循环初始化上,所以它不会对性能产生严重影响,但我们不要忘记这是库代码 - 应用不同的准则。具体来说,不太强调可读性,而是更强调“除非绝对必要,否则不要浪费性能”的准则。在这种情况下,没有充分的理由写在那里,只会让性能变得更糟。没有什么好处。size / 2
另外,我发现在这种情况下这种可读性有点愚蠢。如果有人真的不知道它的size >> 1作用,那就是他们的问题——它只是基本运算符之一,甚至不是一些复杂的运算符组合,如果你看不懂它,那么你就不了解 Java。
但请随意在您自己的代码中使用size / 2。这个答案的要点不应该是“除以 2 不好”,而应该是“库代码不应该为了可读性而牺牲性能”。
| 归档时间: |
|
| 查看次数: |
3252 次 |
| 最近记录: |