zoukankan      html  css  js  c++  java
  • 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))))

     测试结果如下:

      

  • 相关阅读:
    MyBatis学习总结(5)——实现关联表查询
    MyBatis学习总结4--解决字段名与实体类属性名不相同的冲突
    MyBatis学习总结3-优化MyBatis配置文件
    各种数据库的数据类型
    Ubuntu下jdk配置
    null和""的区别
    单例模式
    知识体系(不断更新)
    Servlet错误一览
    如何锻炼敲代码的能力
  • 原文地址:https://www.cnblogs.com/bethansy/p/12045844.html
Copyright © 2011-2022 走看看