前几天看到这篇文章,挺有意思。
嵌入式Linux:看看大神是如何计算32位数中‘1’的个数zhuanlan.zhihu.com然后在gd32f350开发板上把各种算法都试了一遍,消耗时钟周期数如下:
- 原文的算法:
register int xx=x;
xx=xx-((xx>>1)&0x55555555);
xx=(xx&0x33333333)+((xx>>2)&0x33333333);
xx=(xx+(xx>>4))&0x0f0f0f0f;
xx=xx+(xx>>8);
return (xx+(xx>>16)) & 0xff;
这个最快,23个时钟周期。
2. 原文作者自创算法:
int i = 0;
int s = 0;
for(i = 0;i<32;i++)
{
if(x&0x01)
s ++;
x = x>>1;
}
return (s);
这个最直白,不过性能差远了,需要205个时钟周期。
3. 上述算法,循环体全部展开,134时钟周期。
4. 上述算法,把if(x&