进制转换与查表法

原理:
引例:获取一个十进制整数的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)等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值