进制转换在底层的实现

首先我们应该都知道了进制如何转换,我在一篇文章中也介绍了进制转换

现在假设我们要把十进制的58,转换成十六进制
经过计算我们可以知道十六进制为3a

底层是这样实现的:
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
图片链接: 百度网盘

.
.
.
.
下面是java代码

public class day05_17 {     //类名
    public static void main(String[] args){		//主函数

        conversion(58);     //十进制58转换成十六进制

    }
    public static void conversion(int num){

            int num1 = num & 15;
            System.out.println("num1="+num1);
            num = num >>> 4;
            int num2 = num & 15;
            System.out.println("nu2="+num2);

    }
}

运行结果
在这里插入图片描述
*--------------------------------------------------------------------------------
在我们不知道输入的值是什么的时候代码的修改

public class day05_17 {     //类名
    public static void main(String[] args){		//主函数

        conversion(58);     //十进制58转换成十六进制

    }
    
    //函数功能:进制转换
    public static void conversion(int num){

        /*
        int num1 = num & 15;
        System.out.println("num1="+num1);
        num = num >>> 4;
        int num2 = num & 15;
        System.out.println("nu2="+num2);

         */
        for(int i =0; i < 8; i++)   //因为我们知道每次4bit,所以会执行8次所以循环8次就行了
        {
            int num0 = num & 15;
            System.out.println("num0="+num0);
            num = num>>>4;
        }

    }
}

运行结果
在这里插入图片描述

因为十六进制10是字母A所以我们需要把它变成字母
于是有了下面的java代码

public class day05_17 {     //类名
    public static void main(String[] args){     //主函数

        conversion(58);     //十进制58转换成十六进制

    }
    //函数功能:进制转换
    public static void conversion(int num){

        for(int i =0; i < 8; i++)   //因为我们知道每次4bit,所以会执行8次所以循环8次就行了
        {
            int num0 = num & 15;
            if(num>9)
            {
                System.out.println("num0="+(char)(num0+55));//因为A的ascii是65,然后num0为10是A,
                                                            // 所以在此基础上加55再强制类型转换就行了
            }
            else
            {
                System.out.println("num0="+num0);
            }

            num = num>>>4;
        }

    }
}

运行结果
在这里插入图片描述
由于 System.out.println("num0="+(char)(num0+55));
代码的阅读性比较差,我们可以给它进行改良
在这里插入图片描述
于是我们就可以用数组来对这些值进行存储了

int [] sixteen = {0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F} 

java代码

public class day05_17 {     //类名
    public static void main(String[] args){     //主函数

        conversion(58);     //十进制58转换成十六进制

    }
    //函数功能:进制转换
    public static void conversion(int num){
    
   		 //定义一个对应关系表
        char[] sixteen = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
        
       for(int i = 0; i<8; i++)
       {
           int num0 = num & 15;
           if(i>9)
           {
               System.out.println("sum0="+sixteen[num0]);
           }
           else
           {
               System.out.println("sum0="+sixteen[num0]);
           }
           num = num>>>4;
       }

    }
}

运行结果
在这里插入图片描述
虽然运行结果看着没什么区别,但是代码内部的实现看着更加清晰
.
.
.
如果数据出现了对应的关系,而且对应关系的一方是有序的数字编号,并用作为角标(数组下标)使用.

这时就必须想到数组的使用.
可以将这些数据存储到数组中.

根据运算结果得出相应的角标直接去数组查数组中的对应元素就行了.

这种方法可以叫做查表法.
.
.
.

我们知道十进制58转换成十六进制是3A而不是看着A3,
这代码本身没有错,因为我们先输出A在输出3的.
而且后面没有的都输出0,看着很不爽.

于是这段代码还能再继续修改.

我们可以把那些数,先不要打印,而是存储起来…
比如存储在数组里面

java代码

public class day05_18 {     //类名
    public static void main(String[] args){     //主函数
        conversion(58);	//调用函数

    }

    //函数功能:进制转换
    public static void conversion(int num){
        char[] sixteen = {'0', '1', '2', '3', '4', '5',
                               '6', '7', '8', '9', 'A',
                               'B', 'C', 'D', 'E', 'F'};
        char[] data = new char[8];

        int pos = data.length;   //记录存储位置,从最后开始

        while(num!=0)
        {
            int temp = num & 15;
            data[--pos] = sixteen[temp];     //这里减1是因为定义8个数组,然后最后一个应该是7
            num = num>>>4;       //无符号右移4位
        }

        //输出转换存储之后的数据
        for(int i = pos; i < data.length; i++)
        {
            System.out.print(data[i]);
        }

    }

}

