剑指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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • Oracle Insert分批提交「建议收藏」

    Oracle Insert分批提交「建议收藏」oracle中分批提交insert事务,以防止redo占用太多可以分批提交事务:以下是三种不同的pl/sql体:1、编写一个简单的PL/SQL块来模拟逐行提交的情况,注意观察执行时间。我们的目标是将t_ref表中的数据全部插入到t中。sec@ora10g>settimingonsec@ora10g>DECLARE2BEGIN3FORcurIN(SEL…

    2022年7月17日
  • realsense深度图像保存方法[通俗易懂]

    realsense深度图像保存方法[通俗易懂]一般使用realsense时会保存视频序列,当保存深度图像时,需要注意保存的图像矩阵的格式,不然可能造成深度值的丢失。在众多图像库中,一般会使用opencv中的imwrite()函数进行深度图像的保存。一般深度图像中深度值的单位是mm,因此一般使用np.uint16作为最终数据格式保存。例子:importnumpyasnpimportcv2deffun1(…

    2022年4月25日
  • 创建线程池的七种方式为_全局线程池如何创建

    创建线程池的七种方式为_全局线程池如何创建创建线程池的7种方式

    2022年10月1日
  • python把数据存入txt_python数据保存为csv文件

    python把数据存入txt_python数据保存为csv文件参考:Python中文件的读取和写入PYTHON将list或/dict对象写入txt/json文件python(如何将数据写入本地txt文本文件)python中文件写入TXTPython中将变量按行写入txt文本中python把变量写入txt文件。Python读写文件python文件操作Python之文件读写Python程序输出到文件中python把一个unicode字符串…

    2022年10月2日
  • IntelliJ IDEA 2021.5 激活码【在线注册码/序列号/破解码】[通俗易懂]

    IntelliJ IDEA 2021.5 激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
  • js 字符串截取substr和substring详解

    js 字符串截取substr和substring详解1.substr 方法返回一个从指定位置开始的指定长度的子字符串。stringObj.substr(start [, length ])参数stringvar:必选项。要提取子字符串的字符串文字或 String 对象。start:必选项。所需的子字符串的起始位置。字符串中的第一个字符的索引为 0。length:选项。在返回的子字符串中应包括

    2022年5月29日

发表回复

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

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