一、要求
补数可以直接通过异或运算进行。
二、背景
最近工作中位运算遇到一个问题,温度有正负两种表示,而且还有小数点。例如用四个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))))
测试结果如下: