JAVA除2与右移

Posted rotk2015

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA除2与右移相关的知识,希望对你有一定的参考价值。

  1. 起因是二分查找取mid值时,是这么写的

    int mid = lef + (rig-mid)/2;
    
  2. 但还有兄弟抠细节,将 除2 换成 右移,因为位运算快。。。

    int mid = lef + ((rig-mid)>>1);
    
  3. 抛开效率不谈,除2 和 右移 一样吗?

  4. 笔者搜索了一番,得出结论:对于负奇数而言,如-3,除2得到 -1,而右移则得到 -2。除此之外,除2 和 右移 结果是一致的

  5. 原因:奇数除2会得到小数,赋给 int 类型时,只保留整数部分,因此,无论正数还是负数,除2是向零取整

    而对于右移,若是偶数,二进制表示时最低位是0,右移不会带来数值精度损失,所以正负数结果一致;而若是奇数右移一位会吃掉最低位的1,这个二进制的 1 按理应该给原数贡献 0.5,但因为是 int 类型,所以会被忽略掉,故二进制结果的绝对数量值会减小。而这带来的后果就是,向左取整(想像一个数轴)。对于正奇数向左即向零;而对于负奇数向零与向左是相反的方向

    这里说的绝对数量值并非绝对值,而是笔者为了便于说明,自己引入的一个概念。计算机使用补码存储数据,我们忽略掉补码最高的符号位,得到一个二进制数,将其数量值称作补码的绝对数量值,对于负数而言,绝对数量值的大小关系与数本身的大小关系是相对应的。举个例子,我们用 4bit 分别写出 -5 和 -3 的补码,得到 1011 和 1101。忽略掉最高符号位,其补码分别是 0011 和 0101。显然,0011 小于 0101,而对应地,-5 也小于 -3。

  6. 另:在数轴上,从左到右,数的数量值是递增的,但对于负数而言,其绝对值却是递减的。补码将这种递增的数量值关系,用二进制形式表示了出来。(原码对应的是绝对值关系)

以上是关于JAVA除2与右移的主要内容,如果未能解决你的问题,请参考以下文章

C语言位运算符:与或异或取反左移与右移详细介绍

C语言位运算符:与或异或取反左移与右移详细介绍

Java中的位运算

关于MATLAB中 左除与右初的区别

如何简化程序集平移右移 32 Xor 绝对数和值

看java源代码,发现Arrays.sort()方法里面求数组的中间索引使用的是length >> 1,这是啥原理?谢谢!