//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,还可将该程序改为十进制转换二进制、四进制、八进制