#include <iostream>
#include <cstdio>
using namespace std;
int count1(int x) {
int cnt = 0;
while(x != 0) {
x = x&(x-1);
cnt ++;
}
return cnt;
}
int main() {
int n;
while(~scanf("%d",&n)) {
for(int i = 0; i < n; i ++) {
int a;
scanf("%d",&a);
printf("%d\n", count1(a));
}
}
return 0;
}
/**************************************************************
Problem: 1513
User: 萧然677
Language: C++
Result: Accepted
Time:80 ms
Memory:1520 kb
****************************************************************/
为什么n &= (n – 1)能清除最右边的1呢?因为从二进制的角度讲,n相当于在n - 1的最低位加上1。举个例子,8(1000)= 7(0111)+ 1(0001),所以8 & 7 = (1000)&(0111)= 0(0000),清除了8最右边的1(其实就是最高位的1,因为8的二进制中只有一个1)。再比如7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110),清除了7的二进制表示中最右边的1(也就是最低位的1)。