进制转换

  • 今天写一下二进制转换十六进制的程序,改良程序的过程

    进制转换(以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系统自带的转换二进制

查表法

  • 查表法在日常学习中可以有很多应用,如输入数字,输出星期几等等