博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
476-数字的补数
阅读量:6994 次
发布时间:2019-06-27

本文共 1008 字,大约阅读时间需要 3 分钟。

前言

LeetCode上一道关于位运算的题目,原题目如下:

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
注意:
  1. 给定的整数保证在32位带符号整数的范围内。
  2. 你可以假定二进制数不包含前导零位。
示例 1:
输入: 5
输出: 2
解释: 5的二进制表示为101(没有前导零位),其补数为010。所以你需要输出2。

示例 2:

输入: 1
输出: 0
解释: 1的二进制表示为1(没有前导零位),其补数为0。所以你需要输出0。

解题思路

这道题目我解题的思路是先尝试对某个数字取反,然后通过位运算把前导零位取反后的1变回0,以入参为5举例:

  1. 对5(二进制表示为101)取反,获得11111111111111111111111111111010
  2. 要使11111111111111111111111111111010变成101,只需要让

    11111111111111111111111111111010 &  00000000000000000000000000000111 ------------------------------------    00000000000000000000000000000101

    &为与运算,那么此时的问题就是如何生成前32-3=29(前导零位的位数,注意int应该是31位的,但是这个还把符号位也算上了)个的0和3个1组成的二进制数字了

  3. 00000000000000000000000000000111可以通过以下方式获得~((~0)<<3),简单来说就是

    1. 对0取反获得全为1的二进制制数,即11111111111111111111111111111111
    2. 再左移3位(入参的有效位数),得到11111111111111111111111111111000
    3. 最后取反,得到00000000000000000000000000000111

其实就是使用逆推法来解题。

实现代码

/**     * 数字的补数     * @param num     * @return     */    public int findComplement(int num) {        //有效位数        int offset=32-Integer.numberOfLeadingZeros(num);        return (~num)&(~((~0)<

转载地址:http://fdzvl.baihongyu.com/

你可能感兴趣的文章
十、装饰(Decorator)模式 --结构模式(Structural Pattern)
查看>>
WWDC 2013 Session笔记 - UIKit Dynamics入门
查看>>
5月7日——采用第三方页面内容,但是顶部title使用自己的
查看>>
Spring Boot 构建电商基础秒杀项目 (十) 交易下单
查看>>
SQL中创建用户的方法
查看>>
PHP168 6.0及以下版本login.php代码执行
查看>>
Java代理(jdk静态代理、动态代理和cglib动态代理)
查看>>
WPF生命周期
查看>>
各大Oj平台介绍
查看>>
hdu1059 dp(多重背包二进制优化)
查看>>
四象限分析法分析你是否适合做管理
查看>>
Create a database in mysql for mac
查看>>
java编程目录
查看>>
swagger
查看>>
QFT URL
查看>>
HDU1195 ZOJ2416 Open the Lock【BFS】
查看>>
用python实现数字图片识别神经网络--启动网络的自我训练流程,展示网络数字图片识别效果...
查看>>
12. Integer to Roman
查看>>
Windows
查看>>
测试与优化——结对编程
查看>>