/**
     * Returns the value obtained by reversing the order of the bits in the
     * two's complement binary representation of the specified <tt>int</tt>
     * value.
     *
     * @return the value obtained by reversing order of the bits in the
     *     specified <tt>int</tt> value.
     * @since 1.5
     */
    public static int reverse(int i) {
        // HD, Figure 7-1
i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;
i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;
i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;
i = (i << 24) | ((i & 0xff00) << 8) |
    ((i >>> 8) & 0xff00) | (i >>> 24);
return i;
    }jdk里面的分治法 
01010101
00110011
00001111
这就是 3 5 F 
能看明白吗?

解决方案 »

  1.   


    我没看明白。能否详细解释一下。
    谢谢比如0101这个 i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;
    这是交换2位的 拆解成 (i & 0x5) << 1 | (i >>> 1) & 0x5;
    这样你看清楚一点 完成的是2位的交换
      

  2.   

    1L正解,其实就是二分法
    举个例子,要倒转11010101
    只需要将其一分为二即1101和0101,分别倒转这两部分,然后交换位置就可以了
    1101 倒转变成 1011
    0101 倒转变成 1010
    再交换位置得结果10101011
    至于怎么倒转那两部分,同样的二分方法,最后到你只需要交换两位的时候就相当简单了
    因为是二分法,所以复杂度Θ(log(n))
      

  3.   


    我没看明白。能否详细解释一下。
    谢谢比如0101这个 i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;
    这是交换2位的 拆解成 (i & 0x5) << 1 | (i >>> 1) & 0x5;
    这样你看清楚一点 完成的是2位的交换效果上是这样的,但是我还是没有想明白这原理到底是什么?
    感觉有点抽象?
    求解释,表示我还没有看出二分法。我只是感觉有点抽象,通过那样的位运算就倒转过来了,实在没有看明白,能不能说一下数学原理
    谢谢!
    或者有什么样的资料可以看看?
    谢谢
      

  4.   

    以i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;为例,你懂了这个就应该知道其他几行在干嘛
    先看 | 或运算左边的(i & 0x55555555) << 1,首先0x55555555转换为二进制就是01010101010101010101010101010101,用 i 和这个数做&与运算,就是保留 i 所有奇数位,而把所有偶数位变为0,然后<<1是左移一位,左移后所有奇数位就左移到了偶数位上,
    再看右边的(i >>> 1) & 0x55555555,首先>>>1是无符号右移,右移以后 i 所有偶数位就都移到了奇数位,然后和0x55555555就是刚才那个数进行&运算,那么同样保留所有奇数位,偶数位变0,注意现在的奇数位实际上是 i 的偶数位。
    最后进行 | 或运算,把移动后的奇数位偶数位合并起来,所以最终效果就是原来奇数位的移动到偶数位上去了,原来偶数位的移动到奇数位去了。0x33333333等是一样的原理,它的二进制为00110011001100110011001100110011,可以看到它的作用是每两位之间的移动,
    0x0F0F0F0F则是00001111000011110000111100001111,每四位移动
      

  5.   

    以i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;为例,你懂了这个就应该知道其他几行在干嘛
    先看 | 或运算左边的(i & 0x55555555) << 1,首先0x55555555转换为二进制就是01010101010101010101010101010101,用 i 和这个数做&与运算,就是保留 i 所有奇数位,而把所有偶数位变为0,然后<<1是左移一位,左移后所有奇数位就左移到了偶数位上,
    再看右边的(i >>> 1) & 0x55555555,首先>>>1是无符号右移,右移以后 i 所有偶数位就都移到了奇数位,然后和0x55555555就是刚才那个数进行&运算,那么同样保留所有奇数位,偶数位变0,注意现在的奇数位实际上是 i 的偶数位。
    最后进行 | 或运算,把移动后的奇数位偶数位合并起来,所以最终效果就是原来奇数位的移动到偶数位上去了,原来偶数位的移动到奇数位去了。0x33333333等是一样的原理,它的二进制为00110011001100110011001100110011,可以看到它的作用是每两位之间的移动,
    0x0F0F0F0F则是00001111000011110000111100001111,每四位移动谢谢~