免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: cookis
打印 上一主题 下一主题

有没有好的公式. 能得出 一个byte中哪一位是1 如 00000100 得出3,(第三位是1), [复制链接]

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
11 [报告]
发表于 2008-08-25 13:31 |只看该作者
就是测试那一位被置位了啊

论坛徽章:
0
12 [报告]
发表于 2008-08-25 13:32 |只看该作者
原帖由 cookis 于 2008-8-25 13:01 发表
我想要的是公式..
不想用函数或循环之类的方法.

一句话搞定的方法.

一句可以搞定的方法?有,x86下一条指令就可以了,'bsf xxx, xxx'
看看内核是怎么做的:
封装了一下:

  1. static inline unsigned long __ffs(unsigned long word)
  2. {
  3.     if ( !word )
  4.         return -1;

  5.     asm("bsf %1,%0"
  6.             : "=r" (word)
  7.             : "rm" (word));

  8.     return word;
  9. }
复制代码


不用指令的方法,就不是一句了,当然你可以可以把它们写成一句,不过我想没有这么多一句就搞定的事情。


  1. /**
  2. * __ffs - find first bit in word.
  3. * @word: The word to search
  4. *
  5. * Undefined if no bit exists, so code should check against 0 first.
  6. */
  7. static inline unsigned long __ffs(unsigned long word)
  8. {
  9.         int num = 0;

  10. #if BITS_PER_LONG == 64
  11.         if ((word & 0xffffffff) == 0) {
  12.                 num += 32;
  13.                 word >>= 32;
  14.         }
  15. #endif
  16.         if ((word & 0xffff) == 0) {
  17.                 num += 16;
  18.                 word >>= 16;
  19.         }
  20.         if ((word & 0xff) == 0) {
  21.                 num += 8;
  22.                 word >>= 8;
  23.         }
  24.         if ((word & 0xf) == 0) {
  25.                 num += 4;
  26.                 word >>= 4;
  27.         }
  28.         if ((word & 0x3) == 0) {
  29.                 num += 2;
  30.                 word >>= 2;
  31.         }
  32.         if ((word & 0x1) == 0)
  33.                 num += 1;
  34.         return num;
  35. }

复制代码

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
13 [报告]
发表于 2008-08-25 13:32 |只看该作者
该数字右移,并不断的和0x01 进行逻辑与就可以了,并作相应的计数

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
14 [报告]
发表于 2008-08-25 13:33 |只看该作者

  1. unsigned char c;/*test this byte*/
  2. ....
  3. unsigned char ret;
  4. ret=((c&(unsigned char)0xaa)>>1)+(c&(unsigned char)0x55);
  5. ret=((ret&(unsigned char)0xcc)>>2)+(c&(unsigned char)0x33);
  6. ret=((ret&(unsigned char)0xff)>>4)+(c&(unsigned char)0x33);
  7. if(ret==1) {
  8. ....
  9. }
复制代码

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
15 [报告]
发表于 2008-08-25 13:37 |只看该作者
原帖由 Godbach 于 2008-8-25 13:32 发表
该数字右移,并不断的和0x01 进行逻辑与就可以了,并作相应的计数


想的跟我写的代码是一樣的,哈哈!

论坛徽章:
0
16 [报告]
发表于 2008-08-25 13:41 |只看该作者
R 到 R 的映射,固定了 8 个值的对应,总可以用插值得到一个多项式 f。

论坛徽章:
0
17 [报告]
发表于 2008-08-25 13:42 |只看该作者
参考:http://bbs.chinaunix.net/thread-1240927-1-7.html
中get_empty,你这个相当于get_full(如果有的话)。

[ 本帖最后由 jamesr 于 2008-8-25 13:44 编辑 ]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
18 [报告]
发表于 2008-08-25 13:50 |只看该作者

回复 #14 cjaizss 的帖子

查表法:
static int table[]={0,1,1,0,1,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}

论坛徽章:
0
19 [报告]
发表于 2008-08-25 13:50 |只看该作者
这个如何?呵呵。


  1. int foo[256];
  2. foo[1] = 1; foo[2] = 2; foo[4] = 3; foo[8] = 4;
  3. foo[16] = 5; foo[32] = 6; foo[64] = 7; foo[128] = 8;

  4. int locate_set_bit(int x) {
  5.   return foo[x];
  6. }
复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
20 [报告]
发表于 2008-08-25 13:52 |只看该作者
最简单的一种:
if( (i&(i-1))==0 && i)
哦,理解错了LZ的意思,还是查表法吧

[ 本帖最后由 cjaizss 于 2008-8-25 13:53 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP