JAVA中实现十进制与其它自定义进制进行相互转换。IT技术 2006-12-21 12:28:13 阅读83 评论0 字号:大中小 订阅 我们通常用到的数字都是十进制的,日常使用的也是这样,但是在程序中,我们可能还会经常用到二进制、八进制、十六进制的数字。既然程序中会使用到,那么就会有它存在的道理。有些时候,将数字用字符串保存到文件或者数据库中,你会发现,十进制的64在二进制中表示为1000000,在八进制中表示为100,在十六进制中表示为40。于是,需要将64存储到文件或者数据库中,用二进制表示的话占用了7个字符长度,八进制占了3个字符长度,而十进制、十六进制都只用了2个字符长度,可以看出,如果要使用最想的空间来存储一个普通的十进制数字,只要使用更高的进制表示就可以节省更多的空间。现在,我们完全可以自定义属于自己的进制表示,可以是N进制,当然N会有一定的限制。
下面的源代码给出了自定义进制转换的方法:
/**
* 在进制表示中的字符集合。 */ 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' }; /**
* 将十进制的数字转换为指定进制的字符串。 * @param i 十进制的数字。 * @param system 指定的进制,常见的2/8/16。 * @return 转换后的字符串。 */ public String toCustomNumericString(int i, intsystem) { long num = 0; if (i < 0) { num =((long)2 * 0x7fffffff) + i + 2; } else { num =i; } char[] buf = newchar[32]; int charPos = 32; while ((num / system) > 0){ buf[--charPos]= digits[(int)(num % system)]; num /=system; } buf[--charPos] =digits[(int)(num % system)]; return new String(buf, charPos,(32 - charPos)); } /** *将其它进制的数字(字符串形式)转换为十进制的数字。 * @param s 其它进制的数字(字符串形式) * @param system 指定的进制,常见的2/8/16。 * @return 转换后的数字。 */ public int toCustomNumeric(String s, int system){ char[] buf = newchar[s.length()]; s.getChars(0, s.length(), buf,0); long num = 0; for (inti=0;i<buf.length;i++) { for (intj=0;j<digits.length;j++) { if(digits[j] == buf[i]) { num+= j * Math.pow(system, buf.length - i -1); break; } } } return (int)num; } 从上面的代码中可以看出,由于受到digits字符数量的限制,现在能够实现的最大自定义进制只有36进制,如果想要构造更大的进制表示,我们可以扩充digits中的字符。当然不能自己构造一个一进制、零进制的数字。
下面的一个方法是JDK中的标准类库提供的方法,它在性能上有很大的提高,毕竟用到了位运算,而不是简单的比较。
private static String toUnsignedString(int i, int shift){
char[] buf = newchar[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)); } 由于用到了位移操作,所以它的进制表示只是局限于2/4/8/16/32,其它的就不能实现了。当shift为1时,表示二进制;当shift为2时,表示四进制;依次类推。 |
|