一、要求

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

二、背景

最近工作中位运算遇到一个问题,温度有正负两种表示,而且还有小数点。例如用四个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))))

 测试结果如下:

  

LeetCode刷题7——数字的补数的更多相关文章

  1. C#LeetCode刷题之#136-只出现一次的数字(Single Number)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4046 访问. 给定一个非空整数数组,除了某个元素只出现一次以外, ...

  2. C#LeetCode刷题-位运算

    位运算篇 # 题名 刷题 通过率 难度 78 子集   67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...

  3. LeetCode刷题总结-数组篇(上)

    数组是算法中最常用的一种数据结构,也是面试中最常考的考点.在LeetCode题库中,标记为数组类型的习题到目前为止,已累计到了202题.然而,这202道习题并不是每道题只标记为数组一个考点,大部分习题 ...

  4. LeetCode刷题总结-数组篇(下)

    本期讲O(n)类型问题,共14题.3道简单题,9道中等题,2道困难题.数组篇共归纳总结了50题,本篇是数组篇的最后一篇.其他三个篇章可参考: LeetCode刷题总结-数组篇(上),子数组问题(共17 ...

  5. LeetCode刷题总结-树篇(中)

    本篇接着<LeetCode刷题总结-树篇(上)>,讲解有关树的类型相关考点的习题,本期共收录17道题,1道简单题,10道中等题,6道困难题. 在LeetCode题库中,考察到的不同种类的树 ...

  6. LeetCode刷题预备知识(二)

    Python四大数据结构的属性及方法 在LeetCode刷题预备知识一中我们掌握了常见的内置函数,和四大数据结构的基本概念: 但只掌握这些还远远不够,我们还需了解四大数据结构的属性及方法才能更高效快速 ...

  7. LeetCode刷题总结-链表

    LeetCode刷题总结-链表 一.链表     链表分为单向链表.单向循环链表和双向链表,一下以单向链表为例实现单向链表的节点实现和单链表的基本操作. 单向链表 单向链表也叫单链表,是链表中最简单的 ...

  8. LeetCode刷题笔记和想法(C++)

    主要用于记录在LeetCode刷题的过程中学习到的一些思想和自己的想法,希望通过leetcode提升自己的编程素养 :p 高效leetcode刷题小诀窍(这只是目前对我自己而言的小方法,之后会根据自己 ...

  9. C#LeetCode刷题-树

    树篇 # 题名 刷题 通过率 难度 94 二叉树的中序遍历   61.6% 中等 95 不同的二叉搜索树 II   43.4% 中等 96 不同的二叉搜索树   51.6% 中等 98 验证二叉搜索树 ...

随机推荐

  1. move post process stack from package to asset

    这东西折腾了我好久 原来一直都是打开的方式不对 package 文件夹里面的manifest文件 改相应的package为文件路径引用     "com.unity.render-pipel ...

  2. HDU 5634 (线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5634 题意:给出 n 个数,有三种操作,把区间的 ai 变为 φ(ai):把区间的 ai 变为 x:查 ...

  3. 【leetcode】1289. Minimum Falling Path Sum II

    题目如下: Given a square grid of integers arr, a falling path with non-zero shifts is a choice of exactl ...

  4. HGOI 20191103am 题解

    Problem A number 使用一个$2^k$数集中每个元素的和表示数$n$,不同集合的数目有多少? 对于$100\%$的数据满足$1 \leq n \leq 10^6$ Solution : ...

  5. 进程控制块(PCB)

    进程控制块PCB 我们知道,每个进程在内核中都有一个进程控制块(PCB)来维护进程相关的信息,Linux内核的进程控制块是task_struct结构体. /usr/src/linux-headers- ...

  6. 最新版Google Chrome 自动加载flash插件的方法

    我们在用Selenium做自动化测试时,有时候需要浏览器自动加载flash插件,69以前的谷歌浏览器,可以通过加载属性的方法自动运行flash插件,如下: prefs={ "profile. ...

  7. [LOJ6053]简单的函数:Min_25筛

    分析 因为题目中所给函数\(f(x)\)的前缀和无法较快得出,考虑打表以下两个函数: \[ g(x)=x \times [x是质数] \] \[ h(x)=1 \times [x是质数] \] 这两个 ...

  8. Vue之混入(mixin)与全局混入

    Vue之混入(mixin)与全局混入 接下来通过一个简单的例子看看混入的基础用法: 首先新建一个mixin.js文件,添加以下代码. let mixin = { data() { return { m ...

  9. ubuntu 14.04 升级到18.04

    http://www.360doc.com/content/18/0929/09/35082563_790606785.shtml

  10. laravel-5.3(1) 路由配置

    第一步: 按照上一篇搭建好工程后可以看到框架默认的 welcome 默认视图: 一般的web 开发框架是MVC设计模式,那么我们现在创建自己的控制器和视图,CMD 进入到工程根目录执行 php art ...