1. 程式人生 > >隨筆-數字(任意進位制)轉換為十六進位制數

隨筆-數字(任意進位制)轉換為十六進位制數

題目:

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

注意:

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

輸入:
26

輸出:
“1a”
示例 2:

輸入:
-1

輸出:
“ffffffff”

思路:題幹要求返回為int 那麼最多有8個16進位制;16進制中,四個二進位制數表示一位16進位制; 每次取餘16得到的就是二進位制最低四位的值,再將其轉換為16進位制即可;然後無符號右移四位再取最低四位,直到num==0; 對於負數的處理,只需要在第一次取餘時左移一位,然後在無符號右移一位,兩步處理掉符號位,取餘得到的就是原本負數的二進位制最低四位的值;

class Solution {
    public String toHex(int num) {
        if(num==0){ 
            return "0";
        }
        int i=8; //int 型別八個16進位制數
        String s="";
        int n;
        while(i>0){
            if(num==0){ //處理掉高位的0;
                break;
            }
            if(num<0){
              int tmp=num;
              tmp=(tmp<<1)>>>1;  //先左移處理掉負號,在右移取最低四位就是num最低四位對應的二進位制數;
              n=tmp%16;  
            }else{
              n=num%16;  
            }
            num=num>>>4;
            if(n<=9){
              s=n+s; 
            }else{
              n='a'+n-10; //得到對應的unicode值;
              s=(char)n+s;   
            }
            i--;
        }
        return s;
    }
}