题目描述:
输入一个整数,输出该数二进制表示中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; }