zoukankan      html  css  js  c++  java
  • 剑指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;
        }
  • 相关阅读:
    0.3 CMD常用命令!以及用CMD显得自己高大上
    1.0 配置JAVA环境和Maven环境(W10注意点)
    2.1 Oracle之DML的SQL语句之单表查询以及函数
    hBase
    2.0 flume、sqoop、oozie/Azkaban
    Hive
    MapReduce和yarn
    HDFS
    1.0 Hadoop的介绍、搭建、环境
    asp.net core系列 43 Web应用 Session分布式存储(in memory与Redis)
  • 原文地址:https://www.cnblogs.com/xiaobingqianrui/p/8833502.html
Copyright © 2011-2022 走看看