一、要求
二、背景
最近工作中位运算遇到一个问题,温度有正负两种表示,而且还有小数点。例如用四个16进制字节表示,XXXX,其中第一位是占位符,中间两三位为温度的有效值,且最后一位的单位是16-1 从而可以表示出小数点。如果第二位中二进制最高位是1,那么表示这个数时负数,需要进行取反加1,即补数加1。下面在做完补数的基础上会生成一个小算法进行温度值得解析。
异或^:两位相异时值为1
与&:两位都为1时值为1
或|:有一个为1时结果为1
反~:第一位不变,后面的位全取反
三、思路
(1)对于计算补数,直接和对应为的值进行或运算。例如5表示101 ,101^111=010
所以只需要知道输入数的位数就可以进行补数找操作。
(2)温度数据的解析
当时一直卡壳在取反加1,特别是位运算中加1进位的问题,后来发现直接将得到的十进值加1即可
def temp(self,num): ''' num:0113a401 用四个16进制字节表示,XXXX,其中第一位是占位符,中间两三位为温度的有效值,且最后一位的单位是16-1 从而可以表示出小数点。 如果第二位中二进制最高位是1,那么表示这个数时负数,需要进行取反加1,即补数加1 :param num: :return: ''' if int(num[2:4],16)>255: # 是否是负数的判断 num=int(num[2::],16) complement=num^int('1'*(len(bin(num))-2),2)+1 return complement*-1
来源:https://www.cnblogs.com/bethansy/p/12045844.html