考察知识点:位运算
题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
题解一
分析
借助位运算的思想,设立标记变量 flag =1,每次 flag 左移 1位和整数 n 的每一位进行位与,来判断 1 的个数
例如:
对于一个数 1101 ,计数 count = 0
1101 & 0001 = 0001,count +1,
1101 & 0010 = 0000,count 不变,
1101 & 100 = 1000,count +1,
1101 & 1000 = 1000,count + 1
所以 count = 3
代码
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
int flag = 1;
while(flag!=0){
if(flag&n){
count++;
}
flag = flag<<1;
}
return count;
}
};
题解二
分析
例如:
对于一个数 n = 1101 ,n-1 = 1100,计数 count = 0
1101 & 1100 = 1100 = n,count +1,
1100 & 1011 = 1000 = n,count +1,
1000 & 0111 = 0 = n,count +1
所以 count = 3
代码
class Solution {
public:
int NumberOf1(int n) {
int count = 0;
while(n!=0){
n = (n-1)&n;
count++;
}
return count;
}
};