在用程序实现数制转换前,首先要清楚数制转换的本质其实就是用一组进制不同的数表示同一个值。由于我们比较熟悉10进制,所以提供一个以10进制为桥梁实现的数制转换。
package test;
public class NumberTrans {
//a为输入的进制、str为该进制下的字符串、b为想要转化的目标进制
public StringBuffer numTrans(int a, String str, int b){
//创建一个存储分割后字符串的数组
String value[] = new String[str.length()];
//创建一个StringBuffer,之所以用StringBuffer是因为内置的append、reverse方法比较方便
//由于不涉及线程安全问题,用StringBuilder也ok
StringBuffer res = new StringBuffer();
//十进制数(中间值)
int sum = 0;
//数位权重
int stage = str.length();
//根据进制及数位权重将输入字符串转化为10进制表示的串
for(int i=0; i<str.length(); i++){
//截取字符串,装入数组
value[i] = str.substring(i, i+1);
//将串中的字母翻译为数字
switch(value[i].toLowerCase()){
case "a": value[i] = "10"; break;
case "b": value[i] = "11"; break;
case "c": value[i] = "12"; break;
case "d": value[i] = "13"; break;
case "e": value[i] = "14"; break;
case "f": value[i] = "15"; break;
}
//计算得出十进制表示
sum += Integer.valueOf(value[i])*Math.pow(a, stage-1);
stage--;
}
if(sum<b){//b的进制比十进制表示的数要大,就不需要进一步的操作了
res.append(String.valueOf(sum));
}else{//否则需要做短除,这里用整除模拟短除后的结果是反的串
while(sum>=b){
if(sum<b) res.append(String.valueOf(sum/b));
res.append(String.valueOf(sum%b));
sum = sum/b;
}
if(sum<b) res.append(String.valueOf(sum));
}
//这里reverse一下,输出正确顺序的b进制表示
return res.reverse();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
NumberTrans numTrans = new NumberTrans();
StringBuffer res = numTrans.numTrans(16, "110", 10);
System.out.println(res);
}
}
附上结果如下:
这其中的数制转换至限于2进制到16进制。主要受限于翻译那一步,若想扩展各位看官可以自己举一反三。