友情支持

如果您觉得这个笔记对您有所帮助,看在D瓜哥码这么多字的辛苦上,请友情支持一下,D瓜哥感激不尽,😜

支付宝

微信

有些打赏的朋友希望可以加个好友,欢迎关注D 瓜哥的微信公众号,这样就可以通过公众号的回复直接给我发信息。

wx jikerizhi

公众号的微信号是: jikerizhi因为众所周知的原因,有时图片加载不出来。 如果图片加载不出来可以直接通过搜索微信号来查找我的公众号。

405. 数字转换为十六进制数

给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

答案字符串中的所有字母都应该是小写字符,并且除了 0 本身之外,答案中不应该有任何前置零。

注意: 不允许使用任何由库提供的将数字直接转换或格式化为十六进制的方法来解决这个问题。

示例 1:

输入:num = 26
输出:"1a"

示例 2:

输入:num = -1
输出:"ffffffff"

提示:

  • -231 <= num <= 231 - 1

思路分析

位运算!可以直接转换成十六进制,不需要从二进制绕一下。

  • 一刷

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
/**
 * @author D瓜哥 · https://www.diguage.com
 * @since 2025-08-03 21:17:55
 */
public String toHex(int num) {
  int[] bits = getBits(num);
  Map<Integer, Character> map = Map.of(
    10, 'a',
    11, 'b',
    12, 'c',
    13, 'd',
    14, 'e',
    15, 'f');
  StringBuilder sb = new StringBuilder();
  int len = bits.length;
  for (int i = 0; i < len; i += 4) {
    int hexNum = bits[i]
      + (i + 1 < len ? bits[i + 1] * 2 : 0)
      + (i + 2 < len ? bits[i + 2] * 4 : 0)
      + (i + 3 < len ? bits[i + 3] * 8 : 0);
    if (hexNum < 10) {
      sb.append(hexNum);
    } else {
      sb.append(map.get(hexNum));
    }
  }
  return sb.reverse().toString();
}

private int[] getBits(int pos) {
  if (pos == 0) {
    return new int[]{0};
  }

  List<Integer> bits = new ArrayList<>();
  while (pos != 0) {
    bits.add(pos & 1);
    pos >>>= 1;
  }
  return bits.stream().mapToInt(Integer::intValue).toArray();
}