1. 程式人生 > >Leetcode:405.數字轉換為16進位制數

Leetcode:405.數字轉換為16進位制數

給定一個整數,編寫一個演算法將這個數轉換為十六進位制數。對於負整數,我們通常使用 補碼運算 方法。

注意:

  1. 十六進位制中所有字母(a-f)都必須是小寫。
  2. 十六進位制字串中不能包含多餘的前導零。如果要轉化的數為0,那麼以單個字元'0'來表示;對於其他情況,十六進位制字串中的第一個字元將不會是0字元。 
  3. 給定的數確保在32位有符號整數範圍內。
  4. 不能使用任何由庫提供的將數字直接轉換或格式化為十六進位制的方法。

示例 1:

輸入:
26

輸出:
"1a"

示例 2:

輸入:
-1

輸出:
"ffffffff"

解題思路:

位運算。將數字轉成二進位制,然後每4位轉成對應的16進位制即可。本題比較容易,但是對於剛剛接觸位運算的新手而言,有幾個點需要注意:

  1. 正數,負數,0的二進位制轉換是可以統一的,不要被題目所幹擾,都可以轉成32位的二進位制數字,儲存在int[32]陣列中,操作如下。
  2.  

     

    //以下將num轉換成32位的二進位制數

    int bin[32] = { 0 };

    int i;
            for (i = 1; i <= 32; i++) {
                bin[32 - i] = (num & 1);
                num >>= 1;
            }

     

    4位二進位制轉16進位制時,最好用位運算,這樣效率高。位運算的運算優先順序小於+號,因此需要加上括號。

  3. 4位二進位制轉16進位制
    int bin_to_16(int a, int b, int c, int d) {
            return (a << 3) + (b << 2) + (c << 1) + d;
        }

    另外題目要求16進制中的'a'-'f'都是小寫。

C++程式碼
class Solution {
public:
    string toHex(int num) {
        int bin[32] = { 0 };
        string data16;
        int i;
        for (i = 1; i <= 32; i++) {
            bin[32 - i] = (num & 1);
            num >>= 1;
        }
        for (i = 1; i <= 8; i++) {
            int sgn = bin_to_16(bin[4 * (i - 1)], bin[4 * (i - 1) + 1], 
                bin[4 * (i - 1) + 2], bin[4 * (i - 1) + 3]);
            if(!(data16.empty()&&sgn==0))data16 += data[sgn];
        }
        if (data16.empty()) return "0";
        return data16;
    }
    int bin_to_16(int a, int b, int c, int d) {
        return (a << 3) + (b << 2) + (c << 1) + d;
    }
    string data[16] = {
        "0","1","2","3","4","5","6","7","8","9","a","b","c","d","e","f"
    };
};