題目描述
給定一個(gè)整數(shù)未斑,編寫一個(gè)算法將這個(gè)數(shù)轉(zhuǎn)換為十六進(jìn)制數(shù)牲蜀。對(duì)于負(fù)整數(shù)看蚜,我們通常使用 補(bǔ)碼運(yùn)算 方法检诗。
注意:
- 十六進(jìn)制中所有字母(
a-f
)都必須是小寫。 - 十六進(jìn)制字符串中不能包含多余的前導(dǎo)零恬偷。如果要轉(zhuǎn)化的數(shù)為0悍手,那么以單個(gè)字符
'0'
來表示;對(duì)于其他情況袍患,十六進(jìn)制字符串中的第一個(gè)字符將不會(huì)是0字符坦康。 - 給定的數(shù)確保在32位有符號(hào)整數(shù)范圍內(nèi)。
-
不能使用任何由庫提供的將數(shù)字直接轉(zhuǎn)換或格式化為十六進(jìn)制的方法诡延。
示例 1:
輸入:
26
輸出:
"1a"
示例 2:
輸入:
-1
輸出:
"ffffffff"
解題思路
首先要知道16進(jìn)制數(shù)在計(jì)算機(jī)中是怎么表示的滞欠,由于對(duì)于16進(jìn)制一個(gè)有16個(gè)數(shù)(0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f)所以我們只需要使用4位 2^4=16剛好可以表示16個(gè)數(shù),所以計(jì)算機(jī)在內(nèi)部是用4位來表示16進(jìn)制的0000表示0,0001表示1.....1111表示f肆良。
所以題目給我們一個(gè)int型的數(shù)字num,一個(gè)int= 4字節(jié) = 32位仑撞,這個(gè)32位數(shù)字可以被分隔成8個(gè)4位數(shù)赤兴,所以我們只需要從頭到尾每4位每4的的遍歷,每遍歷一個(gè)4位就將其轉(zhuǎn)化為16進(jìn)制的數(shù)即可隧哮。有人可能會(huì)問為什么這樣可以,其實(shí)這樣我們是做了兩個(gè)步驟座舍,先轉(zhuǎn)化為2進(jìn)制(由于計(jì)算機(jī)中所有東西本身就是2進(jìn)制存儲(chǔ)的沮翔,所以我們可以直接得到該數(shù)字的2進(jìn)制),再轉(zhuǎn)化為16進(jìn)制曲秉,比如對(duì)于26 ->二進(jìn)制為00011010(前面省略了24個(gè)0)所以每4位遍歷就變成了0001,1010對(duì)于0001 對(duì)應(yīng)16進(jìn)制中的1,1010對(duì)應(yīng)16進(jìn)制中的a所以結(jié)果就是為1a.所以對(duì)于此題我們只需要從尾部開始用位運(yùn)算取出每一個(gè)4位采蚀,再轉(zhuǎn)化為16進(jìn)制即可只需要注意前面為0的16進(jìn)制應(yīng)該刪除即可。
我們首先需要設(shè)一個(gè)數(shù)字calc = 0xf也就是右邊4位為1其余均為0承二,此時(shí)我們把數(shù)字num與之進(jìn)行與運(yùn)算就可以取出榆鼠,num右邊4位的值,然后再把calc向左邊移動(dòng)4位就變成了11110000(前面省略24個(gè)0)此時(shí)在與之相與就可以得到num中右邊8位的值亥鸠,此時(shí)還需要把這個(gè)值向右移動(dòng)4位妆够,因?yàn)檫@樣是的到了第2個(gè)4位值,然后再次重復(fù)此步驟即可负蚊。
代碼實(shí)現(xiàn)
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
class Solution {
public:
const char map[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8',
'9', 'a', 'b', 'c', 'd', 'e', 'f'};
string toHex(int num) {
if (num == 0) return "0";
string res;
unsigned int n = num;
unsigned int calc = 0xf;
unsigned int temp = 0xf;
int trans = 0;
for (int i = 0; i < 8; i++) {
temp = num&calc;
temp >>= trans;
res += map[temp];
calc <<= 4;
trans += 4;
}
for (int i = res.size()-1; i >= 0; i--) {
if (res[i] == '0') {
res.pop_back();
} else {
reverse(res.begin(), res.end());
return res;
}
}
return nullptr;
}
};