jdk之Interger.toString(int i, int radix)
来源:互联网 发布:网络组织结构 编辑:程序博客网 时间:2024/06/04 18:56
java中Integer.toString(int i, int radix)可以实现将数字i转变成radix进制数,代码虽然很简单,但确实需要注意蛮多问题的,下面是一种实现方式,可以参考一下,以本文来作为我的jdk源码阅读的起始点也是不错的~
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) { //Character.MIN_RADIX=2,Character.MAX_RADIX=26 //这两个值表示可以用字母数字表示的最值 if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX) radix = 10; /* Use the faster version */ if (radix == 10) { //实现见下 return toString(i); } char buf[] = new char[33]; boolean negative = (i < 0); int charPos = 32; if (!negative) { i = -i; } while (i <= -radix) { buf[charPos--] = digits[-(i % radix)]; i = i / radix; } buf[charPos] = digits[-i]; if (negative) { buf[--charPos] = '-'; } return new String(buf, charPos, (33 - charPos)); } public static String toString(int i) { if (i == Integer.MIN_VALUE) return "-2147483648"; int size = (i < 0) ? stringSize(-i) + 1 : stringSize(i); char[] buf = new char[size]; getChars(i, size, buf); return new String(buf, true); } final static char [] DigitTens = { '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '4', '4', '4', '4', '4', '4', '4', '4', '4', '4', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '8', '8', '8', '8', '8', '8', '8', '8', '8', '8', '9', '9', '9', '9', '9', '9', '9', '9', '9', '9', } ; final static char [] DigitOnes = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', } ; static void getChars(int i, int index, char[] buf) { int q, r; int charPos = index; char sign = 0; if (i < 0) { sign = '-'; i = -i; } // Generate two digits per iteration //也就是使用i-i/100*100来获得最后两位 while (i >= 65536) { q = i / 100; // really: r = i - (q * 100); //也就是说(q << 6) + (q << 5) + (q << 2) = q * (2^6+2^5+2^2) = q * 100 r = i - ((q << 6) + (q << 5) + (q << 2)); i = q; buf [--charPos] = DigitOnes[r]; buf [--charPos] = DigitTens[r]; } // Fall thru to fast mode for smaller numbers // assert(i <= 65536, i); for (;;) { // >>> 无符号右移位,2^19 = 524288 //所以这里实际上是除10操作,选择52429/2^19原因是它在整数范围内能达到一个最高的精度, //约为0.10000038146973,这也是之前保证i<65536的原因 q = (i * 52429) >>> (16+3); r = i - ((q << 3) + (q << 1)); // r = i-(q*10) ... buf [--charPos] = digits [r]; i = q; if (i == 0) break; } if (sign != 0) { buf [--charPos] = sign; } } final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE }; // Requires positive x static int stringSize(int x) { for (int i=0; ; i++) if (x <= sizeTable[i]) return i+1; }
到此就结束了,可以看到,对于10进制的转化,可是花了大功夫在优化上,为了避免使用除法,应用各种移位操作来进行,即使在不得不使用除法的地方也尽可能用除以100而不是除以10来减少除法次数。
看来该用内置方法就尽可能用内置方法,这可比自己粗糙地用除10加’0’的更优化,自己写反而是吃力不讨好。
1 0
- jdk之Interger.toString(int i, int radix)
- integer.toString(int i, int radix) 按进制转字符串
- int Interger的区别
- 关于Interger和int
- integer.tostring(int i) 和Sting.valueof(int)
- int和interger的区别
- [JAVA]int与Interger区别
- int parseInt(String s, int radix)
- Java中int和Interger什么区别?
- C# int.ToString()
- C# int.ToString()
- C# int.ToString()
- 编程问题之:int i=i
- JDK之HashMap中的indexFor(int h, int length)方法
- Integer.parseInt(String s,int radix)
- 详解public static int parseInt(String s, int radix)
- 格式化数值 C# int.ToString()
- java基础之Integer.parseInt(String s ,int radix)方法使用解释
- 使用css3 box-reflect设计倒影效果
- Contains方法,查看序列中是否包含某个元素
- VS2005 debug版本正常而release版本出现: ERROR LNK2005
- codeforces_675C. Money Transfers(贪心)
- javascript 操作cookie
- jdk之Interger.toString(int i, int radix)
- 基本排序算法时间复杂度
- Iwfu-安卓Gesture手势(1)-初步
- node.js 和 express 框架学习笔记(2)
- hdu 5461 Largest Point(杂题)
- jQuery动画-让页面动起来!
- linux下django的安装、配置
- Python星号操作符的作用
- DrawNode绘制几何图形