leetcode405. 数字转换为十六进制数(位运算)

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

题目

给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。

注意:

十六进制中所有字母(a-f)都必须是小写。
十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。 
给定的数确保在32位有符号整数范围内。
不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。

用例

示例 1:

输入:
26

输出:
"1a"

示例 2:

输入:
-1

输出:
"ffffffff"

思路

方法1 模拟
数字不断除16 注意负数使用补码存储(有符号数)所以可以在原数字的基础上加上2^32转化负数

class Solution {
public:
    string toHex(int num) {
        string dic="0123456789abcdef";
        if(num ==0)
        return "0";
        long long n=num;//注意2^32超出interesting范围
2
        string ans;
        if(n<0)
        {
            n=pow(2,32)+n;
        }
        while(n)
        {
            ans+=dic[n%16];
            n/=16;
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

方法2位运算
十六进制即为二进制取四位转

class Solution {
public:
    string toHex(int num) {
        if(num==0)
            return "0";
        string ans;
        for(int i=7;i>=0;i--)
        {
            int val=(num>>(4*i))&0xf;//去除高位上的影响 只取最右边四位的值
            if(ans.length()>0||val>0)
            {
                char digit=val<10?(char)('0'+val):char('a'+val-10);
                ans.push_back(digit);
            }
        }
        return ans;
    }
};
posted @ 2021-10-02 17:23  kitamu  阅读(48)  评论(0)    收藏  举报
Live2D