# 题目: 405. 数字转换为十六进制数

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

注意:

  • 十六进制中所有字母(a-f)都必须是小写。
  • 十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
  • 给定的数确保在32位有符号整数范围内。
  • 不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

# 示例1:

输入:
26

输出:
"1a"

# 示例2:

输入:
-1

输出:
"ffffffff"

# 题解: 分组

一个16进制的数,可以对应一个4位的二进制。

那么32位的二进制数,就可以生成8位的16进制。因为存在负数,所以从最高位,也就是第7组进行运算:

对于 i 组:

得到该组的值, 然后对每一组换算成 16进制的值

  • 0~9, 数字本身就是16进制数
  • 10~15,将其转换为a为f中对应的字母

# 代码

var toHex = function(num) {
    if(num ===0 ) return '0'
    const sb = []
    const char = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f']
    let onceFlag = true
    for(let i=7;i>=0;i--){
        // 分组的值
        const value = (num>>(i*4)) & 0xf
        // 前导零
        if(onceFlag && value === 0) continue
        onceFlag = false
        sb.push(char[value])
    }
    return sb.join('')
};

# 参考资料