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其中一个,在对这些数字表示的十进制数值进行运算操作。
得到十六进制转换的十进制数字之后,对这个数字进行上面已经完成的十进制转八进制的运算,只要传入数字即可获得答案。
总结
算法特点,利用栈的特点解决进制转换很方便转换出来的二进制没有前缀00...贴完整代码:
样例输入:先输入十进制转换二进制的十进制数字:比如15
转换完成之后输入一个16进制字符,转换为8进制
import java.util.Scanner;import java.util.Stack;/*** Page Description:* User: Yelihu* Date: -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);}}