Integer.toBinaryString(15); //转换为2进制
Integer.toHexString(15); //转换为8进制
Integer.toOctalString(15); //转换为16进制
于是研究了一下,也动手模拟写了一遍还是挺有收获的。
简单的总结就是结合了Java中的位运算以及算法“查表法”的使用。
首先,计算机中的数据都是以二进制形式的数据保存的。
而二进制与十进制之间的相互转换的原理通常都比较了解 ,
而所谓的八进制和十六进制,实际就是对二进制的数分别以每三位和每四位提取为一个数。
所以如果我们要将其转换为代码,实际上也就是通过这个原理来完成。
也就是如果要将一个十进制的数转换为二进制,八进制或十六进制的话,
就分别以一个比特位,三个比特位,四个比特位的数进行提取就行。
而十六进制因为涉及到一些用数字无法表达的符号“a-f”,所以就可以通过查表法来转换为对应的字符。
而相对来说,要值得斟酌的,就是按比特位提取数进行转换并保持数据的正确性的实现方法了。
既然涉及到比特位的操作,那么首先想到的就是:肯定要使用到位运算符。
按指定比特位数提取数需要用到的是Java当中按位与运算符,因为位与运算符“&”的特性在于:相与的两个数,只要有一个数为0,那么运算得到的结果就是0.
所以想要将一个数按位取值,并保证值的正确性,就让它和相同位数的“1”进行与运算就搞定了。
举例来说,十进制的数“12”的二进制表现形式为:0000-0000 0000-0000 0000-0000 0000-1100
如果我们要将其转换成八进制来讲,就是每次按三个比特位进行提取。
要做的工作就是让他每次与相同位数的“1”,也就是111进行与运算,那么:
0000-0000 0000-0000 0000-0000 0000-1100 与上
0000-0000 0000-0000 0000-0000 0000-0111
得到的结果就是:
0000-0000 0000-0000 0000-0000 0000-0100
接下来要做的就简单了,当成功取出3位之后,我们要做的自然就是将已经提取出的三位移出,
那么对应的也就是使用Java的移位运算符“>>>”对数进行移位运算了,既然是移除三位,那么也就是">>>3"。
了解了原理之后,要做的也就是对以上所说的步骤进行循环,直至取出所有有效位,完成整个转换工作。
不再废话,看一眼实现代码吧:
/**
* 进制转换工具类
* 利用算法:查表法,完成整数的进制转换
* @author Hql
*
*/
public class HexadecimalConversion {
public static String toBinaryString(int num) {
return conversion(num, 1, 1);
}
public static String toOctalString(int num) {
return conversion(num, 7, 3);
}
public static String toHexString(int num) {
return conversion(num, 15, 4);
}
/**
* 进制转换运算
* @param num 要进行转换的10进制目标数
* @param base 对应提取位数的数进行与运算的基础数 (2进制为1,8进制为111:7,16进制为1111:15)
* @param offSet 移位运算的偏移量
*/
public static String conversion(int num, int base, int offSet) {
String buffer = "";
if (num == 0) {
buffer += "0";
return buffer;
}
// 绘制一张对应关系表
char[] ch = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A',
'B', 'C', 'D', 'E', 'F' };
// 定义一个char数组,存放对应的符号
char[] temps = new char[32];
int position = temps.length;
// 当num不等于0
while (num != 0) {
int temp = num & base;
//存放进目标数组
temps[--position] = ch[temp];
//没取出一个数后,将这几位数移出
num = num >>> offSet;
}
for (int i = position; i < temps.length; i++) {
buffer+=temps[i];
}
return buffer;
}
public static void main(String[] args) {
System.out.println(HexadecimalConversion.toBinaryString(12));
System.out.println(HexadecimalConversion.toOctalString(12));
System.out.println(HexadecimalConversion.toHexString(12));
System.out.println(Integer.toBinaryString(12));
System.out.println(Integer.toOctalString(12));
System.out.println(Integer.toHexString(12));
}
}
程序的打印结果:
1100
14
C
1100
14
c