Java 要除以2,右移运算符和传统除法运算符哪个更好?

Java 要除以2,右移运算符和传统除法运算符哪个更好?,java,bitwise-operators,Java,Bitwise Operators,在读取集合.reverse的Java源代码时,右移运算符用于查找中间值。 ...... for (int i=0, mid=size>>1, j=size-1; i<mid; i++, j--) // Right Shift swap(list, i, j); ..... 。。。。。。 对于(inti=0,mid=size>>1,j=size-1;i除非迫切需要速度,否则最好使用可读性更强的选项 使用清晰、明显的划分,

在读取
集合.reverse的Java源代码时,
右移运算符用于查找中间值。

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

对于(inti=0,mid=size>>1,j=size-1;i除非迫切需要速度,否则最好使用可读性更强的选项


使用清晰、明显的划分,然后如果您发现自己以后需要优化,您可以切换到正确的班次并清楚地进行评论。

除非迫切需要速度,否则最好使用更具可读性的选项


使用清晰、明显的划分,然后如果您发现自己以后需要优化,您可以切换到正确的移位并清楚地进行注释。

在实践中,这并不重要,但划分会使意图更清晰,我只能想象人们会出于“性能原因”尝试位移位.但现在是2014年,您不能手工编写x86汇编,因此尝试像这样优化代码是浪费时间。

实际上这并不重要,但划分会使意图更清晰,我只能想象人们会出于“性能原因”而尝试位移.但现在是2014年,您不能手工编写x86汇编,因此尝试这样优化代码是浪费时间。

右移运算符比除法运算符快。 正如您所知,所有数据都是以二进制格式存储和处理的。右移直接作用于二进制格式,因此是快速和最佳的。除法作用于整数,因此是缓慢和非最佳的。 但是,由于处理器的速度现在相当好,而且使用哪种操作符也没有什么区别,所以选择权就在你自己。
如果您认为您的应用程序已经占用了太多的处理器速度,并且确实需要减少负载,则可以使用右移。对于重量较轻的应用程序,除法运算符是合适的。

右移运算符比除法运算符快。 正如您所知,所有数据都是以二进制格式存储和处理的。右移直接作用于二进制格式,因此是快速和最佳的。除法作用于整数,因此是缓慢和非最佳的。 但是,由于处理器的速度现在相当好,而且使用哪种操作符也没有什么区别,所以选择权就在你自己。
如果您认为您的应用程序已经占用了太多的处理器速度,并且确实需要减少负载,则可以使用右移。对于重量较轻的应用程序,除法运算符是合适的。

有符号的除法2和右移1并不完全相等。即使是负数,也可以将两轮除法归零。对吗向下移动1轮,表示
-1>-1
-1
(而
-1/2
为零)

具体地说,这意味着如果JIT编译器不能(或没有)证明一个数字不能是负数(如果你已经发布了完整的代码,我可能已经能够检查),那么它必须做一件比右移更复杂的事情——类似这样的事情:(根据GCC输出的内容,将eax除以2和clobbers
edi

如果你使用了右移1,它会是这样的

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

另外,在这种情况下,我觉得这种可读性有点愚蠢。如果有人真的不知道
大小>>1
是什么,那就是他们的问题——它只是一个基本的运算符,甚至不是一些复杂的运算符组合,如果你看不懂,那么你就不懂Java


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

符号除2和右移1并不完全相等。向零方向除2轮,即使是负数也是如此。向下右移1轮,这意味着
-1>>1
-1
(而
-1/2
是零)

具体地说,这意味着如果JIT编译器不能(或没有)证明一个数字不能是负数(如果你已经发布了完整的代码,我可能已经能够检查),那么它必须做一件比右移更复杂的事情——类似这样的事情:(根据GCC输出的内容,将eax除以2和clobbers
edi

如果你使用了右移1,它会是这样的

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

另外,在这种情况下,我觉得这种可读性有点傻。如果有人真的不知道
大小>>1
是什么,那就是他们的问题——这只是一个基本运算符,而不是ev