【蓝桥杯】《试题 基础练习 十六进制转八进制》 详解

大家好,我是鸣人,初次写文章,希望大家多多指教,如果有不对的地方,希望能在评论区指正,如果喜欢看我的文章,可以关注我,我将持续更新,你的支持就是我最大的动力!

1.原理
十六进制转8进制,可以将16进制先转换为2进制,一位16进制由4位2进制组成。再将2进制转换为8进制,3位2进制转换成1位8进制。
在开始写代码之前,我们先来讲解一下进制之间的转换:

	16进制所对应的十进制
	16进制:1 2 3 4 5 6 7 8 9 A  B  C  D  E  F
	10进制:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
	
	十六进制转2进制:
	1:0001        2:0010        3:0011
	4:0100        5:0101        6:0110
	7:0111       8:1000        9:1001
	A:1010       B:1011       C:1100
	D:1101       E:1110        F:1111

	2进制转8进制:
	1:001        2:010        3:011        4:100
	5:101        6:110        7:111
	
	解这个题不需要重写具体的进制转换方法,在javaAPI中已经提供了相关的方法:
	先来了解相关方法:
![请添加图片描述](https://img-blog.csdnimg.cn/4e747a311219427a82e1529a055a0ab0.png)

2.解题思路
第一个静态方法:将16进制转换成2进制

//将16进制转换成2进制
public static String hexToBin(String hex){}

第二个静态方法:将2进制转换成8进制

//将2进制转换成8进制
public static String binToHex(String binary){}

第三个静态方法:2进制格式化(因为2进制在转成8进制的时候,是每3位2进制转成一个8进制,若不是3的倍数,则需要在2进制前补0)

//格式化2进制为3的倍数
public static String format(String str){}

第四个静态方法:将16进制转换成的2进制补充成标准的4位2进制数(因为java中所给的方法不会保留前缀,例如16进制的2只会被)

//格式化16进制转换成的2进制为标准的4位二进制数
public static String format2(String str){}

3.具体方法的实现
1.方法1详解

//16进制转2进制
/*
1.传入一个字符型16进制数
2.用Integer的valueOf()方法将该16进制数转成Integer型,第二个参数为对应的进制
3.将该Integer型16进制数用toBinaryString()方法转换成2进制
4.通过format2()方法转换后得到的2进制格式化成标准的4位2进制数
*/
    public static String hexToBin(String hex){
        return format2(Integer.toBinaryString(Integer.valueOf(hex,16)));
    }

2.方法2详解

//2进制转8进制
/*
具体实现思想同上
*/
    public static String BinToOct(String binary){
        return Integer.toOctalString(Integer.valueOf(binary,2));
    }

3.方法3详解

//2进制转8进制,如果缺0,则补0
/*
因为一位8进制由3位2进制组成,所以将该2进制数对3取余数,
若余数为1,则补两个0,
若余数为2,则补1个0
*/
    public static String format(String str){
        if (str.length()%3==1){
            str="00"+str;
        }
        if (str.length()%3==2){
            str="0"+str;
        }
        return str;
    }

4.方法4详解

//格式化为4位二进制数
/*
因为传进来的str是一位16进制数转成的二进制数,所以str的长度小于等于4
如果str的长度为3,如100,则补1个0,为0100
下面同理
*/
    public static String format2(String str){
            if (str.length()==3){
                str="0"+str;
            }
            if (str.length()==2){
                str="00"+str;
            }
            if (str.length()==1){
                str="000"+str;
            }
            return str;
    }

5.具体Main方法的实现

/*
解题思路:
1.n接收16进制的总行数
2.hex再接收单行的16进制数
3.第一个二层for循环将单个的16进制数转换成2进制,然后逐个追加到sb1中
4.将得到的sb1格式化成3的倍数的2进制数,赋值给bin
5.第二个二层for循环将3个二进制数转换成一个8进制数,并逐个追加到sb2中
6.将得到的8进制数sb2赋值给String型的result中
7.题目中提到,不能保留前缀0,所以在得到后的result,要从前缀不是0的部分开始往后截取,就得到了最终结果
*/
public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n;
        //输入的十六进制行数
        n = scan.nextInt();
        //第一层for循环解决一行的数
        //第二层for循环解决一位的数
        for (int i = 0; i < n; i++) {
            //第i行的十六进制数
            String hex=scan.next();
            //用于存放16进制转换之后的二进制
            StringBuilder sb1=new StringBuilder();
            //将单个十六进制转成二进制
            for (int j = 0; j <hex.length() ; j++) {
                String temp=hexToBin(hex.substring(j,j+1));
                sb1.append(temp);
            }
            //得到后的二进制按3个一组分,用模3取余,少则补0
            //temp:补0后的二进制数
            String bin=format(sb1.toString());
            //用于存放最终结果的八进制数
            StringBuilder sb2=new StringBuilder();
            for (int j = 0; j < bin.length(); j+=3) {
                sb2.append(BinToOct(bin.substring(j,j+3)));
            }
            String result= sb2.toString();
            //细节'0'
            for (int j = 0; j < result.length(); j++) {
                if (result.charAt(j)!='0'){
                    result=result.substring(j);
                    break;
                }
            }
            System.out.println(result);
        }

在解题过程中有两个细节的,也是最爱犯错的点希望大家也能注意一下:
在对result进行判断前缀是否为0的时候,因为result是String型,所以判断result中的单个字符时,单个字符是char类型,所以要判断的0要加单引号‘0’

以上就是我的解题思路以及实现方法,如果你喜欢我的文章的话记得点赞加收藏支持我一下哦~
想要获得更多资源,敬请关注“小呆呆学编程”微信公众号,你的关注就是我最大的动力!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漩涡编程,一鸣惊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值