求n的第k位数字: n >> k & 1 (第k位是从右边开始数的,且最右边哪一位k=0)
返回n的最后一位1:lowbit(n) = n & -n
int n=55;//二进制 11 0111
for(int i=7;i>=0;i--){
cout<<(n >> i & 1);
} /*0011 0111*/
位运算
lowbit(x) 返回x中最后面(右侧)一个一的位置,(二进制下)
比如x=1010 返回10,x=101000 返回1000.
当x!=0 循环去掉末尾的1就可以统计出1的个数了
C++ 代码
#include <iostream>
#include <cstring>
using namespace std;
const int N=1e5+10;
int a[N];
int lowbit(int x){
return x&-x;
}
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
int res=0;
while(a[i]){
a[i] -=lowbit(a[i]);
res++;
}
cout<<res<<" ";
}
return 0;
}