Java实现进制转换

598 阅读2分钟

16进制转换10、2进制的计算方法

概念

十六进制转换成十进制的方法:首先确定一个十六进制数;然后计算出第0位以及第1位的权值;接着在第N位上,表示大小为“X * 16”的N次方;最后通过竖式计算出转换结果即可。

十六进制转十进制

16进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方…… 所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。

例:2AF5换算成10进制:
用竖式计算:
第0位: 5 * 16^0 = 5
第1位: F * 16^1 = 240
第2位: A * 16^2= 2560
第3位: 2 * 16^3 = 8192

直接计算就是: 5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997

十六进制转二进制

由于在二进制的表示方法中,每四位所表示的数的最大值对应16进制的15,即16进制每一位上最大值,所以,我们可以得出简便的转换方法,将16进制上每一位分别对应二进制上四位进行转换,即得所求:

例:2AF5换算成2进制:
第0位: (5)16 = (0101) 2
第1位: (F)16 = (1111) 2
第2位: (A) 16 = (1010) 2
第3位: (2) 16 = (0010) 2

得:(2AF5)16=(0010.1010.1111.0101)2

在线转换工具

开发过程中可以使用一下在线转换工具:进制转换

Java中十六进制转十进制

可以使用Integer类的parseInt()方法直接转换,也可以自己写一个转换函数。

1、Integer.parseInt()

十六进制转十进制,简单的方法就是使用Integer.parseInt()方法进制转换,一步到位。

不带0x的16进制

如果输入的是不带0x表示的十六进制数,直接转换即可。

String str = "1A";
int x=Integer.parseInt(str,16);
System.out.println(x);

结果:

26

带有0x标识的16进制

带有0x标识的十六进制数,需要截去前面两位标识。

String str = "0x1A"; 
int x=Integer.parseInt(str.substring(2),16); 
System.out.println(x);

结果:

26

hexToDecimal

稍复杂的方法是自己写一个转换函数。使用一个HashMap把“0-9,A-F”与“0-15”的key-value一一存储起来,然后把读取的十六进制数按位存储,然后再使用数据计算16转10的方式计算。

public static int convertNum(String str){

    String[] c={"A","B","C","D","E","F"};
    HashMap<String,Integer> hashmap= new HashMap<>();
    for(int i=0; i<=9;i++){
        hashmap.put(i+"",i);
    }
    for(int j=10;j<=15;j++){
        hashmap.put(c[j-10],j);
    }
        
    String[] st=new String[str.length()];
    for(int i=0;i<=str.length()-1;i++){
        st[i]=str.substring(i,i+1);
    }
    
    
    int num=0;
    for(int i=2;i<=st.length-1;i++){
        //这里需要注意,如果输入是类似"1A"没有标识的16进制数,i的值从0开始
        //如果是"0x1A"这样有标识符的16进制,则在计算时,需要截掉0x这两位标识,i从2开始
        num += hashmap.get(st[i]) * Math.pow(16,st.length-1-i);
    }
    
    return num;
}

注意:在计算时,如果输入的16进制数包含小写,使用toUpperCase()转换成统一的大写字母计算即可。

最后,十进制转二进制,八进制,十六进制,可以直接使用Integer类提供的方法直接转换,分别是toBinaryString(),toOctalString(),toHexString()方法。