JAVA除2与右移
Posted rotk2015
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA除2与右移相关的知识,希望对你有一定的参考价值。
-
起因是二分查找取mid值时,是这么写的
int mid = lef + (rig-mid)/2;
-
但还有兄弟抠细节,将 除2 换成 右移,因为位运算快。。。
int mid = lef + ((rig-mid)>>1);
-
抛开效率不谈,除2 和 右移 一样吗?
-
笔者搜索了一番,得出结论:对于负奇数而言,如-3,除2得到 -1,而右移则得到 -2。除此之外,除2 和 右移 结果是一致的。
-
原因:奇数除2会得到小数,赋给 int 类型时,只保留整数部分,因此,无论正数还是负数,除2是向零取整。
而对于右移,若是偶数,二进制表示时最低位是0,右移不会带来数值精度损失,所以正负数结果一致;而若是奇数,右移一位会吃掉最低位的1,这个二进制的 1 按理应该给原数贡献 0.5,但因为是 int 类型,所以会被忽略掉,故二进制结果的绝对数量值会减小。而这带来的后果就是,向左取整(想像一个数轴)。对于正奇数,向左即向零;而对于负奇数,向零与向左是相反的方向。
这里说的绝对数量值并非绝对值,而是笔者为了便于说明,自己引入的一个概念。计算机使用补码存储数据,我们忽略掉补码最高的符号位,得到一个二进制数,将其数量值称作补码的绝对数量值,对于负数而言,绝对数量值的大小关系与数本身的大小关系是相对应的。举个例子,我们用 4bit 分别写出 -5 和 -3 的补码,得到 1011 和 1101。忽略掉最高符号位,其补码分别是 0011 和 0101。显然,0011 小于 0101,而对应地,-5 也小于 -3。
-
另:在数轴上,从左到右,数的数量值是递增的,但对于负数而言,其绝对值却是递减的。补码将这种递增的数量值关系,用二进制形式表示了出来。(原码对应的是绝对值关系)
以上是关于JAVA除2与右移的主要内容,如果未能解决你的问题,请参考以下文章
看java源代码,发现Arrays.sort()方法里面求数组的中间索引使用的是length >> 1,这是啥原理?谢谢!