免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5905 | 回复: 13
打印 上一主题 下一主题

如何求解一个无符号整形数是2的多少次方? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-31 21:36 |只看该作者 |倒序浏览
就是一个unsigned整形数据只有一个bit位为1;求这个bit的位置;

问题背景,我用一个无符号整形数映射一个32个key值的使用情况;
现在需要求从后向前数,第一个0的bit位,用此bit生成一个特定的键值,键值本身有序;
所以我必须知道0bit位最低的那个字节,而且一定存在这个bit;

if (0xffffffff == unsignedi) return;

unsignedi = ~unsignedi;  转化为求从后向前数最低的一个为1的bit位;
unsignedj = unsignedi - (unsignedi & (unsignedi -1));
//如何继续进行计算unsignedj 对应bit的位置;------我不想一个一个bit找或者二分查找~~~
否则一开始就从后向前一个一个bit查找好的了~~~~~

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2010-08-01 10:45 |只看该作者
本帖最后由 bruceteen 于 2010-08-01 11:41 编辑

你觉得 bsf bsr 这两个汇编指令怎么样?

假如你必须用C的话,可以折半查找,比如
((a&0xFFFF0000!=0) ? 16 : 0)
| ((a&0xFF00FF00!=0) ? 8 : 0)
| ((a&0xF0F0F0F0!=0) ? 4 : 0)
| ((a&0xCCCCCCC!=0) ? 2 : 0)
| ((a&0xAAAAAAAA!=0) ? 1 : 0)

论坛徽章:
0
3 [报告]
发表于 2010-08-01 11:18 |只看该作者
你觉得 bsf bsr 这两个汇编指令怎么样?

假如你必须用C的话,可以折半查找,比如
((a&0xFFFF0000!=0) ? ...
bruceteen 发表于 2010-08-01 10:45



    Mark

论坛徽章:
0
4 [报告]
发表于 2010-08-01 11:23 |只看该作者
  1. #include <string.h>
  2. int ffs(unsigned int i);
复制代码
这个可以不

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
5 [报告]
发表于 2010-08-01 11:51 |只看该作者
这个可以不
daybreakcx 发表于 2010-08-01 11:23

类似于 _BitScanForward, _BitScanForward64 等其实就是 bsf 汇编指令,加上某个编译指令时,直接就用bsf替代了

论坛徽章:
0
6 [报告]
发表于 2010-08-01 15:34 |只看该作者
[quote]你觉得 bsf bsr 这两个汇编指令怎么样?

假如你必须用C的话,可以折半查找,比如
((a&0xFFFF0000!=0) ? ...
bruceteen 发表于 2010-08-01 10:45 [/quote]

蛮不错的,谢谢你;只是我不打算二分,也不打算一个一个找,就想看看有没有什么特殊的指令或者运算能达到此目的~~~~

论坛徽章:
0
7 [报告]
发表于 2010-08-01 15:39 |只看该作者
这个可以不
daybreakcx 发表于 2010-08-01 11:23



    就是为了效率,不会调用函数的,看来也只有汇编的效率要高的了,否则只能使用二分法~~~~~~~

论坛徽章:
0
8 [报告]
发表于 2010-08-01 15:57 |只看该作者
就是为了效率,不会调用函数的,看来也只有汇编的效率要高的了,否则只能使用二分法~~~~~~~
zbhddt6 发表于 2010-08-01 15:39
  1. #ifndef _FFS_H_
  2. #define _FFS_H_

  3. /*
  4. * A really hacky implementation copied from asm/bitops.h
  5. * to make it compile
  6. */
  7. inline int ffs(int x)
  8. {
  9.         int r = 1;

  10.         if (!x)
  11.                 return 0;
  12.         if (!(x & 0xffff)) {
  13.                 x >>= 16;
  14.                 r += 16;
  15.         }
  16.         if (!(x & 0xff)) {
  17.                 x >>= 8;
  18.                 r += 8;
  19.         }
  20.         if (!(x & 0xf)) {
  21.                 x >>= 4;
  22.                 r += 4;
  23.         }
  24.         if (!(x & 3)) {
  25.                 x >>= 2;
  26.                 r += 2;
  27.         }
  28.         if (!(x & 1)) {
  29.                 x >>= 1;
  30.                 r += 1;
  31.         }
  32.         return r;
  33. }

  34. #endif
复制代码
网上找的ffs的实现,个人觉得方法很巧,效率不错…………

论坛徽章:
0
9 [报告]
发表于 2010-08-01 21:34 |只看该作者
网上找的ffs的实现,个人觉得方法很巧,效率不错…………
daybreakcx 发表于 2010-08-01 15:57



    此二分法写的不错~~~~~~

论坛徽章:
0
10 [报告]
发表于 2010-08-02 09:46 |只看该作者
你觉得 bsf bsr 这两个汇编指令怎么样?

假如你必须用C的话,可以折半查找,比如
((a&0xFFFF0000!=0) ? ...
bruceteen 发表于 2010-08-01 10:45


果真好指令
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP