6758|4

6423

帖子

16

TA的资源

版主

楼主
 

删繁就简--0 bit位置查找 [复制链接]


具体背景就不说了,有这么一种需求就是从一个32bit DWORD中找出第一个0的位置,从高位开始找或者从低位开始找
从高位开始查找如下:
  1. unsigned int bit0search_msb(unsigned int x)
  2. {
  3.     unsigned int pos = 0;
  4.     if(0xffffffff == x)
  5.     {
  6.         return 0xffffffff;
  7.     }
  8.     if(0xffff0000 != (x & 0xffff0000))
  9.     {
  10.         x >>= 16;
  11.         pos += 16;
  12.     }
  13.     if(0xff00 != (x & 0xff00))
  14.     {
  15.         x >>= 8;
  16.         pos += 8;
  17.     }
  18.     if(0xf0 != (x & 0xf0))
  19.     {
  20.         x >>= 4;
  21.         pos += 4;
  22.     }
  23.     if(0xc != (x & 0xc))
  24.     {
  25.         x >>= 2;
  26.         pos += 2;
  27.     }
  28.     if(0x2 != (x & 0x2))
  29.     {
  30.         pos += 1;
  31.     }

  32.     return pos;
  33. }
复制代码

从地位开始查找如下:
  1. unsigned int bit0search_lsb(unsigned int x)
  2. {
  3.     unsigned int pos = 0;
  4.     if(0xffffffff == x)
  5.     {
  6.         return 0xffffffff;
  7.     }
  8.     if(0xffff  == (x & 0xffff))
  9.     {
  10.         x >>= 16;
  11.         pos += 16;
  12.     }
  13.     if(0xff == (x & 0xff))
  14.     {
  15.         x >>= 8;
  16.         pos += 8;
  17.     }
  18.     if(0xf == (x & 0xf))
  19.     {
  20.         x >>= 4;
  21.         pos += 4;
  22.     }
  23.     if(0x3 == (x & 0x3))
  24.     {
  25.         x >>= 2;
  26.         pos += 2;
  27.     }
  28.     if(0x1 == (x & 0x1))
  29.     {
  30.         pos += 1;
  31.     }
  32.     return pos;
  33. }
复制代码

以上两段代码都是采用的二分法进行查找,为了验证该算法是否正确,与遍历bit方法进行对比
  1. unsigned int bit0check_msb(unsigned int x)
  2. {
  3.     unsigned int i;
  4.     for(i=31; i>=0; i--)
  5.     {
  6.         if(0 == ((x >> i) & 0x1))
  7.         {
  8.             return i;
  9.         }
  10.     }

  11.     return 0xffffffff;
  12. }
  13. unsigned int bit0check_lsb(unsigned int x)
  14. {
  15.     unsigned int i;
  16.     for(i=0; i<32; i++)
  17.     {
  18.         if(0 == ((x >> i) & 0x1))
  19.         {
  20.             return i;
  21.         }
  22.     }
  23.     return 0xffffffff;
  24. }
  25. int main(void)
  26. {
  27.     unsigned int pos, pos1;
  28.     unsigned int i;
  29.     for(i=0; i<0xffffffff; i++)
  30.     {
  31.         pos = bit0search_lsb(i);
  32.         pos1 = bit0check_lsb(i);
  33.         if(pos != pos1)
  34.         {
  35.             printf("error!!!  i %d, pos %d, pos1 %d\n", i, pos, pos1);
  36.             return -1;
  37.         }
  38.     }
  39.     printf("all right\n");
  40.     return 0;
  41. }
复制代码



此帖出自编程基础论坛

最新回复

楼主有测过哪个算法的效率更高吗,从代码量上看,逐位查找要更简洁明了,而二分法没有循环,代码复杂,执行效率可能更高,不知道效率怎么样  详情 回复 发表于 2016-12-6 23:18
点赞 关注(1)
个人签名training
 

回复
举报

483

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
楼主,你这个程序在实际运行当中会有问题,虽然我不知道你具体的应用环境,如果数据出错成二进制00001011的样子,如果用等于判断1111就会出错,还是用大于,或者不小于什么的吧
此帖出自编程基础论坛

点评

不是很明白你的意思啊?这个我做过遍历的对比测试了没有问题啊,只要是32为无符号都没有问题啊  详情 回复 发表于 2016-9-22 23:12
 
 
 

回复

6423

帖子

16

TA的资源

版主

板凳
 
yl20084784 发表于 2016-9-22 22:52
楼主,你这个程序在实际运行当中会有问题,虽然我不知道你具体的应用环境,如果数据出错成二进制00001011的 ...

不是很明白你的意思啊?这个我做过遍历的对比测试了没有问题啊,只要是32为无符号都没有问题啊
此帖出自编程基础论坛
 
个人签名training
 
 

回复

466

帖子

0

TA的资源

版主

4
 
感觉不知道什么条件下需要, 没用过找bit位的
此帖出自编程基础论坛
 
 
 

回复

1972

帖子

1

TA的资源

五彩晶圆(初级)

5
 
楼主有测过哪个算法的效率更高吗,从代码量上看,逐位查找要更简洁明了,而二分法没有循环,代码复杂,执行效率可能更高,不知道效率怎么样
此帖出自编程基础论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表