• 剑指Offer面试题:8.二进制中1的个数


    一 题目:二进制中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;
        }
  • 相关阅读:
    SecureCRT_FX8.0完整版
    bridge
    Quartz 框架 教程(中文版)2.2.x
    Quartz教程五:SimpleTrigger
    Quartz教程四:Trigger
    Quartz教程三:Job与JobDetail介绍
    Quartz教程二:API,Job和Trigger
    Quartz教程一:使用quartz
    Quartz教程:快速入门
    Kubernetes 1.5.3 部署
  • 原文地址:https://www.cnblogs.com/xiaobingqianrui/p/8833502.html
Copyright © 2020-2023  润新知