- n的二进制数值第k位。 n>>k&1
- n的二进制中最后一个1。 n&(-n)
例如:10(1010)
原码:1010
反码(取反):0101
补码:~x+1
//二进制中1的个数
#include <iostream>
using namespace std;
const int N=100010;
int lowibt(int x){ //6621 0091
return x&(-x); //返回二进制中最后一个1
} //例如:10(1010)--->2(10)
int main(){
int num,n;
cin >>n;
for(int i=0;i<n;i++){
int cnt=0;
cin >>num;
while(num!=0){
num-=lowibt(num);
cnt++;
}
cout <<cnt<<' ';
}
return 0;
}