1. 程式人生 > 其它 >leetcode405. 數字轉換為十六進位制數(位運算)

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;
    }
};