任意进制的转换(二)

东家蝴蝶西家飞,白骑少年今日归。 愿,所有迷茫的人,都不再迷茫的,愿,所有努力工作的人,都可以得到应有的回报,愿,所有的人,都可以找到回家的方向,愿,再无苦痛,再无离别。

上一章简单介绍了进制转换: 十进制转换成其他进制(一),如果没有看过,请观看上一章

图片引用于: 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));
	}
}

谢谢!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值