问题:给定一个整数,返回它的补数。补数的是将原数据的二进制表示反转。例如 5 的二进制位是 101,反转之后是:010,也就是整数2。所以输入5,返回2.。输入1,返回0。
 思路:取反操作是~,例如~5,但是5的最高位前面的0也会取反,0000 0000 0000 0101 会变成 1111 1111 1111 1010 ,而实际上,只有从右数的第三位是有效的,其他的1是无效的。按照461题目的思路,用一个字符串bit存储二进制位。
 将 5和1与,得到1,bit=’0’;
  5>>1,得到2,2&1,得到0 ,bit=’10’
  2>>1,得到1,1&1,得到1,bit=’010’
  1>>1 ,得到0,退出。
  然后使用Integer.ValueOf 将一个二进制字符串,转为int。

public int findComplement(int num) {String bit = "";while (num != 0) {bit = ((num & 1) == 1 ? 0 : 1) + bit;num >>= 1;}return Integer.valueOf(bit, 2);}

  收获:
  1 Integer.highestOneBit(num) 返回的是 num二进制中最高位的1,所表示的int数字。例如5的二进制 0000 0000 0000 0101 ,最高位的1表示4。
  2 我的思路是一位一位取反,数字为0就退出了。另外一种思路是对 ~num 后无效的1 取一个&操作,将其去掉。如果有这样一个数:没有意义的位上是0,有意义的位上全是1,然后与~num 做&操作,那么就可以得到正确结果。对5来讲,需要一个这样的数:0000 0000 0000 0111。这个数等于(Integer.highestOneBit(5)<<1)-1,也就是(4<<2)-1=7。最终:~num & ((Integer.highestOneBit(num)<<1) - 1).
  再进一步:第三位的1(从右开始数),肯定会变成0,所以 0000 0000 0000 0011这样一个数也是可以的。最终:~num & (Integer.highestOneBit(num) - 1)。
  3 掩码: 0000 0000 0000 0011 这样的数字叫做掩码。掩码是一串二进制代码,对目标字段进行位与的操作与运算,屏蔽当前的输入位。 将源码与掩码经过按位运算或逻辑运算得出新的操作数。其中要用到按位运算如OR运算和AND运算。例如:大写字母转小写字母,IP地址的掩码。
参考:
1 leetcode题目
2 leetcode讨论

476 Number Complement相关推荐

  1. 263.Ugly Number||202 happy number||476 Number Complement||136 Single Number

    263.Ugly Number 判断因数是否只有素数2.3.5.. 感觉比较简单: class Solution(object):def isUgly(self, num):""& ...

  2. LeetCode 476. Number Complement

    题目: Given a positive integer, output its complement number. The complement strategy is to flip the b ...

  3. Leetcode 476. Number Complement 补数 解题报告

    1 解题思想 这道题给了一个正的整数,然后需要计算一个特殊的补数,这个补数的计算方式是: 1.对于这个整数num,转换成对应的二进制表示,这个二进制表示共有x位(不高于32) 2.将这x位取反后,得到 ...

  4. 【leetcode】【套路题】476. Number Complement

    一.题目描述 Given a positive integer, output its complement number. The complement strategy is to flip th ...

  5. leetcode 476. Number Complement | 476. 数字的补数(位运算)

    题目 https://leetcode.com/problems/number-complement/ 题解 class Solution {public int findComplement(int ...

  6. 【LeetCode】476. 数字的补数 Number Complement

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:Leetcode, 力扣,476, 补数,二进制,Pyth ...

  7. leetcode 476. 数字的补数(Number Complement)

    目录 题目描述: 示例 1: 示例 2: 解法: 题目描述: 给定一个正整数,输出它的补数.补数是对该数的二进制表示取反. 注意: 给定的整数保证在32位带符号整数的范围内. 你可以假定二进制数不包含 ...

  8. 数的补数 Number Complement

    2019独角兽企业重金招聘Python工程师标准>>> 问题: Given a positive integer, output its complement number. The ...

  9. LeetCode Number Complement

    原题链接在这里:https://leetcode.com/problems/number-complement/ 题目: Given a positive integer, output its co ...

最新文章

  1. 工作笔记---巡检记录
  2. 二进制搜索算法_使用安全摄像机镜头解释二进制搜索算法
  3. 从MegaEase看云原生
  4. undistortPoints()函数用法总结
  5. 计算机网络应用押韵句,现代汉语练习题
  6. 信息学奥赛一本通 1358:中缀表达式值(expr)
  7. 深入解读Linux进程调度系列(1)——调度的初始化
  8. ae教程 (四)运动控制 (三)
  9. html屏幕缩小图片不失真,html图片失真怎么办
  10. 基于深度学习的新闻摘要生成算法实现与详解(Encoder-Decoder框架模型)
  11. 四、网络层(一)网络层的功能
  12. python读取HTML文本文件
  13. C语言及ARM中堆栈指针SP设置的理解与总结
  14. 解决Google AdSense导致网站加载慢的优化方法
  15. 100句正能量的句子经典语句
  16. Webapck 体系基础
  17. 本周总结 前端第二次作业 模仿制作百度界面
  18. 024--离职手续办理
  19. 复试21天 day two
  20. 视频教程-微信公众号开发-微信开发

热门文章

  1. [HNOI 2001]求正整数
  2. OpenCV人脸检测并把图片写成avi视频
  3. 做移动端视频通话软件,大致看了下现有的开源软件(转)
  4. 发消息给非windows窗体程序
  5. Quartz实现定时功能 job.xml文件的配置
  6. nginx php怎么配置伪静态,nginx rewrite 伪静态配置参数和使用例子
  7. apache 修改服务器配置,Apache服务器配置全攻略
  8. Android Log工具类,Toast工具类,获取当前方法名称
  9. docker centos node nginx
  10. 中考物理可不可以用计算机,不能用计算机?2021年起广州中考课目改为“4+4”...