#include <stdio.h>
#include <stdlib.h>
int countdecbydec(int number){
int counts = 0;
while(number){
counts += number & 1;
number = number >> 1;
}
return counts;
}
int countdecbycal(int number){
int counts = 0;
while(number){
counts += number % 2;
number = number / 2;
}
return counts;
}
int countdec(int number){
int counts = 0;
while(number){
counts++;
number = number & (number - 1);
}
return counts;
}
/* 这种形式很难想到,很巧妙。关键的理解要点是一个数减一后的值和原数据值的关系。可以这样理解:将原数据变成一个二进制形式,不是0就是1。减一的过程时这样的:若是0则翻转,向前借1,直到遇到第一个1为止,将1置0后完成了减一操作。*/
int main(int argc,char** argv){
if(argc < 2){
fprintf(stderr,"usage:%s",argv[0]);
exit(1);
}
int number = atoi(argv[1]);
printf("%d include %d dec 1 ,%d cal,%d &\n",number,countdecbydec(number),countdecbycal(number),countdec(number));
exit(0);
}