截取最后一位是1 的后面所有数
例如10 的二进制是1010,那么lowbit的最低位返回的就是10
lowbit原理
根据计算机负数表示的特点,如一个数字原码是10001000,他的负数表示形势是补码,就是反码+1,反码是01110111,加一则是01111000,二者按位与得到了1000,就是我们想要的lowbit操作
#include<iostream>
using namespace std;
int lowbit(int x)
{
return x&-x;
}
int main()
{
int a;
cin>>a;
while(a--)
{
int b,x,res=0;
cin>>b;
while(b)
{
b-=lowbit(b);
//因为在二进制中,每减一个1就相当于把原来是1的位置变成0.
//直到每个位置上的数都是0为止,就停止循环
res++;
}
cout<<res<<" ";
}
return 0;
}