第一种方法,按照正负数来转换成16进制数,负数的时候很麻烦,先转化成二进制补码,然后转化成16进制
class Solution {
public:
string toHex(int num)
{
string s;
char temp;
if(0==num)
return "0";
else if(num>0)
{
while(num>0)
{
temp=num%16;
if(temp<10)
temp=temp+'0';
else
temp=temp-10+'a';
s=s+temp;
num=num/16;
}
reverse(s.begin(),s.end());
}
else
{
vector<int> number;
num=-num;
while(num>0)
{
int x;
x=num%2;
number.push_back(x);
num=num/2;
}
while(number.size()<31)//补零
number.push_back(0);
int i;
for(i=0;i<31;i++)//取反
number[i]=!number[i];
i=0;
int carry=(number[0]+1)/2;
number[0]=(number[0]+1)%2;
while(carry!=0)//加1求补码
{
i++;
carry=(number[i]+1)/2;
number[i]=(number[i]+1)%2;
}
if(number.size()<32)//符号位为1
number.push_back(1);
int sum=0;
for(i=7;i>=0;i--)//每四位转化成16进制
{
sum=sum+number[4*i+3]*8+number[4*i+2]*4+number[4*i+1]*2+number[4*i];
if(sum<10)
temp=sum+'0';
else
temp=sum-10+'a';
s=s+temp;
sum=0;
}
}
return s;
}
};
第二种方法:将数强制转化成无符号整形,不管是整数还是负数都是它们补码表示后的数。
例如:-1的补码表示为1111 1111 1111 1111 1111 1111 1111 1111,等于2^32-1。在强转为unsigned int时,就变成了4294967295,在对它和正整数一样进行转换。
class Solution {
public:
string toHex(int num)
{
unsigned temp=num;
string res;
while (temp)
{
int remain = temp % 16;
char c = remain < 10 ? remain + '0' : 'a' + remain - 10;
res = res + c;
temp /= 16;
}
reverse(res.begin(), res.end());
return res.empty() ? "0" : res;
}
};