1. 程式人生 > 其它 >Qt 實現塗鴉板一:簡易塗鴉板

Qt 實現塗鴉板一:簡易塗鴉板

問題描述:

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

解法1:

輾轉相除法 (補碼即原數加上2^32)

思路:輾轉相除16 ,最後翻轉,這是二進位制轉換的常規演算法

程式碼:

public String toHex(int num) {
if(num==0) return "0";
long num_l = num;
StringBuilder sb = new StringBuilder();
if(num_l<0) num_l = (long)(Math.pow(2,32)+num_l);
while (num_l!=0){
long u =num_l%16;
char c = (char)(u+'0');
if(u>=10) c=(char)(u-10+'a');
sb.append(c);
num_l/=16;
}
return sb.reverse().toString();
}

解法2:分組加位運算 四位一位

思路: 將長度為 323232 的二進位制轉換為 161616 進位制數,本質是對長度為 323232 的二進位制數進行分組,每 444 個一組(二進位制 (1111)2(1111)_2(1111)2​ 表示 151515,則使用長度為 444 的二進位制可以表示 0-15)。
同時,由於我們是直接對長度為 323232 的二進位制進行分組轉算(444 個為一組,共 888 組),而長度為 323232 的二進位制本身就是使用補碼規則來表示的,因此我們無須額外處理「補碼」問題。
具體的,我們將 numnumnum 與 151515 = (1111)2(1111)_2(1111)2​ 進行 & 運算,然後對 numnumnum 進行無符號右移 444 位來實現每 444 位處理。
題解連結:https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/solution/gong-shui-san-xie-yi-ti-shuang-jie-jin-z-d93o/

程式碼實現:

public String toHex2(int num) {
if(num==0) return "0";
StringBuilder sb = new StringBuilder();
while (num!=0){
long u =num&15;
char c = (char)(u+'0');
if(u>=10) c=(char)(u-10+'a');
sb.append(c);
num>>>=4;
}
return sb.reverse().toString();
}