电子自留地 https://passport2.21ic.com/?71510 [收藏] [复制] [RSS] 记录生活点滴,  规划美好生活。

日志

怎么样快速的判断一个int (16bit)型数据里面有多少个1

已有 1312 次阅读2010-12-28 05:35 |个人分类:程序宝典|系统分类:资源宝藏

我在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 


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)