剑指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;
    }
原文地址:https://www.cnblogs.com/LJ-LJ/p/10591013.html