资讯专栏INFORMATION COLUMN

476-数字的补数

Euphoria / 2683人阅读

摘要:前言上一道关于位运算的题目数字的补数,原题目如下给定一个正整数,输出它的补数。示例输入输出解释的二进制表示为没有前导零位,其补数为。

前言

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

给定一个正整数,输出它的补数。补数是对该数的二进制表示取反。
注意:

给定的整数保证在32位带符号整数的范围内。

你可以假定二进制数不包含前导零位。

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

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

解题思路

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

对5(二进制表示为101)取反,获得11111111111111111111111111111010

要使11111111111111111111111111111010变成101,只需要让

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

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

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

对0取反获得全为1的二进制制数,即11111111111111111111111111111111

再左移3位(入参的有效位数),得到11111111111111111111111111111000

最后取反,得到00000000000000000000000000000111

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/76834.html

相关文章

  • <Principle Of Computer Organization>学习笔记——原码

    摘要:将补数的概念用到计算机中,便出现了补码这种机器数。通常,从原码形式入手来求补码。它与补码的区别是末位少加一个,因此很容易从补码的定义推出反码的定义。若真值为纯小数,它的反码形式为其中表示符号位。 一、原码表示法 原码表示法是一种最简单的机器数表示法,其最高位为符号位,符号位为0时表示该数为正,符号位为1时表示该数为负,数值部分与真值相同。若真值为纯小数,它的原码形式为Xs,.X1X2X...

    OnlyMyRailgun 评论0 收藏0
  • <Principle Of Computer Organization>学习笔记——原码

    摘要:将补数的概念用到计算机中,便出现了补码这种机器数。通常,从原码形式入手来求补码。它与补码的区别是末位少加一个,因此很容易从补码的定义推出反码的定义。若真值为纯小数,它的反码形式为其中表示符号位。 一、原码表示法 原码表示法是一种最简单的机器数表示法,其最高位为符号位,符号位为0时表示该数为正,符号位为1时表示该数为负,数值部分与真值相同。若真值为纯小数,它的原码形式为Xs,.X1X2X...

    hsluoyz 评论0 收藏0
  • Leetcode PHP题解--D24 476. Number Complement

    摘要:返回该数字即可。思路题目描述得已经很清楚了。要注意对调的时候,不能直接对调。需要先把换成除之外的其他字符,最后再把他替换过来。因为会按顺序逐个替换。替换完成之后,在用转换成十进制即可。最终代码若觉得本文章对你有用,欢迎用爱发电资助。 476. Number Complement 题目链接 476. Number Complement 题目分析 给定一个数字,将他转换成二进制后,将0和1...

    phodal 评论0 收藏0
  • ESP8266-NodeMCU项目(四):将上一项目的空调控制接入小爱同学(Blinker_APP同

    摘要:错开折腾经历文章目录前言思路设备配置程序代码小爱训练测试总结前言之前已经进行了项目二接入小爱同学以及项目三空调控制,接下来便是将二者合一,实现控制,温湿度查看,以及小爱同学进行简单空调控制。 ...

    Loong_T 评论0 收藏0
  • ESP8266-NodeMCU项目(三):ESP8266-NodeMCU+Blinker+红外模块(

    摘要:红外模块接入板子后,可进行以上操作,并接入,通过控制空调。材料清单板子红外接收模块红外发射模块线杜邦线左边是红外发射模块,右边是红外接收模块。 错开の折腾经历:ES...

    luoyibu 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<