仿照Java的Integer.toHexString()实现十进制转换十六进制

//An highlighted block
import java.util.Scanner;

public class Decimal2HexConversion {
    private static int shift = 4;
    public static void main(String[] args){
        System.out.println("输入一个整数:");
        Scanner input = new Scanner(System.in);
        int num = input.nextInt();
        String result = toHexString(num,shift);
        System.out.print("转换为十六进制:"+result);
    }

    public static final int SIZE =32;//int型有32位

    public static String toHexString(int val,int shift){
        int mag = SIZE - numberOfLeadingZeros(val);//计算val二进制表示有多少位非零
        //根据非零位的个数计算十六进制需要几位,例如5位二进制转换为2位十六进制
        int chars = Integer.max((mag+(shift - 1)) / shift,1);
        char[] buf = new char[chars];//为十六进制数提供存储数组
        formatUnsignedInt(val,buf,shift,chars);
        return new String(buf);
    }

    /**
    * 计算二进制位中开头有多少位是全零
    */
    public static int numberOfLeadingZeros(int i){
        if (i == 0){
            return 32;
        }
        int n = 1;
        //判断前16位是否都为零,为零则将后16提前到前16
        if (i >>> 16 == 0) { n += 16; i <<= 16; }
        //判断非零部分前面8位是否为零,为零则将非零部分后8位提前8位
        if (i >>> 24 == 0) { n += 8; i <<= 8; }
        //同理判断新非零部分前4位是否为零,为零则将非零部分后4位提前4位
        if (i >>> 28 == 0) { n += 4; i <<= 4;}
        //同理判断新非零部分前2位是否为零,为零则将非零部分后42位提前42位
        if (i >>> 30 == 0) { n += 2; i <<= 2;}
        n -= i >>> 31;//判断最后非零的2位,前一位是否非零,为零则不减,不为零则是1,n抵消初始值1
        return  n;
    }

    /**
     * 对二进制数每个四位转换成十六进制字符
     */
    public static int formatUnsignedInt(int val,char[] buf,int shift,int len){
        int charPos = len;//十六进制数的长度
        int radix = 1 << shift;
        int mask = radix -1;//产生二进制数1111进行异或
        do {
            buf[--charPos] = digitslist[val & mask];
            val >>>= shift;
        } while (val != 0 && charPos > 0);
        return charPos;
    }

    private static char[] digitslist = {
            '0' , '1' , '2' , '3' , '4' , '5' ,
            '6' , '7' , '8' , '9' , 'a' , 'b' ,
            'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
            'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
            'o' , 'p' , 'q' , 'r' , 's' , 't' ,
            'u' , 'v' , 'w' , 'x' , 'y' , 'z'
    };
}

通过修改变量shift,还可将该程序改为十进制转换二进制、四进制、八进制

你可能感兴趣的:(仿照Java的Integer.toHexString()实现十进制转换十六进制)