Java算法学习:java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制)

java进制转换(十进制转八进制,十进制转二进制,十六进制转八进制)

这几天在复习C语言的数据结构栈和队列那一章的时候,看到利用栈的特性FILO实现的进制转换十分简洁

想起了java中实现栈的操作十分方便(不用自己写.h文件,内部util.Stack包已经封装好)

所以用这个来写一个进制转换作为记录

十进制怎么转化为二进制呢?

    public void Dex2Bin(int n){
        int x;
        Stack<Integer> stack = new Stack<>();
        while(n>0){
            x=n%2;
            stack.push(x);
            n/=2;
        }
        while(!stack.empty()){
            int num = stack.pop();
            System.out.format("%d",num);
        }
    }

首先是获取被转换的数据n,创建一个栈,new即可,自动初始化(对应C语言中的top指针指向base)

当n>0的时候,不断的:

  • 除以2取余 x=n%2,取余的数字压栈
  • 数字除以2取整 n/=2

这样就完成了对一个数字进制转换的过程。

输出的时候只要对stack不断的pop即可

同理十进制转八进制也是如此

    public void Dex2Oct(int n){
        int x;
        Stack<Integer> stack = new Stack<>();
        while(n>0){
            x=n%8;
            stack.push(x);
            n/=8;
        }
        while(!stack.empty()){
            int num = stack.pop();
            System.out.format("%d",num);
        }
    }

和二进制转换类似,不多赘述

十六进制怎么转化为八进制呢?

    public void Hex2Oct(String n) {
        int hex2dex = 0;
        int reIndex = 0;
        /*十六进制转十进制*/
        for (int i = n.length()-1; i >= 0; i--) {
            if(Character.isDigit(n.charAt(i))&&
                    Integer.parseInt(String.valueOf(n.charAt(i))) >= 0 &&
                    Integer.parseInt(String.valueOf(n.charAt(i))) <= 9){
                    hex2dex += Integer.parseInt(String.valueOf(n.charAt(i))) * Math.pow(16, reIndex);
            } else {
                switch (n.charAt(i)) {
                    case 'A':
                        hex2dex += 10 * Math.pow(16, reIndex);
                        break;
                    case 'B':
                        hex2dex += 11 * Math.pow(16, reIndex);
                        break;
                    case 'C':
                        hex2dex += 12 * Math.pow(16, reIndex);
                        break;
                    case 'D':
                        hex2dex += 13 * Math.pow(16, reIndex);
                        break;
                    case 'E':
                        hex2dex += 14 * Math.pow(16, reIndex);
                        break;
                    case 'F':
                        hex2dex += 15 * Math.pow(16, reIndex);
                        break;
                }
            }
            reIndex++;
        }
        //十进制转八进制
        Dex2Oct(hex2dex);

    }

这里说实话,我个人觉得写得很啰嗦,希望能提出改进意见,主要是在char转换位int的时候有些麻烦

上面的算法分为两个部分:1、十六进制字符串转换为对应的十进制,完成了从字符串到数字的转换

                                       2、十进制转换为八进制

首先是逐个解析十六进制字符串,采用倒序循环的方式。

同时设置一个从0开始递增的辅助变量reIndex,帮助算法完成对最后一个字符的乘以16的N次方的行为。

解析的时候,首先判断这个字符串是不是一个数字型比如‘9’:

  • 若是,对这个字符转换为数字9之后,乘以相应的16的N次方;
  • 若不是,对这个数字单独辨识,必定是ABCDEF其中一个,在对这些数字表示的十进制数值进行运算操作。

得到十六进制转换的十进制数字之后,对这个数字进行上面已经完成的十进制转八进制的运算,只要传入数字即可获得答案。

总结

  1. 算法特点,利用栈的特点解决进制转换很方便
  2. 转换出来的二进制没有前缀00...

 

贴完整代码:

样例输入:先输入十进制转换二进制的十进制数字:比如15

转换完成之后输入一个16进制字符,转换为8进制

import java.util.Scanner;
import java.util.Stack;
/**
 * Page Description:
 * User: Yelihu
 * Date: 2018-12-19
 * Time: 上午 9:16
 * Function:
 */
public class Main {
    public void Dex2Bin(int n){
        int x;
        Stack<Integer> stack = new Stack<>();
        while(n>0){
            x=n%2;
            stack.push(x);
            n/=2;
        }
        while(!stack.empty()){
            int num = stack.pop();
            System.out.format("%d",num);
        }
    }
    public void Dex2Oct(int n){
        int x;
        Stack<Integer> stack = new Stack<>();
        while(n>0){
            x=n%8;
            stack.push(x);
            n/=8;
        }
        while(!stack.empty()){
            int num = stack.pop();
            System.out.format("%d",num);
        }
    }
    public void Hex2Oct(String n) {
        int hex2dex = 0;
        int reIndex = 0;
        /*十六进制转十进制*/
        for (int i = n.length()-1; i >= 0; i--) {
            if(Character.isDigit(n.charAt(i))&&
                    Integer.parseInt(String.valueOf(n.charAt(i))) >= 0 &&
                    Integer.parseInt(String.valueOf(n.charAt(i))) <= 9){
                    hex2dex += Integer.parseInt(String.valueOf(n.charAt(i))) * Math.pow(16, reIndex);
            } else {
                switch (n.charAt(i)) {
                    case 'A':
                        hex2dex += 10 * Math.pow(16, reIndex);
                        break;
                    case 'B':
                        hex2dex += 11 * Math.pow(16, reIndex);
                        break;
                    case 'C':
                        hex2dex += 12 * Math.pow(16, reIndex);
                        break;
                    case 'D':
                        hex2dex += 13 * Math.pow(16, reIndex);
                        break;
                    case 'E':
                        hex2dex += 14 * Math.pow(16, reIndex);
                        break;
                    case 'F':
                        hex2dex += 15 * Math.pow(16, reIndex);
                        break;
                }
            }
            reIndex++;
        }
        //十进制转八进制
        Dex2Oct(hex2dex);

    }
    public static void main(String[] args) {
        Main main = new Main();
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        //十进制转二进制
        main.Dex2Bin(n);
        Scanner sc1 = new Scanner(System.in);
        String str1 = sc1.nextLine();
        //十六进制转八进制
        main.Hex2Oct(str1);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章