输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路有三种:
1. 整数n和1做与,然后n右移1位,循环求解,但是如果n位负数,右移时前面补1,需要注意不能死循环
2. 设置标记位1,和n做与,然后标记位左移1位,循环求解
3. 利用 n & (n-1) ,比如n的二进制位1100,n-1位1011,与的结果为1000,即把n最右边的1改成了0
4. 使用bitset
代码如下,推荐方法3
class Solution {
public:
//方法一:整数n和1做与,然后n右移1位,循环求解
int get_binary_1_number_method1(int n){
int count = 0;
if(n < 0){
n = n & 0x7FFFFFFF;
count++;
}
while(n){
if(n & 1){
count++;
}
n = n >> 1;
}
return count;
}
//方法二:设置标记位1,每次左移一位和n做与,如果结果为1则 这一位为1 count++
int get_binary_1_number_method2(int n){
int count = 0;
int flag = 1;
while(flag){
if(n & flag){
count++;
}
flag = flag << 1;
}
return count;
}
//方法三:比如n为1100 则n-1为1011
//n & (n-1) = 1000 即结果是把n最右边为1的一位变成了0, 循环求解即可
int get_binary_1_number_method3(int n){
int count = 0;
while(n){
count++;
n = n & (n-1);
}
return count;
}
//方法四:使用bitset
int get_binary_1_number_method4(int n){
bitset<32> num(n);
return num.count();
}
int NumberOf1(int n) {
//return get_binary_1_number_method1(n);
//return get_binary_1_number_method2(n);
return get_binary_1_number_method3(n);
//return get_binary_1_number_method4(n);
}
};