题目描述
Given an integer, write an algorithm to convert it to hexadecimal. For negative integer, two’s complement method is used.
- All letters in hexadecimal (a-f) must be in lowercase.
- The hexadecimal string must not contain extra leading 0s. 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.
示例
Example 1:
Input:
26
Output:
“1a”
Example 2:
Input:
-1
Output:
“ffffffff”
限制条件
You must not use any method provided by the library which converts/formats the number to hex directly.
class Solution {
public:
string toHex(int num) {
string hexString = "";
string hexChar = "0123456789abcdef";
while (num) {
hexString = hexChar[num & 0xF] + hexString;
num =(unsigned) num >> 4;
}
return hexString.empty() ? "0" : hexString;
}
};
参考思路:
尽管题目说了负数是用了2补数,但是我们要知道(正数、负数在计算机中都是二进制补码形式储存的)数的二进制表示是不变的,比如-1,它的二进制表示就是32个1,或写成16进制的ffff ffff。因此,无论是正负数都可以直接进行操作,不用预处理(所以我的解法里的预处理多余了)。
处理的过程就是每次获取最低4位,将其对应的16进制表示添加到结果字符串的开头。关键的一点是,进行循环移位时,需要把数转为无符号数进行移位,因为右移操作符添加的值依赖于运算对象的类型,如果是无符号数,则添加0,否则添加符号位的副本或是0,根据具体环境而定。这里我们希望的是添加0,以便用于判断循环结束,所以进行了类型转换。