#include<iostream>
using namespace std;
int lowbit(int x)
{
return x&(-x);
}
/*lowbit原理
根据计算机负数表示的特点,如一个数字原码是10001000,
他的负数表示形势是补码,就是反码+1,反码是01110111,
加一则是01111000,二者按位与得到了1000,就是我们想要的lowbit操作*/
int main()
{
int n,ans;
scanf("%d",&n);
while(n--)
{
int x;
ans=0;
scanf("%d",&x);
while(x) x-=lowbit(x),ans++;
printf("%d ",ans);
}
return 0;
}
求n的第k位数字: n >> k & 1//第k位是从后往前数的 与运算输出的是最少的位 例如1为一位所以不管n再大输出的也是一位
返回n的最后一位1:lowbit(n) = n & -n