原理:
引例:获取一个十进制整数的16进制表示。
分析:在Java程序中,int类型在内存中占用4个字节,即32位。由于一位16进制可以由4位二进制来表示,因此,最大的int类型的整数可以用32/4=8位十六进制数来表示。
当十进制数x在{1,2,…,9}范围内时,与16进制表示一致,在{10,11,12,13,14,15}范围内时,在十六进制中表示为{A,B,C,D,E,F}
十进制转换为十六进制的方法是将十进制数先转换为二进制,再将转换的二进制从右到左每四位转换为一位十六进制即可。而在计算机中所有的数都是以二进制存储的,所以我们不用将十进制转换为二进制存储。
例如60的二进制表示为:0000-0000 0000-0000 0000-0000 0011-1100,其中1100(B)=C(Hex),0011(B)=3(Hex),0000(B)=0(Hex),所以结果为0000003C,去掉前面无意义的0即3C。如何实现以上所说的二进制从左到右转换为一位十六进制?
实现的思路是将60和15做与(&)逻辑运算,再将60右移四位,接着和15做与运算:
代码实现:
根据原理初步写出的代码如下:
public static void toHex(int num){
for(int x=0;x<8;x++){//16进制表示的int整数最多8位
int temp=num&15;
if(temp>9)
system.out.print((char)(temp-10+'A'));
else
system.out.print(temp);
num=num>>>4;
}
}//输入60,输出C3000000
查表法:
根据运算结果作为数组下标,然后用下标去查找数组中对应的元素。
这里将16进制的基数(0,1,…,9,A,B,…,F)存进一个数组,每四位与运算后的结果作为下标到此数组中查找对应的元素即可。
pubilc static void toHex_1(int num){
if(num==0){
system.out.print("0");
return;
}
char chs={'0','1','2','3','4',
'5','6','7','8','9','A',
'B','C','D','E','F'};
char[] arr=new char[8];//用于存储转换为16进制的结果
int len=arr.length;
int pos=len;
while(num!=0){//当num右移后值为0时再和15与都是0,所以不必做以下运算
int temp=num&15;
arr[pos--]=chs[temp];//从arr数组末尾开始存储与的结果,这样输出的时候是按照正确的顺序输出的
num=num>>>4;
}
for(int x=pos;x<len;x++){
system.out.print(arr[x]);
}//输入60 输出3C
其中,15即16进制的最大基数,4是位移量,因此可以将以上的代码抽取出来,以要转换的数据num、基数base、位移量offset作为参数,实现十进制到八进制:trans(num,7,3);十进制到二进制:trans(num,1,1);等的进制转换。
实际上,Java提供了进制转换的函数:Integer.toBinaryString(num)、Integer.toHexString(num)等。