https://leetcode.com/problems/convert-a-number-to-hexadecimal/
这题我们可以通过两个思路进行开展。
很明显是已二进制的形式存储的,那么不管我们输入的是正数还是负数,其实计算机内部已经有了完整的存储,那么其实不需要我们自己再去计算反码补码,我们只需要对其进行2进制转换成16进制就可以了。
2.了解计算机在存储数的机制
M: https://leetcode.com/problems/maximum-product-of-word-lengths
H: https://leetcode.com/problems/minimum-unique-word-abbreviation
题目描述
给出一个整型(int)的数,将其转换为十六进制的表示方法,负数要用二进制补码的形式表示样例
Example 1:Input: 26 Output: "1a"Example 2:
Input: -1 Output: "ffffffff"
解题思路分析
首先,如果这个数是个正数的话,那么非常简单,所以这题的关键就在于负数的情况。这题我们可以通过两个思路进行开展。
1.负数的二进制补码表示
很多人都是知道负数在计算机内部的存储方式是补码的形式,也知道负数的补码就等于其反码+1。举个例子,如果我们使用的是4位的二进制,那么2的表示形式就是0010,2的反码表示形式就是1101,所以-2的表示形式就是其反码+1,是1110,转换成16进制也是同样的道理。所以我们这种思路的做法就是16进制表示形式,然后再对其进行取反,最后再+1得到我们的答案。参考程序
class Solution {
public:
string toHex(int num) {
if(num == 0) return "0";
int bit[10];
memset(bit,0,sizeof(bit));
int len = 0;
long long n = num;
n = abs(n);
string ans = "";
while(n)
{
bit[len++] = n % 16;
n /= 16;
}
if(num < 0)
{
for(int i=0; i<8; i++)
{
bit[i] = 15 - bit[i];
}
int pos = 0;
while(bit[pos] == 15)
{
bit[pos] = 0;
pos++;
}
bit[pos]++;
}
int leader0 = 1;
for(int i=7; i>=0; i--)
{
if(bit[i] != 0) leader0 = 0;
if(leader0 == 1) continue;
if(bit[i] < 10) ans += (char)('0' + bit[i]);
else ans += (char)('a' + bit[i] - 10);
}
return ans;
}
};
2.计算机内部存储形式转换
一个整型的数,在计算机内部是怎么存储的呢?很明显是已二进制的形式存储的,那么不管我们输入的是正数还是负数,其实计算机内部已经有了完整的存储,那么其实不需要我们自己再去计算反码补码,我们只需要对其进行2进制转换成16进制就可以了。
参考程序
class Solution {
public:
string toHex(int num) {
if(num == 0)
{
return "0";
}
int len = 0;
string ans = "";
while(num && len < 8)
{
int bit = num & 15;
if(bit < 10) ans = (char)('0' + bit) + ans;
else ans = (char)('a' + bit - 10) + ans;
num >>= 4;
len++;
}
return ans;
}
};
要点突出(需要理解并掌握)
1.需要理解负数在计算机中的存储形式,以及掌握补码的转换方法。2.了解计算机在存储数的机制
相关题目
E: https://leetcode.com/problems/single-numberM: https://leetcode.com/problems/maximum-product-of-word-lengths
H: https://leetcode.com/problems/minimum-unique-word-abbreviation