十六进制转换八进制
运用位运算跟N(=2的n次方)进制占用的位数进行转换,其思想也可以适用于十六进制转换四进制(假如有需要的话)、二进制,还可以用来将八进制转换成十六、四、二进制,或者反向转换,思想都是相同的,上代码先。
package LQBPaper.Part02.Problem06;
/**
* 十六进制转十进制
* 1、获得输入的十六进制数字;
* 2、将获得的十六进制数字字符串转换成字符数组numsChar;
* 3、将numsChar字符数组中每一位十六进制数字转换成十进制数字,存进numsInt数组中
* 4、运用进制转换的算法,将所有位数的十六进制最终转换成十进制数字
*/
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int count = scanner.nextInt();// 获取一个数字,用于确定需要转换的十六进制数的个数
String[] results = new String[count];// 实例一个用于承接转换后八进制数的数组(或许直接用String数组承接更加好,在GetResult方法中,就不必对结果进行转换,节约资源)
for (int i = 0; i < results.length; i++) {
results[i] = GetResult(scanner.next());// 获得转换后的结果
}
for (int i = 0; i < results.length; i++) {
System.out.println(results[i]);
}
}
/**
* 获取转换后的数字
*
* @param sourceNumber
* 需要转换的源数字
* @return 返回转换后的数字,为一个字符串
*/
public static String GetResult(String sourceNumber) {
char[] nums = sourceNumber.toCharArray();
byte[] numsByte = ChangeNumArr(nums);
ArrayList<Byte> numsArr = new ArrayList<>();
List<String> resultCell = new LinkedList<>();
for (int i = numsByte.length - 1; i >= 0; i--) {
numsArr.add(0, numsByte[i]);
if (numsArr.size() == 3 || i == 0) {
String tempResult = GetResultCell(numsArr.toArray(new Byte[0]));
resultCell.add(0, tempResult);
numsArr.clear();
}
}
String result = "";
for (int i = 0; i < resultCell.size(); i++) {
result = result + resultCell.get(i) + "";
}
int count =0;
for (int i = 0; i < 4; i++) {
if (result.charAt(i)!='0') {
break;
}
count++;
}
return String.copyValueOf(result.toCharArray(),count,result.length()-count);
}
/**
* 将需要转换的十六进制的数字每三位分解成一组byte数组,进行转换
* 该部分运用的是位的运算,十六进制是每四位进1(即1111→F【即15】,再加一则进一变成10【即16】),而八进制则是每三位进1(即111→7,再加一则进一变成10),因此,可以先将十六进制数转换成
* 二进制数,这里则是直接用位运算即可进行操作,计算机会自动将其转换成二进制数
* @param bytes
* 已经分解开来的十六进制数组,目前是每3位十六进制转换成最多4位8进制的数字,byte数组的数字不能超过15,否则会溢出,这里不做异常的产生与处理
* @return 返回已经转换好的8进制数字
*/
public static String GetResultCell(Byte... bytes) {
int tempCell = 0;
String cell = "";
for (int i = 0; i < bytes.length; i++) {
tempCell = tempCell << 4;//将3个十进制数byte压进int中,方便进行二进制数转换成八进制数。(为什么是3?因为3与4的最小公约数为123位16进制的数刚好是12个位,刚好可以转换成4位8进制数)
tempCell = tempCell ^ bytes[i];
}
for (int i = 0; i < 4; i++) {
cell = (tempCell & 7) + cell;
tempCell = tempCell >> 3;
}
return cell;
}
/**
* 将number的char数组转换成byte数组
* @param nums 需要转换的字符数字的数组
* @return 返回转换好的byte数字的数组
*/
public static byte[] ChangeNumArr(char[] nums) {
byte[] numsByte = new byte[nums.length];
for (int i = 0; i < numsByte.length; i++) {
numsByte[i] = SwitchCharToByte(nums[i]);
}
return numsByte;
}
/**
* 将字符数字转换成byte,例如:'1'→1,'2'→2
* @param ch 需要转换的字符数字
* @return 返回转换好的byte数字
*/
public static byte SwitchCharToByte(char ch) {
switch (ch) {
case '1':
return 1;
case '2':
return 2;
case '3':
return 3;
case '4':
return 4;
case '5':
return 5;
case '6':
return 6;
case '7':
return 7;
case '8':
return 8;
case '9':
return 9;
case 'A':
return 10;
case 'B':
return 11;
case 'C':
return 12;
case 'D':
return 13;
case 'E':
return 14;
case 'F':
return 15;
}
return 0;
}
}
第一次写,如果有不对的,或者有更好的方法的欢迎来指正,谢谢,不喜勿喷,我是菜鸟……夜已深,晚安,各位好梦。
如果是要用的话,最好还是用这个博主使用的Java内置的转换方法:http://my.oschina.net/thinkerfan/blog/96102,更加方便……