E:\arithmetic\NumOfBinary
两个解法:
1.0x01左移与数做与(注意:另一种解法是是将数右移与0x01做与,这种当数为负数时,会产生死循环)
2.x&(x-1)可以讲最右面的1变为0,循环执行,循环的次数就是1的个数。
#include <stdio.h>
int numOfBinary(int n);//移位
int numOfBinary2(int n);//x&(x-1)
int main(int argc, char *argv[])
{
int a[] = {1,5,0,-3};
int i;
for(i=0 ; i< sizeof(a)/sizeof(int) ; i++){
printf("%d\t", numOfBinary(a[i]));
printf("%d\n", numOfBinary2(a[i]));
}
printf("\n");
return 0;
}
int numOfBinary(int n){
int temp = 0x01;
int cnt = 0;
while(temp){
if(cnt > 32)
break;
// printf("##cnt = %x\ttemp = %x\n", cnt, temp);
if(temp & n){
cnt++;
}
temp <<= 1;//!!!
}
return cnt;
}
int numOfBinary2(int n){
int cnt = 0;
while(n){
cnt++;
n = n & (n-1);
}
return cnt;
}