免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
71 [报告]
发表于 2008-09-04 17:27 |只看该作者
写的怎么变了,再补上,
#define GetBitN(b)   ((b==1)*1 + (b==2)*2 + (b==4)*3 + (b==*4 + (b==16)*5 + (b==32)*6 + (b==64)*7 + (b==12*

论坛徽章:
0
72 [报告]
发表于 2008-09-04 17:28 |只看该作者
晕,还是变

论坛徽章:
0
73 [报告]
发表于 2008-09-05 15:03 |只看该作者
数组,查表...

论坛徽章:
0
74 [报告]
发表于 2008-09-15 11:30 |只看该作者
汇编那个应该最快, 一个指令周期就可以搞定, 只要一个存储单元, 计算都在内部寄存器里搞定. 如果需要在更长的位串里面进行测试, 还可以考虑MMX, 或者SSE, 现在amd和intel的cpu都支持这些指令.

第二快得就是查表, 如果不是重复复计算byte中的这个有效位, 优势也不大, 因为建立表也要花费时间, 否则就很快. 不过比单指令的汇编多了计算地址的操作. 这两个是O(1)的时间复杂度, 时间单位是指令周期哦.

插值多项式很有创意, 但是执行起来由于乘法运算不见得比for循环快, 而且占了O(n)的指令空间, O(n)的时间复杂度,不实用.

switch就更不实用了, 平均起来, 每个test做4次的比较和跳转, 而且生成大量的指令, 跳转可是性能的杀手, 能不用就不用. switch 就象把车从高速开到石子路上一样, 痛苦.

对数表达起来很简单, 但是运算起来却很慢, 查表或者逼近, 而且还是浮点运算, 效率很差.

论坛徽章:
0
75 [报告]
发表于 2008-09-21 16:39 |只看该作者

回复 #9 win_hate 的帖子

本来我也这么想的

论坛徽章:
0
76 [报告]
发表于 2008-09-21 19:06 |只看该作者
原帖由 selfrun 于 2008-8-28 21:12 发表
unsigned char bit_index(unsigned char _val)
{
   unsigned char retval = _val - 1;
   retval = ((retval >> 1) & 0x55) + (retval & 0x55);
   retval = ((retval >> 2) & 0x33) + (retval & 0x33);
...

不懂,请问这个公式是如何推出来的?

论坛徽章:
0
77 [报告]
发表于 2008-09-21 22:58 |只看该作者
有一个内核函数!!

ffsl这个里面去找一下!!!

论坛徽章:
0
78 [报告]
发表于 2008-09-22 00:10 |只看该作者
原帖由 nbkjbo 于 2008-9-21 16:39 发表
本来我也这么想的


但是现在不这么想了?

论坛徽章:
0
79 [报告]
发表于 2008-09-23 20:18 |只看该作者
这个题目有一个好办法:
   不过2的N次方的数不能求出来,其余的肯定没错:

     char a = 0x** ;
   
     int b = a&-a;
   
     b 就是结果~~~~

论坛徽章:
1
射手座
日期:2013-08-21 13:11:46
80 [报告]
发表于 2008-09-23 21:03 |只看该作者
对数正解
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP