Java源码分析01_Integer

来源:互联网 发布:滴滴算法岗年薪多少 编辑:程序博客网 时间:2024/06/18 09:20

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


Integer的属性主要有:

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

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

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


接着是Integer的一些方法:


toString(int i,int radix):此方法将int型的值转换为相应进制数的字符串。其中i表示要转换的int值,radix表示要转换的进制基数,如2348等。当然此方法只能转换成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<<38。返回值也是String类型。此方法是toHexString(int i)toOctalString(int i)toBinaryString(int i)内部调用的方法,分别调用toUnsignedString(i, 4)toUnsignedString(i, 3)toUnsignedString(i, 1)。此方法主要靠>>>(无符号右移:符号位也移动,但符号位都补0>>右移则相当于符号位不移动,空缺位补0)和&(与运算,直接都转化为二进制相加,只有11结果才为1,其它都为0)判定Integerdigits里的下标,再一一逆向添加进新的字符数组内,最后用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的左偏移量为18进制的1左偏移为316进制的1左偏移为4。(写偏移量主要用于i>>>= shift;不除以进制基数主要考虑正负数问题)。

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

至于8进制和16进制和二进制差不多,只不过maski的值都会发生相应变化,所对应的下标值也很惊奇的与相应的进制结果一致。

0 0