一. 进制转换
除了常见的十进制,二进制,八进制,十六进制(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)); } }
谢谢!!