执行结果
在这里插入图片描述
虽然这样已经算完成了,但是如果我们要转换的是0的话,是输不出结果的
在这里插入图片描述

所以我们需要在函数功能那边,要加多一行代码

if(num==0)
{
	System.out.print("0");
	return ;
}

.
.

添加之后的java代码

public class day05_18 {     //类名
    public static void main(String[] args){     //主函数
        conversion(0);	//调用函数
    }

    //函数功能:进制转换
    public static void conversion(int num){

		if(num==0)
		{
			System.out.print("0");
			return ;
		}
		
        char[] sixteen = {'0', '1', '2', '3', '4', '5',
                               '6', '7', '8', '9', 'A',
                               'B', 'C', 'D', 'E', 'F'};
        char[] data = new char[8];

        int pos = data.length;   //记录存储位置,从最后开始

        while(num!=0)
        {
            int temp = num & 15;
            data[--pos] = sixteen[temp];     //这里减1是因为定义8个数组,然后最后一个应该是7
            num = num>>>4;       //无符号右移4位
        }

        //输出转换存储之后的数据
        for(int i = pos; i < data.length; i++)
        {
            System.out.print(data[i]);
        }

    }

}

执行结果
在这里插入图片描述

十进制转换这八进制也是类似的转换

Java代码

public class day05_19 {     //类名
    public static void main(String[] args){     //主函数
        conversion(50); //调用函数

    }

    //函数功能:进制转换
    public static void conversion(int num){
        if(num==0)      //如果等于0 直接输出0 结束
        {
            System.out.print("0");
            return ;
        }
        
        //定义一个表
        char[] sixteen = {'0', '1', '2','3',
                          '4', '5', '6', '7'};
        char[] data = new char[8];
        int pos = data.length;

        while(num != 0)
        {
            int temp = num & 7;     //八进制的最大值是111也就是7,所以 &7
            data[--pos] = sixteen[temp];
            num = num>>>3;          //向右无符号移动3位
        }

        for(int i = pos; i<data.length; i++)    //循环输出
        {
            System.out.print(data[i]);
        }
    }
}

整合:
十进制转换成十六进制
十进制转换成八进制
十进制转换成二进制

Java代码:

public class day05_20 { //类名
    public static void main(String[] args){
        //十进制转十六进制
        toHex(10);
        
        //十进制转二进制
        toBinary(6);

        //十进制转八进制
        toOctal(10);
    }
    //函数功能:十进制转换为十六进制
    public static void toHex(int num){
        trans(num, 15, 4);
    }

    //函数功能:十进制转换成八进制
    public static void toOctal(int num){
        trans(num, 7, 3);
    }

    //函数功能:十进制转换成二进制
    public static void toBinary(int num){
        trans(num, 1, 1);
    }


    //函数功能进制转换
    public static void trans(int num, int base, int offset){    //num 要转换的数, base &多少位的数数, offset,移动的位数
        if(num ==0)
        {
            System.out.println("0");
            return ;
        }
        //定义一个查询表
        char[] table = {'0', '1', '2', '3', '4', '5',
                             '6', '7', '8', '9', 'A',
                             'B', 'C', 'D', 'E', 'F'};
        char[] arr = new char[32];      //定义容器的大小
        int pos = arr.length;          //最开始的数组长度的位置
        while(num!=0)
        {
            int temp = num & base;	//例如如果要十六进制 base就可以为15, 八进制base可以是7, 二进制base可以是1

            if(num>9)
            {
                arr[--pos] = table[temp];
            }
            else
            {
                arr[--pos] = table[temp];
            }
            num = num>>>offset;	//如果要十六进制 offset就移动4为, 八进制offset移动是3, 二进制offset移动1位

        }
        for(int i = pos; i < arr.length; i++)       //输出转换之后存储的数据
        {
            System.out.print(arr[i]);
        }
        System.out.println();
    }
}

但是其实Java有封住好的进制转换…
例如:

十进制转换成二进制

System.out.println(Integer.toBinaryString(10))

十进制转换成十六进制

System.out.println(Integer.toHexString(58));

十进制转换成二进制

System.out.println(Integer.toOctalString(30));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值