数字转化为16进制数

leetcode:https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/

思路1:

  1. 数组hash存储string hex=“0123456789abcdef”;
  2. 排除0
  3. 先考虑num大于0的数,实现非常简单
  4. 考虑num小于0的数,负数存储最高为1,且INT_MIN的绝对值等于INT_MAX+1,那么需要对INT_MIN做特殊处理;对其他负数存储用补码表示,那么INT_MAX+num+1即为数字该负数位上的值,最高位为1
class Solution {
public:
    string toHex(int num) {
        string HEX ="0123456789abcdef";
        if (num == 0) {
            return "0";
        }
        bool neg = false;
        if (num < 0) {
            num = INT_MAX + num +1;
            neg = true;
        }
        if (num == 0) {
            return "80000000";
        }
        string res;
        while (num > 0) {
            int k = num%16;
            num = num/16;
            
            if (num == 0 && neg) { // 负数最高为做处理
                k += 8;
            }
            res.insert(0, 1, HEX[k]);
        }
       
        return res;
    }
};

其他思路:
1.不管num是正数还是负数,存储状态由计算机决定,负数以补码形式存储,排除存储形式干扰
2.16进制数,num数字以二进制方式存储,4位为一个16进制位,位移解决每个16进制数字
3.有符号数算数右移,正数右移超出值32次时,结果为0,负数超过则为-1,所以必须确定停止位移的条件!!!

string toHex(int num) {
    if (num == 0) {
    	return "0";
    }
	string hex = "0123456789abcdef";
	string res;
	while (num && res.size() < 8) { // num 不为0且res.size()小于8
	    res = hex[num&0xf] + res;
		num >>= 4; // 负数算数右移超过int类型大小后,num结果为0xffffffff,即-1
	}
	return res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值