这几天在复习C语言的数据结构栈和队列那一章的时候,看到利用栈的特性FILO实现的进制转换十分简洁
想起了java中实现栈的操作十分方便(不用自己写.h文件,内部util.Stack包已经封装好)
所以用这个来写一个进制转换作为记录
public void Dex2Bin(int n){
int x;
Stack 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的时候,不断的:
这样就完成了对一个数字进制转换的过程。
输出的时候只要对stack不断的pop即可
public void Dex2Oct(int n){
int x;
Stack 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’:
得到十六进制转换的十进制数字之后,对这个数字进行上面已经完成的十进制转八进制的运算,只要传入数字即可获得答案。
样例输入:先输入十进制转换二进制的十进制数字:比如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 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 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);
}
}