十六进制转八进制 2021.12.01

第一种方法:使用java自带的 Integer.parseInt(String s, int radix) 和 Integer.toString(int n, int radix)方法直接进行进制之间的转换。

第二种方法:先将十六进制转换为二进制,再将转化的二进制数转换为八进制

思路:首先,分别建立十六进制、八进制和二进制对应的表(字符串数组);其次,十六进制转二进制直接依次遍历输入的字符在十六进制表中的索引,然后根据索引找出对应的二进制数;然后将最终的二进制字符串的长度变为3的倍数(此处这样做的原因是八进制表只有8个数,其中最大的数7对应的二进制数为0111,所以必须每次取3位来进行查找; 否则在遍历的过程中会出现八进制数组越界的情况。)依次将二进制字符串中的 【‘0’+3位】对应到八进制表中的索引对应的值。

具体代码如下:

package introductory;

import java.util.Arrays;
import java.util.Scanner;

public class test02 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
//        String[] s = new String[n];
//        String[] ss = new String[n];
//        for(int i=0; i<n; i++){
//            s[i] = sc.next();
//            int b = Integer.parseInt(s[i],16);
//            ss[i] = Integer.toString(b,8);
//        }
//        for(String s1: ss){
//            System.out.println(s1);
//        }

        //接收输入十六进制的字符串
        String[] nums = new String[n];
        for(int i=0; i<n; i++){
            nums[i] = sc.next();
        }
        sc.close();

        String[] ss = new String[n];
        //十六进制表
        String[] HEXs = {
                "0","1","2","3","4","5","6","7",
                "8","9","A","B","C","D","E","F"
        };
        //二进制表
        String[] BINs = {
                "0000","0001","0010","0011","0100","0101","0110","0111",
                "1000","1001","1010","1011","1100","1101","1110","1111"
        };
        //八进制表
        String[] OCTs = {
                "0","1","2","3","4","5","6","7"
        };
        for(int m=0; m<n; m++){
            String hex = nums[m];
            StringBuffer sbBin = new StringBuffer();
            StringBuffer sbOct = new StringBuffer();

            //十六进制转二进制
            for(int i=0; i<hex.length(); i++){
                String c = Character.toString(hex.charAt(i));
                //查询当前字符在十六进制表中的索引值
                int index = Arrays.binarySearch(HEXs,c);
                sbBin.append(BINs[index]);
            }

            while(sbBin.length() % 3 != 0){
                sbBin.insert(0,"0");
            }

            int octLen = sbBin.length()/3;
            /*
                此处这样做的原因是八进制表只有8个数,其中最大的数7对应的二进制数为0111,所以必须每次取3位来进行查找;
                否则在遍历的过程中会出现八进制数组越界的情况。
             */
            for(int i=0; i<octLen; i++){
                String span = sbBin.substring(3*i,3*i+3);
                int index = Arrays.binarySearch(BINs,'0'+span);
                sbOct.append(OCTs[index]);
            }

            while(sbOct.charAt(0) == '0'){
                sbOct.delete(0,1);
            }
            ss[m] = sbOct.toString();
        }

        for(String s: ss){
            System.out.println(s);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值