mirror of
https://github.com/ShusenTang/LeetCode.git
synced 2024-09-02 14:20:01 +00:00
54 lines
1.6 KiB
Markdown
54 lines
1.6 KiB
Markdown
# [405. Convert a Number to Hexadecimal](https://leetcode.com/problems/convert-a-number-to-hexadecimal/description/)
|
||
# 思路
|
||
将用补码(2's complement)表示的数转换成16进制数。
|
||
## 思路一
|
||
进制转换常规思路。
|
||
首先将补码表示的数看做是无符号的数,然后再用常规的不断除以16的方法转换进制。
|
||
例如将十进制数25转换成16进制:
|
||
> 25 / 16 = 1···9
|
||
> 1 / 16 = 0···1
|
||
> 所以结果就是19
|
||
## 思路二
|
||
由于2进制转16进制刚好是4位为一组,所以可考虑从低位起不断获取num的四位bit再将其转换成16进制。
|
||
例如将十进制数25转换成16进制:
|
||
> 25的32位二进制表示为`000..0011001`, 最低四位`1001`的16进制表示为9,次第四位`0001`的16进制表示为1,再高位就全是0了,所以结果就是19.
|
||
|
||
获得num的低四位可以通过num和mask`0x0000000f`进行按位与操作实现。
|
||
|
||
# C++
|
||
## 思路一
|
||
``` C++
|
||
class Solution {
|
||
public:
|
||
string toHex(int num) {
|
||
if(num == 0) return "0";
|
||
string mp = "0123456789abcdef";
|
||
string res;
|
||
unsigned n = (unsigned)num;
|
||
while(n > 0){
|
||
res += mp[n % 16];
|
||
n /= 16;
|
||
}
|
||
reverse(res.begin(), res.end());
|
||
return res;
|
||
}
|
||
};
|
||
```
|
||
## 思路二
|
||
``` c++
|
||
class Solution {
|
||
public:
|
||
string toHex(int num) {
|
||
if(num == 0) return "0";
|
||
string mp = "0123456789abcdef";
|
||
string res;
|
||
while(num != 0){
|
||
res += mp[0x0000000f & num];
|
||
num >>= 4;
|
||
}
|
||
reverse(res.begin(), res.end());
|
||
return res;
|
||
}
|
||
};
|
||
```
|