基础练习 十六进制转八进制

Posted reton

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基础练习 十六进制转八进制相关的知识,希望对你有一定的参考价值。

一开始这道题我是想着用系统自带的函数去做的,事实告诉我偷懒是别想偷懒的。
所以老老实实的回来想题目。这道题其实不是什么难题,主要是涉及到一些字符串格式的运用。大概的思路就是把16进制变为二进制,再把二进制变为八进制。
把十六进制转换为二进制:是通过将十六进制数逐一变成4位的二进制数,所以这里将输入的字符串变为字符数组。其中通过StringBuilder来定义二进制数,因为StringBuilder有append函数,可以一次将一个字符串加入到总字符串中。
把二进制转换为八进制:是通过将每3位二进制数转换为一个八进制数,所以这里是用字符串操作。利用String的subString操作,一次可以通过对一个短字符串进行判定。

以下源代码:

import java.util.*;
public class Main{
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = sc.nextInt();
    
    for (int i = 1; i <= n; i++) {
        String s16 = sc.next();
        char[] c16 = s16.toCharArray();
        StringBuilder s2 = toBinary(c16);
        String s8 = toOctal(s2);
        System.out.println(s8);
    }
}

public static StringBuilder toBinary(char[] c16) {
    StringBuilder s2 = new StringBuilder();
    for (int j = 0; j < c16.length; j++) {

        switch(c16[j]) {
            case '0':  
                s2.append("0000");
                break;
            case '1':
                s2.append("0001");
                break;
            case '2':
                s2.append("0010");
                break;
            case '3':
                s2.append("0011");
                break;
            case '4':
                s2.append("0100");
                break;
            case '5':
                s2.append("0101");
                break;
            case '6':
                s2.append("0110");
                break;
            case '7':
                s2.append("0111");
                break;
            case '8':
                s2.append("1000");
                break;
            case '9':
                s2.append("1001");
                break;
            case 'A':
                s2.append("1010");
                break;
            case 'B':
                s2.append("1011");
                break;
            case 'C':
                s2.append("1100");
                break;
            case 'D':
                s2.append("1101");
                break;
            case 'E':
                s2.append("1110");
                break;
            case 'F':
                s2.append("1111");
                break;
        }
    }
    return s2;
}

public static String toOctal(StringBuilder sb2) {
    String s2 = sb2.toString();
    StringBuilder sb8 = new StringBuilder();

    if (sb2.length() % 3 == 2) {
        s2 = sb2.insert(0, "0").toString();
    } else if (sb2.length() % 3 == 1) {
        sb2.insert(0, "0");
        sb2.insert(0, "0");
        s2 = sb2.toString();
    } 
    
    for (int i = 0; i < s2.length(); i += 3) {
        switch(s2.substring(i, i+3)) {
            case "000": sb8.append(0);break;
            case "001": sb8.append(1);break;
            case "010": sb8.append(2);break;
            case "011": sb8.append(3);break;
            case "100": sb8.append(4);break;
            case "101": sb8.append(5);break;
            case "110": sb8.append(6);break;
            case "111": sb8.append(7);break;
        }
    }

    if (sb8.toString().startsWith("0")) {
        return sb8.toString().substring(1, sb8.length());
    }

    return sb8.toString();
}

}
------------恢复内容结束------------

以上是关于基础练习 十六进制转八进制的主要内容,如果未能解决你的问题,请参考以下文章

基础练习 十六进制转十进制

基础练习 十六进制转八进制

9-基础练习 十进制转十六进制

基础练习 十进制转十六进制

蓝桥杯- 基础练习:十六进制转八进制

蓝桥杯 基础练习 BASIC-12 十六进制转八进制