主要的两个算法是:
public static String baseString(int num, int base)
{
System.out.println("+++++++"+num);
if (base > 16)
{
throw new RuntimeException("进制数超出范围,base<=16");
}
StringBuffer str = new StringBuffer("");
String digths = "0123456789ABCDEF";
Stack<Character> s = new Stack<Character>();
System.out.println(num != 0);
while (num != 0)
{
//charAt返回指定索引处的 char 值
s.push(digths.charAt(num % base));
/**
* 近来的num永远是十进制数因为不是十进制也在方法
* baseNum(String num, int srcBase, int destBase)
* 转成了十进制了
* 此算法的精髓在于就像我们把十进制的数转换成如二进制:
* 十进制数num=16转成二进制就是16%2求余数把16/2的数再保存到num中。循环直到num=0就可以求出
* 二进制后的数
*/
num /= base;
}
while (!s.isEmpty())
{
str.append(s.pop());
}
return str.toString();
}
方法二:
public static String baseNum(String num, int srcBase, int destBase)
{
if (srcBase == destBase)
{
return num;
}
String digths = "0123456789ABCDEF";
char[] chars = num.toCharArray();
int len = chars.length;
if (destBase != 10)
{
//@@@
// 目标进制不是十进制 先转化为十进制
//此目的在于如要把二进制转成十六进制。则先把二进制转成十进制在调用
//baseString(Integer.valueOf(num), destBase)转成十六进制 递归
num = baseNum(num, srcBase, 10);
System.out.println(num);
}
else
{
/**
* 如果目标进制是十进制则直接把源进制转换成十进制不需要@@@的步骤
*/
int n = 0;
for (int i = len - 1; i >= 0; i--)
{
//pow()返回第一个参数的第二个参数次幂的值
n += digths.indexOf(chars[i]) * Math.pow(srcBase, len - i - 1); // (8,0)
// (8,1)
}
return n + "";
}
/**
* valueOf
* 返回保持指定的 String 的值的 Integer 对象。
* 将该参数解释为表示一个有符号的十进制整数,
* 就好像将该参数赋予 parseInt(java.lang.String) 方法一样。
* 结果是一个表示字符串指定的整数值的 Integer 对象。
*/
return baseString(Integer.valueOf(num), destBase);
}
再在main函数中调用:
public static void main(String[] args)
{
String s = baseNum("11111", 2,16); // 128+64+8
System.out.println(s);
}
上述九可以完成两个进制直接的转换了