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: 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);
}
}