十进制转十六进制,Java代码示例与转换思路

官方库

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();
}

你可能感兴趣的:(Java,java,算法,leetcode)