void Trans(unsigned int a, int* count)
{
for (;;)
{
if (a == 0)
{
break;
}
(*count)++;
a >>= 1;
}
}
int main()
{
int a = 0;
scanf("%d", &a);
int count = 0;
Trans(a,&count);
printf("%d", count);
return 0;
}
这个是一开始写的,似乎是最笨的一个
如果换成while循环似乎精简一点
void Trans(unsigned int a, int* count)
{
while(a)
{
(*count)++;
a >>= 1;
}
}
int main()
{
int a = 0;
scanf("%d", &a);
int count = 0;
Trans(a,&count);
printf("%d", count);
return 0;
}
然后发现一种比较神奇的算法
首先发现
n和n-1按位与操作可以实现对n二进制表示中最右边的1的一个消除
基于这个发现有以下这个改良的代码
int Trans(int a)
{
int count = 0;
while(a)
{
a &= a - 1;
count++;
}
return count;
}
int main()
{
int a = 0;
scanf("%d", &a);
int count = Trans(a);
printf("%d", count);
return 0;
}
这个代码优势在于有几个1就循环几次,较为精简
小白在代码学习中的一些记录。。。