||
我在stm8上用0x0001/0xffff测试,测试结果如下....
循环法会随着bit为1的个数增加而耗时增加,
hsztc的算法则不会,计算时间较为固定
无矶酸写的循环法只是看上去似乎很美....却多做了些工作-_-
==================================
1. 我写的 31T/226T
u8 bit1_count(u16 data)
{
u8 i = 0;
do
{
if(data&1)
i++;
data>>=1;
} while(data!=0);
return i;
}
==================================
2. hsztc写的 112T/112T
unsigned char countbit(unsigned int x)
{
x = (x & 0x5555) + ((x >> 1) & 0x5555);
x = (x & 0x3333) + ((x >> 2) & 0x3333);
x = (x & 0x0f0f) + ((x >> 4) & 0x0f0f);
x = (x & 0x00ff) + ((x >> 8) & 0x00ff);
return(x);
}
==================================
3. 无矶酸写的 41T/311T
u8 bit1_count(u16 data)
{
u8 i = 0;
while (data != 0)
{
data &= data -1;
i++;
}
return i;
}
data &= data -1;
就是把data具有1的位中最低的那个清零
while (data != 0)
{
data &= data -1;
i++;
}
data有多少个1,就循环多少次, 效率相对更高些。
另外,试了下 data |= data +1;
把data具有0位最低的那一位置1