`

Integer源码浅析toString(int i,int radix)

 
阅读更多
前言,大概了解了Integer的内部,而至于Long,就同理可证了。


一、看toString(int i , int radix)方法源码
 /**
     * A constant holding the minimum value an int can
     * have, -2^31 = -2147483648
     */
    public static final int   MIN_VALUE = 0x80000000;

    /**
     * A constant holding the maximum value an int can
     * have, 2^31-1 = 2147483647;剩下的一个是0,无符号从0-4294967295
     */
    public static final int   MAX_VALUE = 0x7fffffff;
    
    // 字符数组digits,36位,最多实现36进制
    final static char[] 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'
    };

    public static String toString(int i, int radix) {
        // radix边界检查,若超出,默认10进制,取值范围2-36进制     
        if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
	    radix = 10;
         
	/* Use the faster version */
	if (radix == 10) {
	    return toString(i);
	}
        // 长度为33的临时字符数组,索引0-32,存储计算转换后的值
	char buf[] = new char[33];
	boolean negative = (i < 0);
	int charPos = 32;

	if (!negative) {
	    i = -i;
	}
        // 求i的radix进制,就是通过i模radix所得值作digits数组的索引,一个一个地返回转换值,再赋予buf临时字符(后面开始,charPos索引开始),更新i值,如求10的8进制,10%8=2;digits[2]=2,填充到buf[32],更新i=1再循环
	while (i <= -radix) {
	    buf[charPos--] = digits[-(i % radix)];
	    i = i / radix;
	}
	buf[charPos] = digits[-i];
        // 求完数字,若为负,在前面加符号‘-’
	if (negative) {
	    buf[--charPos] = '-';
	}
        // 通过String构造函数返回字符串,toString(10,8)
        // buf[31],buf[32] = 1,2
        // String(buffer:buf,offset:31,count:2)
	return new String(buf, charPos, (33 - charPos));
    }


二、看toHexString(int i) & toOctalString(int i) & toBinaryString(int i)的源码
    public static String toHexString(int i) {
        // 调用toUnsignedString(i,shift)
	return toUnsignedString(i, 4);  // 16进制 2^4
    }
   
    public static String toOctalString(int i) {
        // 调用toUnsignedString(i,shift)
	return toUnsignedString(i, 3);  // 8进制 2^3
    }

    public static String toBinaryString(int i) {
	return toUnsignedString(i, 1);  // 2进制 1^2
    }


因此,只要看toUnsignedString的源码就一清二楚。此进制转换算法通过移位达成,这个算法对于我来说很高深,为什么这样设计?!看懂每一步干什么先吧,高深的东东不是现在能明了的,慢慢来!
private static String toUnsignedString(int i, int shift) {
	char[] buf = new char[32];
	int charPos = 32;
        // 进制数 = 2的N次方,N等于左移步伐
        // 0001,左移1位(0010),代表radix=2进制
        // 0001,左移3位(1000),代表radix=8进制  
	int radix = 1 << shift; 
	int mask = radix - 1;
	do {
	    buf[--charPos] = digits[i & mask]; // i跟mask求与,
	    i >>>= shift;
	} while (i != 0);

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


用一个例子模拟以上算法,目标:求10的8进制toUnsignedString(10,3)

1)
1 << shift
2)
0000 0001 左移3位 0000 1000 = radix (radix的10进制=8) 
3)
mask = 0000 0111
4)
第一次循环
i & mask = 0000 1010 & 0000 0111 = 0000 0010 (10进制的2) ,digits[2] = 2,将2赋值给buf[32],求出第一位数2。
5)  
i = i >>> shift 无符号右移3位
0000 1010 >>> 0000 0001   
i = 0000 0001 (10进制的1)
6)
  进而如此循环,求出第二位数1,最终结果为12
分享到:
评论

相关推荐

    Integer类的使用方法

    System.out.println("Integer.toString(int i, int radix): " + Integer.toString(i1, 16)); ``` 上述代码将整数54321转换为其十六进制表示"d431"。 - **valueOf方法**:`valueOf`方法可以将字符串或特定进制的...

    src02 Integer

    2. **Integer.toString(int i, int radix)**: 这个方法将给定的十进制整数`i`转换为指定基数`radix`的字符串表示。基数可以是2到36之间的任何数字,其中2表示二进制,8表示八进制,10表示十进制,16表示十六进制。 ...

    JAVA-int和Integer的区别

    此外,`Integer`类还提供了一些实用方法,比如`parseInt()`用于将字符串转换为整数,`toString()`用于将整数转换为字符串,以及`compareTo()`用于比较两个`Integer`对象的大小。 总的来说,`int`适合于需要高性能...

    java String 与各种进制字符之间的转换

    - `Integer.toString(int i)`: 默认转换为十进制字符串,如果需要指定进制,可以使用`Integer.toString(int i, int radix)`。 - `Integer.toHexString(int i)`: 转换为十六进制字符串,`Integer.toHexString(10)`...

    JAVA-int和Integer的区别1.zip

    `Integer`类提供了许多额外的方法,如`toString()`、`compareTo()`以及与`int`相互转换的方法,如`intValue()`、`parseInt()`等。 在自动装箱和拆箱方面,Java 5引入了这一特性,使得在`int`和`Integer`之间进行...

    java中int_char_string三种类型的相互转换

    int i = Integer.valueOf(my_str).intValue(); 2. 使用 Integer.parseInt() 方法 使用 Integer.parseInt() 方法也可以将 String 转换成 int。例如: int i = Integer.parseInt(str); 二、将 String 转换成 ...

    Java中int和Integer的区别.doc.doc

    Java 中 int 和 Integer 的区别 在 Java 编程语言中,int 和 Integer 是两种不同的数据类型,虽然它们看起来很相似,但它们有着根本的区别。下面我们将详细探讨这两种数据类型的差异。 基本类型 vs 复杂数据类型 ...

    java中String类型和int类型比较及相互转换

    将int类型的值转换为String类型,可以使用`Integer.toString(int i)`方法或简单地通过字符串拼接实现。 ```java int num = 123; String strNum = Integer.toString(num); // 将整数123转换为字符串"123" // 或者...

    Java进制转换实现

    - `Integer.toString(int number, int radix)`:这个方法可以将一个十进制整数转换为指定基数的字符串表示。例如,`Integer.toString(10, 2)`会返回二进制字符串"1010"。 - `Long.toString(long number, int radix...

    java中string和int型的相互转换.doc

    `String.valueOf()` 方法和 `Integer.toString()` 方法都可以将 int 类型转换为 String 类型,而字符串连接操作符可以将 int 类型转换为 String 类型,并且可以在字符串中插入其他字符。 在实际开发中,我们通常...

    String与int相互转换

    Integer.parseInt()和Integer.toString()这两个方法的源码值得深入研究。parseInt()会通过解析字符数组来计算整数值,而toString()则会根据整数值生成对应的字符序列。源码分析可以帮助我们理解这些转换过程的底层...

    int与Integer的区别(Java各种数据类型详细介绍及其区别).doc

    - 方法支持:`Integer`作为类,提供了许多额外的方法,如`toString()`、`compareTo()`等,而`int`不具备这些功能。 - 性能:由于`int`是基本类型,没有对象创建的开销,所以在计算密集型任务中使用`int`通常比`...

    java编写的数制转换器

    2. `Integer.toString(int i, int radix)`:相反,这个方法将整数转换成指定基数的字符串形式。例如,`Integer.toString(10, 16)`会将十进制的10转换为十六进制的"A"。 3. `Integer.toBinaryString(int i)` 和 `...

    Java 进制转换的方法

    要将十进制数转换为二进制字符串,可以使用 `Integer.toString(int i, int radix)`,其中 `radix` 是要转换的目标进制。例如,`Integer.toString(10, 2)` 将返回 "1010"。 2. **十进制转八进制**: 同样,用 `...

    用Java编写的数制转换

    - `Integer.toString(int i, int radix)`:将十进制整数转换为指定基数的字符串。 - `Integer.toBinaryString(int i)`:将十进制整数转换为二进制字符串。 - `Integer.toOctalString(int i)`:将十进制整数转换为...

    java 进制转换

    `Integer.valueOf(String s, int radix).toString()` 此方法用于将指定基数的字符串转换为整数,并返回其字符串表示形式。`radix` 参数指定了字符串所表示的进制。 - **示例**: ```java String hexStr = "FFFF...

    java中String类型转换方法.pdf

    * 使用 `Integer.toString()` 方法:`int i = 42; String str = Integer.toString(i);` * 使用字符串连接操作:`int i = 42; String str = "" + i;` 浮点型到字符串 将浮点型变量转换为字符串可以使用以下方法: ...

    JAVA实用进制转换

    - 当使用`Integer.parseInt(String s, int radix)`时,`radix`参数表示输入字符串的基数,如2表示二进制,8表示八进制,16表示十六进制。 - 对于`Integer.toBinaryString`, `Integer.toOctalString`, 和 `Integer....

    Java学习教程-java中number类浅析.docx

    - `toString(int i)`:将一个`int`类型的值转换为字符串。 ##### 3. Float类 `Float`类也是`Number`类的一个实现,主要处理`float`类型的数值。 - **属性**:`Float`类有一个实例方法`floatValue()`,用于将`...

    怎么用int这个字符串把Object转换成int.pdf

    int i = Integer.parseInt((String) obj); // 将对象转换为 String 后使用 parseInt() ``` - **使用反射**:如果对象的类型是动态确定的,可以使用反射机制获取对象的实际类型,并根据类型进行转换。但这种方式...

Global site tag (gtag.js) - Google Analytics