免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
31 [报告]
发表于 2008-08-25 17:55 |只看该作者
用 hash 的实现,不过不是 c 的。

http://bbs.chinaunix.net/thread-546293-73-1.html


730 楼.

[ 本帖最后由 retuor 于 2008-8-25 18:06 编辑 ]

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:49:45
32 [报告]
发表于 2008-08-26 00:14 |只看该作者
这个问题用得着那么复杂么?
8位中既然肯定了只有一位为1为什么不用switch?

  1. int one(unsigned char c) {
  2.   switch(c) {
  3.     case 1:
  4.       return 1;
  5.     case 2:
  6.       return 2;
  7.     case 4:
  8.       return 3;
  9.      .
  10.      .
  11.      .
  12.   }
  13. }
复制代码


ps:  这点效率真的那么重要么?

论坛徽章:
0
33 [报告]
发表于 2008-08-26 01:16 |只看该作者

最简单用对数

用对数最直接,但是这不是效率最高的方式
另外,我的系统的对数好像有问题,另外找一个对数函数实现。

  1. double my_log2(double x)
  2. {
  3.    register double ret;
  4.    __asm__(
  5.       "fld1\n\t"
  6.       "fxch\n\t"
  7.       "fyl2x"
  8.       : "=t" (ret)
  9.       : "0" (x)
  10.    );
  11.    return ret;
  12. }

  13. int main()
  14. {
  15.    unsigned char tmp=1;

  16.   while(tmp != 0x00)
  17. {
  18.        printf("%d, 1 p is %d \n",tmp, (int)my_log2((double)tmp)  + 1);
  19.        tmp <<= 1;
  20.   }
  21.   return 0;
  22. }
复制代码

[ 本帖最后由 poor-man 于 2008-8-26 01:27 编辑 ]

论坛徽章:
0
34 [报告]
发表于 2008-08-26 08:55 |只看该作者
原帖由 koolcoy 于 2008-8-26 00:14 发表
这个问题用得着那么复杂么?
8位中既然肯定了只有一位为1为什么不用switch?

int one(unsigned char c) {
  switch(c) {
    case 1:
      return 1;
    case 2:
      return 2;
    case 4:
    ...

这是最简单,效率最好的方法。

不信可以写个测试程序试试。

论坛徽章:
0
35 [报告]
发表于 2008-08-26 09:25 |只看该作者
其实使用查表法是最快的。
我觉得是除了汇编之外最好的C代码。

论坛徽章:
0
36 [报告]
发表于 2008-08-26 12:57 |只看该作者
原帖由 Roemer 于 2008-8-25 15:39 发表

hash table

具体的hash公式呢?这个很难找到

论坛徽章:
0
37 [报告]
发表于 2008-08-26 15:14 |只看该作者
原帖由 huangwei0413 于 2008-8-26 12:57 发表

具体的hash公式呢?这个很难找到


C++ 有 stl,c 的肯定也能找到,但不如 stl 标准。

论坛徽章:
0
38 [报告]
发表于 2008-08-26 21:27 |只看该作者
原帖由 koolcoy 于 2008-8-26 00:14 发表
这个问题用得着那么复杂么?
8位中既然肯定了只有一位为1为什么不用switch?

int one(unsigned char c) {
  switch(c) {
    case 1:
      return 1;
    case 2:
      return 2;
    case 4:
    ...


good!

论坛徽章:
0
39 [报告]
发表于 2008-08-26 22:13 |只看该作者
SWITCH 不好, 速度不如移位.



原帖由 system888net 于 2008-8-26 21:27 发表


good!

论坛徽章:
0
40 [报告]
发表于 2008-08-26 22:32 |只看该作者
map<int, int> table;
table[1] = 1
table[2] = 2
table[4] = 3
table[8] = 4
table[16] = 5
table[32] = 6
table[64] = 7
table[128] = 8
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP