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例画图演示代码的执行过程

简化该过程就是:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值