十进制转换成二进制、八进制、十六进制的通用方法

/**
 * 将十进制转换成二进制、八进制、十六进制
 * 说明:
 * 1)、在JAVA语言一个整数用4个八位表示,即32个二进制位
 * 2)、一个二进制位用0和1表示,最大值是1
 * 3)、一个八进制位表示3个二进制位,最大值是7
 * 4)、一个十六进制位表示4个二进制位,最大值是15
 *
 */
public class DecimalConvert {
	
	public static void main(String[] args) {
		int num = 60;
		System.out.println(num + "转换成二进制=" + toBinaryString(num));	
		System.out.println(num + "转换成八进制=" + toOctalString(num));	
		System.out.println(num + "转换成十六进制=" + toHexString(num));	
	}
	
	/**
	 * 十进制转成二进制
	 * @param num 要转换成二进制的整数
	 * @return 转成二进制后的字符串
	 */
	public static String toBinaryString(int num) {
		return trans(num, 1, 1);
	}
	
	/**
	 * 十进制转成八进制
	 * @param num 要转换成八进制的整数
	 * @return 转成八进制后的字符串
	 */
	public static String toOctalString(int num) {
		return trans(num, 7, 3);
	}
	
	
	/**
	 * 十进制转成十六进制
	 * @param num 要转换成十六进制的整数
	 * @return 转成十六进制后的字符串
	 */
	public static String toHexString(int num) {
		return trans(num, 15, 4);
	}
	
	/**
	 * 进制公共计算方法,提取进制转换相同的代码
	 * @param num 要转换的整数
	 * @param base 要转换的进制基数,如果是二进制:base=1; 如果是8进制:base=7; 如果是16进制:base=15
	 * @param offset 右移位数,由转换的进制类型决定。二进制偏移1位,8进制偏移3位,16进制偏移4位
	 * @return 转成进制后的字符串
	 */
	private static String trans(int num, int base, int offset) {
		if (num == 0) 
			return ""; 
		StringBuffer result = new StringBuffer();
		//存储二进制、八进制、十六进制的字符表
		char[] chs = new char[] {
				'0','1','2','3',
				'4','5','6','7',
				'8','9','A','B',
				'C','D','E','F'
		};
		
		char[] arr = new char[32];	//JAVA中int用4个二进制八位表示,即32个二进制位,所以存储的值最大不会超过32位
		
		int pos = arr.length;		//存储进制值的指针
		
		//开始计算,直到有效位为0才停止计算
		while(num != 0) {
			//与(&)上转换进制有效位的最大值,如果在16进制中,一个十六进制位表示4个二进制位,4个二进制位的最大值是15,所以这里的base就是15
			int temp = num & base;	
			//从最大下标位开始存储,方便取出拼接。temp的值在0-15之间,所以直接将与后的值从字符表中取出来得到相应的进制值
			arr[--pos] = chs[temp];
			//无符号右移,如果是16进制,则右移4位,因为一个十六进制位表示4个二进制位,所以这里的offset就是4
			num = num >>> offset;
		}
		
		//将计算后的值拼接成相应的进制表示方式,由于是反着存储的,所以要从最后保存的指针位置开始取才能保证表现的进制数是正确的
		for (int i = pos; i < arr.length; i++) {
			result.append(arr[i]);
		}
		
		return result.toString();
	}

}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

xyang0917

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值