免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
21 [报告]
发表于 2008-08-25 13:55 |只看该作者
插值

(x==1)*1+(x==2)*2+(x==4)*3+(x==8)*4+(x==16)*5+(x==32)*6+(x==64)*7+(x==128)*8

论坛徽章:
0
22 [报告]
发表于 2008-08-25 14:29 |只看该作者
原帖由 zx_wing 于 2008-8-25 13:32 发表

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

static inline unsigned long __ffs(unsigned long word)
{
    if ( !word )
        return - ...



内核的代码就是写得好,很值得学习!

论坛徽章:
0
23 [报告]
发表于 2008-08-25 14:36 |只看该作者
原帖由 emacsnw 于 2008-8-25 13:50 发表
这个如何?呵呵。


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

int locate_set_bit(int x) {
  return foo[x];
}


如何减少空间的损耗?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
24 [报告]
发表于 2008-08-25 14:45 |只看该作者
原帖由 retuor 于 2008-8-25 13:55 发表
插值

(x==1)*1+(x==2)*2+(x==4)*3+(x==*4+(x==16)*5+(x==32)*6+(x==64)*7+(x==12*8


这个有创意..

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
25 [报告]
发表于 2008-08-25 14:47 |只看该作者
static inline unsigned long __ffs(unsigned long word)
{
    if ( !word )
        return -1;

    asm("bsf %1,%0"
            : "=r" (word)
            : "rm" (word));

    return word;
}

这个好是好.. 不过本人不懂汇编. 不敢用啊.

论坛徽章:
0
26 [报告]
发表于 2008-08-25 15:07 |只看该作者
最好的就是依次与0x1,0x2,0x4,0x8,0x10,0x20,0x4,0x80比较,成功就返回对应结果。
平均只需比较4次,读一次内存。类似与查表,但这个表在指令的立即数里。

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


如何减少空间的损耗?

hash table

论坛徽章:
8
白羊座
日期:2015-01-21 18:35:03巳蛇
日期:2015-02-03 17:30:37处女座
日期:2015-02-03 17:31:02羊年新春福章
日期:2015-02-03 17:31:21巨蟹座
日期:2015-02-05 16:01:06申猴
日期:2015-02-05 16:01:31摩羯座
日期:2015-02-05 16:01:41酉鸡
日期:2015-02-05 16:02:37
28 [报告]
发表于 2008-08-25 17:09 |只看该作者
直接给出对应公式即可,不就是8种情况嘛

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
29 [报告]
发表于 2008-08-25 17:30 |只看该作者
二分法就行了吧

  1. int get_byte_bit(int x){
  2.     static int arr[8] = {1,2,4,8,16,32,64,128};
  3.     int low;
  4.     int high;
  5.     int index;

  6.     low = 0;
  7.     high = 7;
  8.     do{
  9.         index = (low + high) / 2;
  10.         if(arr[index] == x){
  11.             return index + 1;
  12.         }
  13.         if(arr[index] > x){
  14.             high = index - 1;
  15.         }
  16.         else {
  17.             low = index + 1;
  18.         }
  19.     }while(low <= high);

  20.     return -1;
  21. }
复制代码

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
30 [报告]
发表于 2008-08-25 17:51 |只看该作者
呵呵..算法用得不错..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP