JDK源码之Integer类—reverseBytes()方法

Posted 二木成林

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK源码之Integer类—reverseBytes()方法相关的知识,希望对你有一定的参考价值。

reverseBytes()方法的功能是将一个int类型的整数的二进制位按照字节(1个字节等于8位)进行反转

比如3的二进制位是00000000 00000000 00000000 00000011,经过该方法转换后的数的二进制位是00000011 00000000 00000000 00000000。

所谓的反转如下图所示:

该方法的源码及注释如下:

    /**
     * 返回通过反转指定的int值的二进制补码表示形式获得的值。
     * 比如3的二进制位是00000000 00000000 00000000 00000011
     * 经过该方法转换后的数的二进制位是00000011 00000000 00000000 00000000
     * 位翻转就是将int当做二进制,左边的位与右边的位进行互换,reverse是按位进行互换,reverseBytes是按byte进行互换。
     *
     * @param i 要反转其字节的值
     * @return 通过反转指定字节中的字节获得的值
     */
    public static int reverseBytes(int i) {
        /*
            知识点
                >>>    :     无符号右移,忽略符号位,空位都以0补齐
                >>     :     右移运算符,num >> 1,相当于num除以2
                <<     :     左移运算符,num << 1,相当于num乘以2
            以3为例:(8位二进制为1个字节)
                i = 3               00000000 00000000 00000000 00000011
                i >>> 24            00000000 00000000 00000000 00000000
                i >> 8              00000000 00000000 00000000 00000000
                0xFF00              00000000 00000000 11111111 00000000
                (i >> 8) & 0xFF00   00000000 00000000 00000000 00000000
                i << 8              00000000 00000000 00000011 00000000
                0xFF0000            00000000 11111111 00000000 00000000
                (i << 8) & 0xFF0000 00000000 00000000 00000000 00000000
                i << 24             00000011 00000000 00000000 00000000
                return              00000011 00000000 00000000 00000000
           以123456789为例:(8位二进制为1个字节)
                i = 123456789       00000111 01011011 11001101 00010101
                i >>> 24            00000000 00000000 00000000 00000111
                i >> 8              00000000 00000111 01011011 11001101
                0xFF00              00000000 00000000 11111111 00000000
                (i >> 8) & 0xFF00   00000000 00000000 01011011 00000000
                i << 8              01011011 11001101 00010101 00000000
                0xFF0000            00000000 11111111 00000000 00000000
                (i << 8) & 0xFF0000 00000000 11001101 00000000 00000000
                i << 24             00010101 00000000 00000000 00000000
                return              00010101 11001101 01011011 00000111
         */
        return ((i >>> 24)) |
                ((i >> 8) & 0xFF00) |
                ((i << 8) & 0xFF0000) |
                ((i << 24));
    }

该算法的思路就是:将32位二进制分为4组,每组也就是1个字节(即8位),然后,

  • 从左往右数将第一个八位二进制移到从左往右数第四个八位二进制的位置;
  • 从左往右数将第二个八位二进制移到从左往右数第三个八位二进制的位置;
  • 从左往右数将第三个八位二进制移到从左往右数第二个八位二进制的位置;
  • 从左往右数将第四个八位二进制移到从左往右数第一个八位二进制的位置;
  • 最后用或运算"|"将四次移动的结果整合起来,就是最终的结果。

以为123456789例画图演示代码的执行过程

简化该过程就是:

以上是关于JDK源码之Integer类—reverseBytes()方法的主要内容,如果未能解决你的问题,请参考以下文章

JDK源码之Integer类——stringSize()方法

JDK源码之Integer类——rotateRight()方法

JDK源码之Integer类——rotateLeft()方法

JDK源码之Integer类——numberOfLeadingZeros()方法

JDK源码之Integer类——numberOfTrailingZeros()方法

JDK源码之Integer类—signum()方法