为啥在 Java 中用 (low+high)\u003e\u003e\u003e1 代替 (low+high)/2 或 (low+high)\u003e\u003e1 来计算平均值呢好在哪里
同意@王宇 的说法。我再补充一些更详细的说明。如果不考虑编译器优化的话,\u0026gt;\u0026gt;和\u0026gt;\u0026gt;\u0026gt;比除法的/的运行效率高。至于\u0026gt;\u0026gt;\u0026gt;和\u0026gt;\u0026gt;的区别,则在于有符号和无符号。比如-2\u0026gt;\u0026gt;\u0026gt;1的结果是2147483647,而-2\u0026gt;\u0026gt;1的结果是-1。(其中2147483647是-2的补码右移一位后,左边补0的结果。) 这里计算平均值使用\u0026gt;\u0026gt;\u0026gt;取代\u0026gt;\u0026gt;,恐怕是因为可能出现很大的数字,这些数字单独用不会超过Integer.MAX_VALUE,但求和之后可能超过,这时如果使用\u0026gt;\u0026gt;或者/来计算,会因为溢出而算出负数结果。 用下面的程序可以说明问题:Test.javapublic class Test { public static void main(String args) { int low = Integer.MAX_VALUE; int high = Integer.MAX_VALUE; System.out.println(low); // 先看一眼数字 int as = (low + high) \u0026gt;\u0026gt; 1; int au = (low + high) \u0026gt;\u0026gt;\u0026gt; 1; System.out.println(as); // 使用 \u0026gt;\u0026gt; 计算的平均值,与/相同。 System.out.println(au); // 使用 \u0026gt;\u0026gt;\u0026gt; 计算的平均值。 }} 运行结果为:2147483647-12147483647至此,应该明白了吧?不过,如果有大数的可能性,更建议使用大数计算的类来进行计算。
■网友
\u0026gt;\u0026gt;\u0026gt;与\u0026gt;\u0026gt;是位运算符,只对整型有效(不能用于浮点型)。当是整型的时候(low+high)\u0026gt;\u0026gt;1可以代替(low+high)/2。\u0026gt;\u0026gt;\u0026gt;是无符号右移运算符。如果 low+high是正整数,这三种运算是等价的。 由于有编译器优化,他们的效率应该是相同的(如果不存在编译器优化,移位运算更快)。 用\u0026gt;\u0026gt;\u0026gt;一般是有特殊的目的。
■网友
使用(low + high) \u0026gt;\u0026gt;\u0026gt; 1求平均值仅适用于结果保证不是负数的情况,但好处是即使两个数的和int溢出也能求出正确的结果,例如java.util.Arrays.binarySearch:int low = fromIndex;int high = toIndex - 1;while (low \u0026lt;= high) { int mid = (low + high) \u0026gt;\u0026gt;\u0026gt; 1; int midVal = a; if (midVal \u0026lt; key) low = mid + 1; else if (midVal \u0026gt; key) high = mid - 1; else return mid; // key found}return -(low + 1); // key not found.这里用(low + high) \u0026gt;\u0026gt;\u0026gt; 1代替(low + high) /2是非常正确的,首先是因为数组下标肯定不会是负数,另一方面如果low + high大于int最大值时,只有\u0026gt;\u0026gt;\u0026gt;1能保证结果正确。我简单的测了一下运算时间,(low + high) \u0026gt;\u0026gt;\u0026gt; 1 基本等于 (low + high) \u0026gt;\u0026gt; 1 小于(low + high) /2编译器没有做优化的原因,是因为在low+high为负数的时候,三者不等价,例如:-5 / 2 = -2-5 \u0026gt;\u0026gt; 1 = -3-5 \u0026gt;\u0026gt;\u0026gt; 1 = 2147483645
推荐阅读
- 『黄金时间』请认准这个蓝色的标志! 黄金时间丨同行业中用水最少的企业
- 为啥看到书柜上的藏书会有心旷神怡的感觉
- 为啥知乎上普便有一种【我在北上广深打工,所以拥有更好的视野】这样的错觉
- 为啥工商银行的用户体验如此之差
- 汽车|看了中消协4S店服务测评调查结果,终于知道法系车为啥卖不好了
- 你为啥从窝窝商城离职?
- 为啥5G和2.4G默认的BSSID是相同的
- 为啥电器实体店的价格比淘宝贵那么多
- 现在在线学习视频有很多了,为啥大部分人还是喜欢下载下来观看
- dart这编程语言现在发展怎么样了,语法与Java,c#很相似,甚至更简洁
