给定一个整数,写一个算法将它转换为16进制,对于负数,可以使用two’s complement方法
注意:
16进制(a-f)只包括小写字母
十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符'0'
来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
给定的数确保在32位有符号整数范围内。
不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
Example 1:
Input: 26 Output: "1a"
Example 2:
Input: -1 Output: "ffffffff"
1:自然数转16进制的方法和转二进制一样.负数则先取反、再转31位二进制、再反码、再反码+1、再加上符号位(此时32位)、最后再转16进制
def toHex(self, num):
"""
:type num: int
:rtype: str
"""
chaDic = {10: 'a', 11: 'b', 12: 'c', 13: 'd', 14: 'e', 15: 'f'}
if num >= 0:
hexStr = ""
while num >= 16:
rest = num % 16
hexStr = chaDic.get(rest, str(rest)) + hexStr
num //= 16
hexStr = chaDic.get(num, str(num)) + hexStr
return hexStr
else:
if num == -2147483648: #特殊情况,负数最大值
return "80000000"
num = -num #负数取反
bitList = [0] * 31
tail = 30
while num >= 2: #数字转二进制
rest = num % 2
bitList[tail] = rest
tail -= 1
num //= 2
bitList[tail] = num
for i in range(31): # 反码
bitList[i] = 1 if bitList[i] == 0 else 0
tail = 30
add = 1
while add + bitList[tail] == 2: #反码加1
bitList[tail] = 0
tail -= 1
bitList[tail] = 1
bitList = [1] + bitList #添加负号
print bitList
hexStr = ""
for i in range(0, 32, 4): #二进制转16进制
add = 0
for j in range(0, 4):
add += bitList[i + j] * 2 ** (3 - j)
hexStr += chaDic.get(add, str(add))
return hexStr
2:如果输入整数是负数,则执行num = num + 2**23,然后统一进行转16进制处理(参考他人代码)
def toHex(self, num):
"""
:type num: int
:rtype: str
"""
chaDic = {10: 'a', 11: 'b', 12: 'c', 13: 'd', 14: 'e', 15: 'f'}
hexStr = ""
if num < 0:
num = num + 2**32
while num >= 16:
digit = num % 16
hexStr = chaDic.get(digit, str(digit)) + hexStr
num //= 16
hexStr = chaDic.get(num, str(num)) + hexStr
return hexStr
算法题来:https://leetcode-cn.com/problems/convert-a-number-to-hexadecimal/description/