计算一个数中1的个数、0的个数
1. 求一个int数二进制中1的个数
(1)与1、右移 【正数、负数都可以(计算的是负数补码中1的个数)】
int a; cin>>a; int count = 0;
int n = sizeof(int)*8; //位数 for(int i=0;i<n;i++) { if(a&1 != 0) { //判断最低位是否是1 ++count; } a >>= 1; //右移一位 }
cout<<count<<endl;
(2)右移相当于除以2
判断最低位可用2取余;右移可用除以2 【此方法只适合于正数、无符号数】
int a; cin>>a; int count = 0; while(a>0) { count += (a%2); a /= 2; } cout<<count<<endl;
(3)与上比其小1的数 【正数、负数都可以】
int a; cin>>a; int count = 0; while(a!=0) { ++count; a &= (a-1); } cout<<count<<endl;
2. 求0的个数
(1)与1、右移
如果与1为0,则计数加1;如果与1为1,判断下一位
(2)总的位数减1的个数