官方库
Integer.toHexString(158)
自己实现
思路
大多数情况下用官方库就行了,自己实现主要是为了学习计算机基础知识和提高写代码的能力。
十六进制用数字0、1、2、3、4、5、6、7、8、9和字母A、B、C、D、E、F(a、b、c、d、e、f)表示,其中A ~ F对应十进制的10 ~ 15。
二进制数字占一个比特位,十六进制数字占四个比特位。
假设现在有一个十进制数158(int,四字节),它的二进制表示形式如下所示:
0000 0000 0000 0000 0000 0000 1001 1110
如何将它转换成十六进制的形式?只需要每次取四个比特位然后逐个转换成十六进制数就行。那么问题来了,如何每次取四个比特位,这里用到&运算符,任何数&上15都能取到它的低四位,15的二进制表示形式如下:
0000 0000 0000 0000 0000 0000 0000 1111
158 & 15 :
0000 0000 0000 0000 0000 0000 1001 1110 &
0000 0000 0000 0000 0000 0000 0000 1111 =
0000 0000 0000 0000 0000 0000 0000 1110
1110对应十进制的14,对应16进制的E。
将158右移四个比特位后变成:
0000 0000 0000 0000 0000 0000 0000 1001
然后再&上15:
0000 0000 0000 0000 0000 0000 0000 1001 &
0000 0000 0000 0000 0000 0000 0000 1111 =
0000 0000 0000 0000 0000 0000 0000 1001
1001对应十进制的9,十六进制也是9。
接下来一直重复上面的步骤,直到取完了所有比特位,我们已经知道了后面取到的都是0,所以158用十六进制表示就是0000009e,十六进制一般会在前面加上0x作为标识,于是变成0x0000009e,通常我们都会省略高位的0,简写成0x9e,甚至有时候连0x也不要,直接变成9e。
代码示例
public static String toHexStr(int n) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 8; i++) { // 4字节是32个比特位,4个一取,要取8次
int t = n & 15; // 取低四位
if (t > 9) { // 需要用字母表示
// char会转换成int参与运算,运算完再强制转换成char
// 假如t=14, 14-10=4, A在ASCII码表中等于65, 65+4=69, 69再转成char等于E
// 如果用小写字母表示, 就用a替换A
char c = (char) (t - 10 + 'A');
sb.insert(0, c);
} else { // 用数字表示
String c = t + "";
sb.insert(0, c);
}
n = n >>> 4; // 右移四位
if (n == 0) // 后面都是0了, 在忽略高位的0的情况下可以提前结束
break;
}
sb.insert(0, "0x"); // 补上十六进制的标识符, 也可以省略
return sb.toString();
}