自己寫的,先整數轉二進位制,再切片二進位制轉16進位制
class Solution: def toHex(self, num: int) -> str: # 處理特殊情況:當 num 為 0 時,直接返回 '0' if num == 0: return '0' # 定義十六進位制字母的對映關係 my_dict = {10:'a', 11:'b', 12:'c', 13:'d', 14:'e', 15:'f'} res = '' # 初始化結果字串 if num >= 0: # 處理非負數的情況 # 將整數轉換為對應的二進位制字串 bia_temp = self.posnumTobi(num) i = 0 # 每次處理四位二進位制數,共八組 while i < 8: bia_internal = bia_temp[4*i : 4*(i+1)] # 切片操作提取四位二進位制數 i += 1 # 將四位二進位制數轉換為十進位制數 deci_internal = self.biToDecimal(bia_internal) # 如果十進位制數小於等於9,則直接將其加入結果字串中 if deci_internal <= 9: res = res + str(deci_internal) # 否則,使用對映關係獲取十六進位制字母,並加入結果字串中 else: res = res + my_dict[deci_internal] elif num < 0: # 處理負數的情況 # 將負數轉換為對應的補碼錶示的二進位制字串 bia_temp = self.negnumTobi(num) i = 0 while i < 8: bia_internal = bia_temp[4 * i : 4 * (i + 1)] # 切片操作提取四位二進位制數 i += 1 # 將四位二進位制數轉換為十進位制數 deci_internal = self.biToDecimal(bia_internal) # 如果十進位制數小於等於9,則直接將其加入結果字串中 if deci_internal <= 9: res = res + str(deci_internal) # 否則,使用對映關係獲取十六進位制字母,並加入結果字串中 else: res = res + my_dict[deci_internal] # 刪除結果字串前面多餘的零 res = res.lstrip('0') return res # 將非負整數轉換為32位的二進位制字串 def posnumTobi(self, num): binary = "" while num > 0: binary = str(num % 2) + binary num //= 2 add_length = 32 - len(binary) add_char = '0' binary = add_char * add_length + binary return binary # 將負整數轉換為32位的二進位制補碼字串 def negnumTobi(self, num): num = abs(num) temp = self.posnumTobi(num) # 絕對值的二進位制 binary = "".join('1' if x == '0' else '0' for x in temp) res = bin(int(binary, 2) + 1)[2:] return res # 將二進位制字串轉換為十進位制數 def biToDecimal(self, bi_str): decimal = int(bi_str, 2) return decimal