Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, two’s complement method is used.
Note:
- All letters in hexadecimal (
a-f
) must be in lowercase. - The hexadecimal string must not contain extra leading
0
s. If the number is zero, it is represented by a single zero character'0'
; otherwise, the first character in the hexadecimal string will not be the zero character. - The given number is guaranteed to fit within the range of a 32-bit signed integer.
- You must not use any method provided by the library which converts/formats the number to hex directly.
Example 1:
Input: 26 Output: "1a"
Example 2:
Input: -1 Output: "ffffffff"【问题分析】
对整数处理比较简单,采用逐次模16获取最低位的十六进制字符,同时将当前数字除以16,直到当前数字为0,
对于负数需要用补码形式表示,观察后发现其实可以讲负数转化为对应的正数,然后处理,会相对简单。
因此该题目的关键是对负数的处理,以补码形式打印,
对于n个二进制位的数字k,其补码为2^n + k,例如 对于4个二进制位的整数
-1的补码 16 - 1 = 7,1111
-2的补码 16 - 2 = 6, 1110
...
-14的补码 16 - 14 = 2,1010
-15的补码 16 - 16 = 1, 1001
-16的补码 16 - 16 = 0, 1000
观察后们可以发现,处理负数的关键有2点
1、最高位必须为1
2、-(2^n)的补码越界,需要特殊处理
【AC代码】
class Solution {
public:
string toHex(int num) {
std::string hex("0123456789abcdef");
std::string res;
if (num == 0)
{
res += '0';
return res;
}
unsigned tmp = 1 << 31;
if (num + tmp == 0) {
res += "80000000";
return res;
}
if (num < 0) {
unsigned tmp = 1 << 31;
num = tmp + num;
res = toHex(num);
std::string str(res, 0, 1);
int idx = (str[0] - '0') | (1 << 3);
res[0] = hex[idx];
return res;
}
while (num) {
int idx = num % 16;
res = hex[idx] + res;
num = num / 16;
}
return res;
}
};