东家蝴蝶西家飞,白骑少年今日归。 愿,所有迷茫的人,都不再迷茫的,愿,所有努力工作的人,都可以得到应有的回报,愿,所有的人,都可以找到回家的方向,愿,再无苦痛,再无离别。
上一章简单介绍了进制转换: 十进制转换成其他进制(一),如果没有看过,请观看上一章
图片引用于: http://c.biancheng.net/view/1725.html
一. 进制转换
除了常见的十进制,二进制,八进制,十六进制(A ~ F或者a~f)之外,可以继续往上扩展,即加上H ~ Z ,那么一共就有26+10=36 个值了,再大,就没有合适的值来表示了。(当然,也有说用+ - / 这样的特殊字符串来表示的).
二. 十进制转换成其他的进制
提前定义好进制范围
private static String SCALE_STRING="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static char [] SCALE_ARRAY="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
利用栈 Stack 来反向输出数据。
/*十进制转换成其他的进制*/
public static String ten_to_other(int num,int base){
/*1.先对这个数字进行相应的判断*/
if(num==0){
return "0";
}
/*2.对要转换成的基本进制进行转换*/
if(base<=1||base>=37){ //最大进制理论上是,26字母+10数字=36个。
return "0";
}
if(base==10){ //与原先的进制一样,那么就不需要进行相应的转换了。
return String.valueOf(num);
}
/*条件判断完成了,就需要进行真正的转换操作了。*/
Stack<Character> result=new Stack<Character>(); //用栈表示。
while(num>0){ //当数字大于0时。
result.add(SCALE_ARRAY[num%base]);
num=num/base;
}
//用一个字符串进行相应的接收吧。
StringBuilder stringBuilder=new StringBuilder(0);
//全部放入到栈中,开始进行相应的出栈操作了。
for (;!result.isEmpty();) {
stringBuilder.append(result.pop());
}
return stringBuilder.length()==0?"0":stringBuilder.toString();
}
三. 其他进制转换成十进制
// 需要重载
public static int other_to_ten(int num,int base){
return other_to_ten(String.valueOf(num), base);
}
/*其他进制转换成十进制*/
public static int other_to_ten(String num,int base){
/*1.先对这个数字进行相应的判断*/
if("0".equals(num)){
return 0;
}
/*2.对要转换成的基本进制进行转换*/
if(base<=1||base>=37){ //最大进制理论上是,26字母+10数字=36个。
return 0;
}
if(base==10){ //与要转换的进制一样,那么就不需要进行相应的转换了。
return Integer.valueOf(num);
}
/*开始进行真正的操作了。*/
char numArray[]=num.toCharArray(); //转换成char数组,方便给每一个值进行转换。
int result=0;
int n=1; //要乘的基数
for (int i =numArray.length-1; i>=0; i--) {
int index=SCALE_STRING.indexOf(numArray[i]); //取出对应的那个索引值,即那个数字值。
result+=index*n;
n*=base;
}
return result;
}
四. 其他进制转换成其他进制
//原先的进制可能 小于10,但转换后的可能大于10,也可能 小于10,所以统一成字符串比较好一点。
public static String other_to_other(int num,int base,int toBase){
return other_to_other(String.valueOf(num), base, toBase);
}
//原先的进制可能大于10
public static String other_to_other(String num,int base,int toBase){
if("0".equals(num)){
return "0";
}
if((base<=1||base>=37)||(toBase<=1||toBase>=37)){ //最大进制理论上是,26字母+10数字=36个。
return "0";
}
if(base==toBase){
return num;
}
int temp=other_to_ten(num, base);
return ten_to_other(temp, toBase);
}
五. 提前定义常用的方法
为了更好的方便,二进制,八进制,十进制,十六进制之间的转换,可以提供这些常见的转换方法
//十进制转换成二进制
public static int toBinary(int num){
return Integer.valueOf(other_to_other(num,10,2));
}
//十进制转换八进制
public static int toOct(int num){
return Integer.valueOf(other_to_other(num,10,8));
}
//十进制转换成十六进制
public static int toOx(int num){
return Integer.valueOf(other_to_other(num,10,16));
}
// 二进制转换成十进制
public static int binaryToTen(int num){
return Integer.valueOf(other_to_other(num,2,10));
}
// 八进制转换成十进制
public static int OctToTen(int num){
return Integer.valueOf(other_to_other(num,8,10));
}
// 十六进制转换成十进制
public static int OxToTen(String num){
return Integer.valueOf(other_to_other(num,16,10));
}
六. 统一整理
所以,将以上的方法结合起来,就是完整的实例
public class Transfer{
private static String SCALE_STRING="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static char [] SCALE_ARRAY="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();
/*十进制转换成其他的进制*/
private static String ten_to_other(int num,int base){
if(base==10){ //与原先的进制一样,那么就不需要进行相应的转换了。
return String.valueOf(num);
}
/*条件判断完成了,就需要进行真正的转换操作了。*/
Stack<Character> result=new Stack<Character>(); //用栈表示。
while(num>0){ //当数字大于0时。
result.add(SCALE_ARRAY[num%base]);
num=num/base;
}
//用一个字符串进行相应的接收吧。
StringBuilder stringBuilder=new StringBuilder(0);
//全部放入到栈中,开始进行相应的出栈操作了。
for (;!result.isEmpty();) {
stringBuilder.append(result.pop());
}
return stringBuilder.length()==0?"0":stringBuilder.toString();
}
public static int other_to_ten(int num,int base){
return other_to_ten(String.valueOf(num), base);
}
/*其他进制转换成十进制*/
private static int other_to_ten(String num,int base){
if(base==10){ //与要转换的进制一样,那么就不需要进行相应的转换了。
return Integer.valueOf(num);
}
/*开始进行真正的操作了。*/
char numArray[]=String.valueOf(num).toCharArray(); //转换成char数组,方便给每一个值进行转换。
int result=0;
int n=1; //要乘的基数
for (int i =numArray.length-1; i>=0; i--) {
int index=SCALE_STRING.indexOf(numArray[i]); //取出对应的那个索引值。
result+=index*n;
n*=base;
}
return result;
}
//原先的进制可能 小于10,但转换后的可能大于10,也可能 小于10,所以统一成字符串比较好一点。
public static String other_to_other(int num,int base,int toBase){
return other_to_other(String.valueOf(num), base, toBase);
}
//原先的进制可能大于10
private static String other_to_other(String num,int base,int toBase){
if("0".equals(num)){
return "0";
}
if((base<2||base>36)||(toBase<2||toBase>36)){ //最大进制理论上是,26字母+10数字=36个。
return "0";
}
if(base==toBase){
return num;
}
int temp=other_to_ten(num, base);
return ten_to_other(temp, toBase);
}
public static String other_to_other2(String num,int base,int toBase){
if("0".equals(num)){
return "0";
}
if((base<2||base>36)||(toBase<2||toBase>36)){ //最大进制理论上是,26字母+10数字=36个。
return "0";
}
if(base==toBase){
return num;
}
int temp=Integer.parseInt(num,base);
return Integer.toString(temp,toBase);
}
//十进制转换成二进制
public static int toBinary(int num){
return Integer.valueOf(other_to_other(num,10,2));
}
//十进制转换八进制
public static int toOct(int num){
return Integer.valueOf(other_to_other(num,10,8));
}
//十进制转换成十六进制
public static int toOx(int num){
return Integer.valueOf(other_to_other(num,10,16));
}
// 二进制转换成十进制
public static int binaryToTen(int num){
return Integer.valueOf(other_to_other(num,2,10));
}
// 八进制转换成十进制
public static int OctToTen(int num){
return Integer.valueOf(other_to_other(num,8,10));
}
// 十六进制转换成十进制
public static int OxToTen(String num){
return Integer.valueOf(other_to_other(num,16,10));
}
public static void main(String []args){
System.out.println(other_to_other(1024, 10,16));
}
}
谢谢!!