首页 > 其他 > 详细

JDK源码解读之toUnsignedString

时间:2014-12-14 11:50:45      阅读:365      评论:0      收藏:0      [点我收藏+]

我们知道,所有整数都是通过二进制编码的形式存储在内存中的。比如32位的整数,最高位是符号位,0代表正数,1代表负数。

那么怎么才能够将整数的二进制编码形式打印出来呢?Integer类提供了一个公有静态方法toBinaryString能够达到这一目的。我们来看看这段源码:

public static String toBinaryString(int i) 
{
    return toUnsignedString(i, 1);
}

/**
 * Convert the integer to an unsigned number.
 */
private static String toUnsignedString(int i, int shift) 
{
    char[] buf = new char[32];
    int charPos = 32;
    int radix = 1 << shift;
    int mask = radix - 1;
    do 
    {
        buf[--charPos] = digits[i & mask];
        i >>>= shift;
     } while (i != 0);

     return new String(buf, charPos, (32 - charPos));
}    

可以看到,实际上是通过调用toUnsignedString方法来实现的。这段代码的精妙之处在于以下几点:

1. 掩码mask的计算。shift参数用于区分不同进制,比如二进制的shift=1,mask=1;八进制的shift=3,mask=7;十六进制的shift=4,mask=15。

2. 右移使用的是>>>而不是>>。位运算中的右移分为算术右移(>>)和逻辑右移(>>>)。在进行算术右移时,最高位补符号位;而在进行逻辑右移时,最高位补0。如果这里使用的算术右移,那么对于像-1这样的负数,不论进行多少次右移操作都不可能变成0,所以会造成死循环。

3. 使用的是do-while而不是while。这是一个极其重要的细节,如果使用的是while,那么对于i=0的场景则会返回空字符串。

JDK源码解读之toUnsignedString

原文:http://www.cnblogs.com/jtree/p/4162321.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!