- 今天写一下二进制转换十六进制的程序,改良程序的过程进制转换(以10转16为例)
- 首先想一下十六进制是多少个二进制位,4个。那么int是多少个字节?多少个二进制位?4个字节,32个二进制位 - 1 
 2
 3
 4
 5
 6
 7
 8
 9- public 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
 11- public 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
 14- public 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
 14- public 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
 11- public 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
 10- public 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系统自带的转换二进制 
查表法
- 查表法在日常学习中可以有很多应用,如输入数字,输出星期几等等