剑指Offer面试题:8.二进制中1的个数建议收藏

一题目:二进制中1的个数二可能引起死循环的解法00001010>>2=0000001010001010>>3=11110001那么,问题来了:上面的方法如果输入一个

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

全栈程序员社区此处内容已经被作者隐藏,请输入验证码查看内容
验证码:
请关注本站微信公众号,回复“验证码”,获取验证码。在微信里搜索“全栈程序员社区”或者“www_javaforall_cn”或者微信扫描右侧二维码都可以关注本站微信公众号。

一 题目:二进制中1的个数

题目:请实现一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1。因此如果输入9,该函数输出2。

二 可能引起死循环的解法

// 计算整数的二进制表示中1的个数
int CalcOneNumInBinary(int nVal)
{
    int nCount = 0;
    while (nVal > 0)
    {
        if (1 == (nVal & 1))
        {
            nCount ++;
        }

        nVal = nVal >> 1;
    }
    return nCount;
}

PS:右移运算符m>>n表示把m右移n位。右移n位的时候,最右边的n位将被丢弃。
如果数字原先是一个正数,则右移之后在最左边补n个0;如果数字原先是负数,则右移之后在最左边补n个1。例如下面对两个八位二进制数进行右移操作:

00001010>>2=00000010

10001010>>3=11110001

那么,问题来了:上面的方法如果输入一个负数,比如0x80000000,如果一直做右移运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环

三 避免死循环的解法

  为了避免死循环,我们可以不右移输入的数字i:

  (1)首先把i和1做与运算,判断i的最低位是不是为1。

  (2)接着把1左移一位得到2,再和i做与运算,就能判断i的次低位是不是1。

  (3)这样反复左移,每次都能判断i的其中一位是不是1。

int CalcOneNumInBinary_1(int nVal)
{
    int nCount = 0;
    int nFlag = 1;
    while (nFlag > 0)
    {
        if ((nVal & nFlag) > 0)
        {
            nCount ++;
        }

        nFlag = nFlag << 1;
    }
    return nCount;
}

四 高效新颖解法

int NumberOf1Solution3(int n)
    {
        int count = 0;

        while (n > 0)
        {
            count++;
            n = (n - 1) & n;
        }

        return count;
    }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/120167.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决NVIDIA显卡驱动 图形驱动程序安装失败 问题

    解决NVIDIA显卡驱动 图形驱动程序安装失败 问题本教程是在当你尝试一般的教程都无法解决问题的前提下使用,比如使用DDU工具卸载原显卡驱动后重新安装无效,找不到独立显卡的情况。退出火绒等杀毒软件win+R输入services.msc进入服务。将WindowsUpdata启动类型改为自动,并启动服务。win+R输入gpedit.msc进入本地策略编辑器。在计算机配置-模板管理-系统-设备安装-设备安装限制中双击图中第三个将其改为未配置或禁用重新安装显卡驱动即可…

    2022年5月6日
    842
  • Dubbo框架(Javassm框架)

    1.Dubbo是什么?Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别WebService模式中的WSdl,以服务者

    2022年4月11日
    69
  • 苹果电脑录屏软件推荐_苹果手机录屏怎么设置

    苹果电脑录屏软件推荐_苹果手机录屏怎么设置屏幕的录制需要更专业的软件,我们需要的屏幕录制工具,不仅具有录屏的功能,还可以根据自己的需要进行编辑,那么在Mac上有哪些优秀的录屏应用呢?来看一下吧。ApeaksoftScreenRecorderApeaksoftScreenRecorder是一个专业的工具,用于在Windows或Mac电脑上录制任何视频/音频和捕捉屏幕。这款出色的视频屏幕录制软件可以帮助您轻松地在电脑上获得在线电影和广播,记录游戏,制作视频教程,捕捉摄像头视频,截图等。此外,您还可以使用文本框,箭头,突出显示等功能来注释

    2022年9月25日
    3
  • 软件介绍网站:“软矿”x-berry「建议收藏」

    软件介绍网站:“软矿”x-berry「建议收藏」今天发现了一个推荐软件的网站叫做“软矿”做的很不错。页面简洁,大方,内容也很新。我查询的是虚拟机相关的软件和技术,里面对VMware和Virtualbox的介绍都比较丰富。

    2022年8月3日
    14
  • SwapBuffer驱动进阶(一)[通俗易懂]

    SwapBuffer驱动进阶(一)[通俗易懂]之前通过阅读swapbuffer的read的部分代码,基本上弄明白了缓存交换的原理。    那么我们怎么做到文件的透明加解密,直接使用其缓存交换的方式来实现呢,目前参考了Antinvader,有一个步骤是肯定要做的,那就是在Create的Post中,添加文件流的上下文,这样才能知道你打开的文件,是不是在read中确认是你需要处理的问题,因为在Read中的FileName是不准确的,例

    2022年5月12日
    40
  • 海思Hi3798MV300_Hi3798MV300H_Datasheet-系统[通俗易懂]

    海思Hi3798MV300_Hi3798MV300H_Datasheet-系统[通俗易懂]Hi3798MV300/Hi3798MV300H处理器子系统Hi3798MV300/Hi3798MV300H采用ARMCortex-A53MPCore四核处理器,Cortex-A53MPCore具有以下特点:处理器集成了256KBL2cache。支持ARMv8-A架构。支持DVFS自动调频调压和AVS自适应调压。安全子系统具有以下特性:…

    2022年6月29日
    198

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号