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

toUnsignedString0()方法的功能将整数转换成无符号数字字符串返回。该方法的核心其实是formatUnsignedInt()方法的调用,formatUnsignedInt()方法将val转换成二进制或八进制或十六进制后的数填充到buf字符数组中,而formatUnsignedInt()方法就是将该字符数组转换成字符串,这才是它的核心功能。

toUnsignedString0()方法的源码如下:

    /**
     * Convert the integer to an unsigned number.
     */
    private static String toUnsignedString0(int val, int shift) {
        // assert shift > 0 && shift <=5 : "Illegal shift value";
        int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
        int chars = Math.max(((mag + (shift - 1)) / shift), 1);
        char[] buf = new char[chars];

        formatUnsignedInt(val, shift, buf, 0, chars);

        // Use special constructor which takes over "buf".
        return new String(buf, true);
    }

该方法是一个私有方法,不供外界类使用,只能在Integer类调用,所以如果我们要明白这个方法,首先要明白这个方法在那些地方调用了的,其实在该方法仅在Integer类中被调用了三次,如下:

    // 将一个整数转换成十六进字符串返回
    public static String toHexString(int i) {
        return toUnsignedString0(i, 4);
    }

    // 将一个整数转换成八进制字符串返回
    public static String toOctalString(int i) {
        return toUnsignedString0(i, 3);
    }

    // 将一个整数转换成二进制字符串返回
    public static String toBinaryString(int i) {
        return toUnsignedString0(i, 1);
    }

可以看到在该方法中传入的值分别是1、3、4,对应的转换进制分别是二进制、八进制、十六进制。

  • toBinaryString()方法传入的移位值是1,因为二进制的log2(2)=1;
  • toOctalString()方法传入的移位值是3,因为八进制的log2(8)=3;
  • toHexString()方法传入的移位值是4,因为十六进制的log2(16)=4

对toUnsignedString0()方法进行注释如下:

    /**
     * 将整数转换为无符号数字
     *
     * @param val   传入数据
     * @param shift 移位值
     *              toBinaryString()方法传入的移位值是1,因为二进制的log2(2)=1;
     *              toOctalString()方法传入的移位值是3,因为八进制的log2(8)=3;
     *              toHexString()方法传入的移位值是4,因为十六进制的log2(16)=4
     * @return
     */
    private static String toUnsignedString0(int val, int shift) {
        // assert shift > 0 && shift <=5 : "Illegal shift value";
        // Integer.numberOfLeadingZeros(val)方法是计算val的二进制的前导零个数,比如8的二进制是0000 0000 0000 0000 0000 0000 0000 1000的前导零个数为28
        // Integer.SIZE是设置的常量,值为32
        // chars 代表的是字符的个数,mag代表的是除去前导零的个数
        // mag是从左往右数第一个'1'之后的所有位数(包括第一个'1'),确定应当存在字符数组中的字符个数(长度)
        int mag = Integer.SIZE - Integer.numberOfLeadingZeros(val);
        // (mag + (shift - 1)) / shift,这是防止chars为0,我们需要chars至少为1,当mag=1时,((mag + (shift - 1)) / shift)是为1的。我们使用shift - 1
        int chars = Math.max(((mag + (shift - 1)) / shift), 1);
        // 根据字符个数chars定义一个字符数组
        char[] buf = new char[chars];

        // 调用formatUnsignedInt()方法将整数val转换成对应的进制数后每个字符保存到chars数组中
        // 第一个参数val指的是要转换的十进制整数
        // 第二个参数shift是移位值,比如要转换成二进制那么shift传入1,转换成八进制那么shift传入3,转换成十六进制那么shift传入4
        // 第三个参数buf是定义的字符数组
        // 第四个参数offset是目标缓冲区中开始的偏移量,传入0,从数组中的最后一个位置开始向前填充字符
        // 第五个参数len是传入的字符个数
        formatUnsignedInt(val, shift, buf, 0, chars);

        // 将buf字符数组转换成字符串返回
        return new String(buf, true);
    }

那么关于formatUnsignedInt()方法的说明注释请参考:JDK源码之Integer类—formatUnsignedInt()方法

参考链接:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值