在线时间3109 小时
UID3327992
注册时间2018-4-5
NXP金币11645
TA的每日心情 | 奋斗 昨天 13:59 |
---|
签到天数: 2432 天 连续签到: 9 天 [LV.Master]伴坛终老
版主
  
- 积分
- 22619
- 最后登录
- 2025-9-20
|
本帖最后由 流水源 于 2022-12-16 16:13 编辑
最近项目有用到一些简单问题求解算法,下面就这些算法记录下来。
1、计算一个32位bit长整型数中bit 1的个数。这个算法主要用于在某些情况下,通过置位1标识不同位置的有或无,然后统计标志位有或无的数量。
假设32位数为0x00005555 = 0000 0000 0000 0000 0101 0101 0101 0101B,那么bit 1的个数为8。
下面就如何用程序算法解决方式。
首先想到的是通过右移,后 & 0x00000001。
- uint32_t GetBit1Count(uint32_t flag)
- {
- uint32_t i,n;
- for(i=0,n=0;i<32;i++)
- {
- if(flag & 0x00000001) n++;
- }
- return n;
- }
复制代码 不过觉得上面这种方法不够优美,所以搜索了一下找到了另一种方法。这种方法比上一种更好的在于当bit 1的个数越少时,循环次数就少。
计算如下:- uint32_t GetBit1Count(uint32_t flag)
- {
- uint32_t n;
- while(flag)
- {
- flag &= (flag-1);
- n++;
- }
- return n;
- }
复制代码 再增加一种方法。也比较巧妙,主要是相邻bit位相加。- uint32_t GetBit1Count(uint32_t flag)
- {
- flag = (flag &0x55555555) + ((flag >>1) &0x55555555) ;
- flag = (flag &0x33333333) + ((flag >>2) &0x33333333) ;
- flag = (flag &0x0f0f0f0f) + ((flag >>4) &0x0f0f0f0f) ;
- flag = (flag &0x00ff00ff) + ((flag >>8) &0x00ff00ff) ;
- flag = (flag &0x0000ffff) + ((flag >>16) &0x0000ffff) ;
- return flag ;
- }
复制代码 解析如下图:
2、查找一个32位bit长整型数中bit 1,或者bit 0在从低到高顺序中首先出现的位置;bit 1或bit 0从高到低顺序首先出现的位置。
|
|