LeetCode刷题7——数字的补数

一、要求

补数可以直接通过异或运算进行。

  

二、背景

最近工作中位运算遇到一个问题,温度有正负两种表示,而且还有小数点。例如用四个16进制字节表示,XXXX,其中第一位是占位符,中间两三位为温度的有效值,且最后一位的单位是16-1   从而可以表示出小数点。如果第二位中二进制最高位是1,那么表示这个数时负数,需要进行取反加1,即补数加1。下面在做完补数的基础上会生成一个小算法进行温度值得解析。

异或^:两位相异时值为1

与&:两位都为1时值为1

或|:有一个为1时结果为1

反~:第一位不变,后面的位全取反

三、思路

(1)对于计算补数,直接和对应为的值进行或运算。例如5表示101 ,101^111=010

所以只需要知道输入数的位数就可以进行补数找操作。

 

 (2)温度数据的解析

当时一直卡壳在取反加1,特别是位运算中加1进位的问题,后来发现直接将得到的十进值加1即可

class Solution(object):
    def findComplement(self, num):
        """
        :type num: int
        :rtype: int
        """
        # value_len='1'*len(bin(num))-2
        # value=sum([2^i for i in range(value_len)])
        return num^int('1'*(len(bin(num))-2),2)
    def hextemp2int(self,num):
        '''
        num:0113a401
        用四个16进制字节表示,XXXX,其中第一位是占位符,中间两三位为温度的有效值,且最后一位的单位是16-1   从而可以表示出小数点。
        如果第二位中二进制最高位是1,那么表示这个数时负数,需要进行取反加1,即补数加1
        :param num:
        :return:
        '''
        if ord(num[1])>55: #  负数
            complement=((int(num[1::],16)^4095)+1)/16
            return complement*-1
        else:                    # 正数
            return int(num[1::],16)/16

    def inttemp2hex(self,data):
        '''
        十进制温度数据转16进制温度数据,两个字节表示,没有进行高低位取反.b代表二进制,d代表十进制,x代表16进制
        :return:
        '''
        if data>=0:
            return '{:04x}'.format(data*16)
        else:
            return '{:04x}'.format(data*16&0xFFFF)   
if __name__ == "__main__": s = Solution() print('36的16进制表示方式%s'%s.inttemp2hex(36)) print('%s的10进制表示方式%s'%(s.inttemp2hex(36),s.hextemp2int(s.inttemp2hex(36))))

 测试结果如下:

  

posted @ 2019-12-15 20:48  bethansy  阅读(407)  评论(0编辑  收藏  举报