- 今天写一下二进制转换十六进制的程序,改良程序的过程
进制转换(以10转16为例)
首先想一下十六进制是多少个二进制位,4个。那么int是多少个字节?多少个二进制位?4个字节,32个二进制位
1
2
3
4
5
6
7
8
9public void toHex(int num){
int temp;
for (int i = 0;i<8 ;i++) {
temp = num & 15;
System.out.print(temp+" ");
num = num >>> 4;
}
}上图的结果是12 3 0 0 0 0 0 0,先来讲讲原理,再改良
1
2
3
4
5
6
7
8
9
10
11以 num = 60 为例
0000-0000 0000-0000 0000-0000 0011-1100
& 0000-0000 0000-0000 0000-0000 0000-1111
------------------------------------------
0000-0000 0000-0000 0000-0000 0000-1100
0000 0000-0000 0000-0000 0000-0000 0011 ( 1100 )
& 0000-0000 0000-0000 0000-0000 0000-1111
------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0011
结果分别是12 3 0 0 0 0 0 0先和15(4个低位都是1,其余是0)进行&运算,得到值后,再进行>>>3的运算。这样得到的结果还有12的存在,应该是英文字母的,继续改进
1
2
3
4
5
6
7
8
9
10
11public void toHex2(int num){
int temp;
for (int i = 0;i<8 ;i++) {
temp = num & 15;
if (temp>=10)
System.out.print((char)(temp-10+'A')+" ");
else
System.out.print(temp+" ");
num = num >>> 4;
}
}在中间的地方加了一个判断,使用了ASCII的知识,temp-10+’A’ 得到的不是字母,所以在前面还要加上char的强制转换
继续改进,现在这些数还是倒序,而且有许多无用位。
1
2
3
4
5
6
7
8
9
10
11
12
13
14public void toHex3(int num){
char[] chars = new char[]{'0','1','2','3','4','5',
'6','7','8','9','A','B','C','D','E','F'};
char[] arr = new char[8];
int point = arr.length - 1 ;
int temp;
while (num!=0){
temp = num & 15;
arr[point] = chars[temp];
num = num >>> 4;
point --;
}
System.out.print(arr);
}这里使用了数组的查表法,创建两个char的数组,第一个数组是用来将所获取到的0到15的数字转换为十六进制中的字符,第二个数组用来存储最后16进制的结果
- 在之前的两个程序中,最后输出的值都是反向的,于是我在这里创建了一个指针point,让他的初始值指向数组最后端的角标,每次输入进一个数后,指针前移一位,这样最后输出的时候直接输出数组就可以输出一个转换正确的16进制值。
进制转换整合
上面的的程序还只能对10->16转换,可以对其略作修改,使其可以灵活转换各种进制
1
2
3
4
5
6
7
8
9
10
11
12
13
14public char[] trans(int num,int base,int offse){
char[] chars = new char[]{'0','1','2','3','4','5',
'6','7','8','9','A','B','C','D','E','F'};
char[] arr = new char[32];
int point = arr.length - 1 ;
int temp;
while (num!=0){
temp = num & base;
arr[point] = chars[temp];
num = num >>> offse;
point --;
}
return arr;
}添加单独方法
1
2
3
4
5
6
7
8
9
10
11public char[] toBinary(int num){ //十进制转换二进制
return trans(num,1,1);
}
public char[] toHexa(int num){ //十进制转换十六进制
return trans(num,15,4);
}
public char[] toOctal(int num){ //十进制转换八进制
return trans(num,7,3);
}主类测试
1
2
3
4
5
6
7
8
9
10public class tranSystem {
public static void main(String[] args){
int num = 854796;
tranSystem tra = new tranSystem();
System.out.println(tra.toHexa(num));
System.out.println(tra.toOctal(num));
System.out.println(tra.toBinary(num));
}
//上面写的方法添加在这里
}Integer.toBinaryString()是java系统自带的转换二进制
查表法
- 查表法在日常学习中可以有很多应用,如输入数字,输出星期几等等