【位运算-简单】405. 数字转换为十六进制数

【题目】
给定一个整数,编写一个算法将这个数转换为十六进制数。对于负整数,我们通常使用 补码运算 方法。
【注意】
十六进制中所有字母(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值