您的位置:首页 > 编程语言 > Java开发

Java源码分析01_Integer

2016-11-02 14:18 351 查看
该类继承 Number(抽象类)实现Comparable<Integer>接口,它的修饰关键字有final,即不能被继承和修改。大多方法和属性都有static,不用创建对象就可调用。

Integer的属性主要有:

最小值(public staticfinal int  MIN_VALUE = 0x80000000;(-2^31)

最小值(public staticfinal int  MAX_VALUE = 0x7fffffff;(2^31-1)

     
这里解释下为什么最小值是0x80000000;首先Integer为int的包装类,即所占位数和int一样,占4个字节即32位,由于电脑中储存数字的最高位为符号位,且以补码形式储存数字,所以最小值为-2^31,且储存形式是100***000(1后面31个0)。这是补码表示法的特殊性造成的,因为原码的正负0不同如00000000与10000000,而补码的正负0都用00000000表示,因为10000000除符号位取反再加1后就是00000000,最高位溢出,所以正负0都一样。而原来表示负0的100000
4000
00就规定用来表示最小的整数-2^7,其中1既表示符号位又表示数值位。推到整个补码表示法就是当符号位为1而数值位全为0时,它表示整数-2^(n-1),由于int占32位,所以最小值就是-2^31,用1和31个0表示。这个二进制数转化成十六进制就是0x80000000。

接着是Integer的一些方法:

toString(int i,int radix):此方法将int型的值转换为相应进制数的字符串。其中i表示要转换的int值,radix表示要转换的进制基数,如2、3、4、8等。当然此方法只能转换成2-36内的进制数,超出此范围皆以10进制转换。返回的值为String类型。值得注意的是此方法将负数转化成二进制时仅仅只是在正数的相应进制前添加负号,并不是像toBinaryString(int
i)那样将对应的补码完全给出。

publicclassTest01
{
   publicstaticvoidmain(String[]
args) {     
       System.out.println(Integer.toString(100,2));
    }
}

输出为1100100,

publicclassTest01
{
   publicstaticvoidmain(String[]
args) {     
       System.out.println(Integer.toString(100,1));
    }
}

输出为100。

 

toUnsignedString(inti, int shift):此方法将i转换为相应的无符号位数字的字符串。参数i是要转换的int值,shift是方法内1的左偏移量,例如1<<3为8。返回值也是String类型。此方法是toHexString(int
i),toOctalString(int i),toBinaryString(int i)内部调用的方法,分别调用toUnsignedString(i, 4),toUnsignedString(i,
3),toUnsignedString(i, 1)。此方法主要靠>>>(无符号右移:符号位也移动,但符号位都补0,>>右移则相当于符号位不移动,空缺位补0)和&(与运算,直接都转化为二进制相加,只有1和1结果才为1,其它都为0)判定Integer里digits里的下标,再一一逆向添加进新的字符数组内,最后用String拼接。

源码为:

finalstaticchar[]digits
= {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'
};
 
privatestaticString
toUnsignedString(int i,intshift)
{
       char[]buf
=newchar[32];
       intcharPos
= 32;
       intradix
= 1 << shift;
       int
mask= radix - 1;
       do
{
            buf[--charPos] =digits[i&
mask];
                        i >>>= shift;
        }while
(i!= 0);
       returnnewString(buf,
charPos, (32 - charPos));
    }

当为2进制时,1的左偏移量为1;8进制的1左偏移为3;16进制的1左偏移为4。(写偏移量主要用于i>>>=
shift;不除以进制基数主要考虑正负数问题)。

当为二进制时,mask为1,而1的二进制数为000….0001,即无论i为何值,i&mask的结果只看i的二进制数最后一位,因为1前面都为0,所以i和mask的二进制&运算的前面31位都为0,所以当i二进制最后一位为1时(此时i为奇数),i&mask的结果为1,反之为0。而digits下标为0和1的又是’0’和’1’,加上偶数除以2的余数为0(偶数&1的结果为0),奇数除以2的余数为1(奇数&1的结果为1),它们有对应关系,直接将digits中的’0’和’1’对应的逆序添加到buf字符数组中,再通过String合成就行。

至于8进制和16进制和二进制差不多,只不过mask和i的值都会发生相应变化,所对应的下标值也很惊奇的与相应的进制结果一致。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 源码