原题是利用整数x &x-1可以消除掉x的二进制字符串右侧第一个“1”的原理,反复进行&,最终将x变为零。而反复的次数就是x这个字符串中“1”出现的次数。
原先想利用while进行循环,结果发现while存在一个问题:最后一个“1”被消除掉,x为0后,此次循环将不进行,导致最终的循环次数比“1”的实际数量要少1。虽然可以在初始化或返回值时+1的方法,但并不合理,所以舍弃了while而使用for进行循环。但while的部分还作为备注留在函数中。
源代码:
#include <stdio.h>
int bitcount(int x);
int main()
{
int x = 10000;//此句定义需要处理的数值,可以随便改动
printf("%d\n", bitcount(x));
}
int bitcount(int x)
{
int b;
/* while (x &= (x - 1) )
++b;
*///尝试了一下使用while的语句,结果发现并不合理。因为while在x值等于零的时候直接退出循环,会导致b最终比真实值要小1
for (b = 0; x != 0; x &= (x - 1))//函数的关键。b初始化为0,用x和x-1的二进制值进行&,每次都会消除掉x二进制值右侧的一个1,同时b+1,当x最后变为零的时候,返回b值,也就是b二进制字符串中1的数量
b++;
return b;
}