关键是理解lowbit作用,lowbit ( n ) 定义为非负整数 n 在二进制表示下 “ 最后面的 1 及其后面的所有的 0 ” 的二进制构成的数值
比如lowbit(8)
=(1000)2=(8)10,意思是得到了2进制表示的1000,(1000)2表示为10进制就是8
比如(192)10=(11000000)2
lowbit(192)
=(01000000)2=(64)10,直接得到(192)10=(11000000)2里面的最后面的 1 及其后面的所有的 0,也就是得到了(01000000)2,这就是lowbit(192)的结果!,因为这个效果,这个lowbit在统计二进制数里面1的个数里面很有用!
#include<iostream>
using namespace std;
int lowbit(int x){
return x&(-x);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;++i){
int x,res=0;
cin>>x;
while(x) x-=lowbit(x),res+=1;//10进制里面减去这个数,等于二进制里面也最后面的1直接设置为0,然后下一次统计下一个1,反复计算即可
cout<<res<<" ";
}
cout<<endl;
return 0;
}