/**
* 将十进制转换成二进制、八进制、十六进制
* 说明:
* 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();
}
}