逆战纪元之光双刷视频:JAVA中实现十进制与其它自定义进制进行相互转换。 - yz124的日志 - 网易博客

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 20:56:48

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;ifor (intj=0;jif(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 <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时,表示四进制;依次类推。
JAVA中实现十进制与其它自定义进制进行相互转换。 - yz124的日志 - 网易博客 c语言中16进制转换为十进制 怎样在自定义模块中做动画的超级链接 - 海珠儿的日志 - 网易博客 c语言中八进制转换为十进制函数 网易博客自定义模板制作技巧 - 阁楼上的呜呜的日志 - 网易博客 [转]java中byte转换int时为何与0xff进行与运算 java中byte转换int时为何与0xff进行与运算 风格转换在悄然进行中 - - 跑赢大盘的王者 - 和讯博客 极品万能转换 什么格式都能转换! - 理睬的日志 - 网易博客 敲门砖及其它 - 行者的日志 - 网易博客 房地产开发企业的会计核算与其他行业 - liuzhankai的日志 - 网易博客 歌曲自定义经典小型播放器⑵ - 香儿的日志 - 网易博客 08最新自定义音乐播放器 - 理睬的日志 - 网易博客 自定义歌曲播放器汇总 - 香儿的日志 - 网易博客 GCC静态链接与动态链接 - 小呆学JAVA的日志 - 网易博客 引用 java和C通讯 - tengyunju@126的日志 - 网易博客 android wrapper C调用java api - 示韦BadSmile的日志 - 网易博客 如何转换只读的excel2007到excel2003中进行更改 Word,PDF,PPT,TXT之间的转换方法 - 理睬的日志 - 网易博客 最容易转换成癌症的八种病 - 恰玛古食疗的日志 - 网易博客 Word,PDF,PPT,TXT之间的转换方法 - 理睬的日志 - 网易博客 java自定义监听器的示例代码 如何将Excel数据表格转换为图片格式(转) - gofu171的日志 - 网易博客 如何将视频转换成高清GIF - 闲人SGM的日志 - 网易博客