【题目】
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
【注意】
十六进制中所有字母(a-f)都必须是小写。
十六进制字符串中不能包含多余的前导零。如果要转化的数为0,那么以单个字符’0’来表示;对于其他情况,十六进制字符串中的第一个字符将不会是0字符。
给定的数确保在32位有符号整数范围内。
不能使用任何由库提供的将数字直接转换或格式化为十六进制的方法。
【示例 1】
输入:
26
输出:
“1a”
【示例 2】
输入:
-1
输出:
“ffffffff”
【知识点】
step1:首先要知道什么是补码:
正数是原码、反码、补码都是本身
负数的原码、反码、补码比较特殊,请看下面的解析:
以32位数字为例:
-1
原码:1000 0000 0000 0000 0000 0000 0000 0001
反码:1111 1111 1111 1111 1111 1111 1111 1110
补码:1111 1111 1111 1111 1111 1111 1111 1111
其中左侧第一个是符号位,1代表是负数,负数的反码是将除符号位之外的数字0变1,1变0的一个反转的状态。负数的补码是将反码+1
【负数】反码+1=【负数】补码
step2:所以对于可能输入的负数num要对其进行处理后再将其转换为16进制。
先将负数->2进制->求反码->求补码->16进制,下面这部分代码就是将负数num转换为2进制,然后求反码】再求补码再将其转换为10进制的过程,注意,这里我没有将其从反码直接转换为16进制,而是转换为10进制之后再转换为16进制,为的就是复用代码,下面num为正数的时候的代码。
if num<0:
temp=bin(num)[3:]
s=list("{0:1>32}".format(temp))
i=31
for i in range(31,31-len(temp),-1):
s[i]='0' if s[i]=='1' else '1'
num=int("".join(s),2)+1
【代码】
【Python】
class Solution:
def toHex(self, num: int) -> str:
oct_hex={
0:"0",1:"1",2:"2",3:"3",4:"4",5:"5",6:"6",7:"7",8:"8",9:"9",10:"a",11:"b",12:"c",13:"d",14:"e",15:"f"}
ans=""
if num<0:
temp=bin(num)[3:]
s=list("{0:1>32}".format(temp))
i=31
for i in range(31,31-len(temp),-1):
if s[i]=='1':
s[i]='0'
else:
s[i]='1'
num=int("".join(s),2)+1
if num>0:
while num:
ans=oct_hex[num%16]+ans
num//=16
else:
return "0"
return ans
【简洁版】
class Solution:
def toHex(self, num: int) -> str:
oct_hex="0123456789abcdef"
ans=""
if num<0:
temp=bin(num)[3:]
s=list("{0:1>32}".format(temp))
i=31
for i in range(31,31-len(temp),-1):
s[i]='0' if s[i]=='1' else '1'
num=int("".join(s),2)+1
if num>0:
while num:
ans=oct_hex[num%16]+ans
num//=16
else:
return "0"
return ans
【方法3】
class Solution:
def toHex(self, num: int) -> str:
if num == 0:
return "0"
oct_hex = "0123456789abcdef"
ans = ""
while num and len(ans) < 8:
ans = oct_hex[num & 0xf] + ans
num >>= 4
return ans