405. Convert a Number to Hexadecimal

这里写图片描述
第一种方法,按照正负数来转换成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;   
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值