zoukankan      html  css  js  c++  java
  • 剑指offer:二进制中1的个数

    题目描述:

    输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

    解题思路:

    这道题考察的是位运算的内容。对这一部分不是很熟悉。查看了网上的思路。

    思路一:

    每次都将n与1做与运算,再不断右移n,这样每次都考察最右边那位数是否为1.但这样存在的问题是,对于负数来说,符号位总为1,在右移过程中左边总是补1,因此掉入无限循环。

    思路二:

    因此考虑右移1,将无符号的flag初始设为1,每次都将其左移一位,左移的过程中,右边补0,因此只有指定位为1,判断(n&flag)的值,从而判断n中1的个数。注意的是flag必须为unsigned int类型。

    思路三:

    把一个整数减去1之后再和原来的整数做位与运算,得到的结果相当于是把整数的二进制表示中的最右边一个1变成0。很多二进制的问题都可以用这个思路解决。那么一个整数的二进制表示中有多少个1,就可以进行多少次这样的操作。

    代码:

    思路二:

    class Solution {
    public:
         int  NumberOf1(int n) {
             int count=0;
             uint flag=1;
             while(flag>=1)
             {
                 if((n&flag)>0)
                     count++;
                 flag = flag<<1;
             }
             return count;
         }
    };

    思路三:

    public static int NumberOf1Solution3(int n)
        {
            int count = 0;
    
            while (n > 0)
            {
                count++;
                n = (n - 1) & n;
            }
    
            return count;
        }
  • 相关阅读:
    BZOJ 1088 模拟(扫雷经验…)
    BZOJ 1529
    BZOJ 3224
    BZOJ 1192
    BZOJ 1012
    博客搬家说明
    BZOJ 2423 DP
    BZOJ 1789&1830 推式子 乱搞
    BZOJ 1588
    拆点:虫洞
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/10591013.html
Copyright © 2011-2022 走看看