免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
51 [报告]
发表于 2008-08-28 12:47 |只看该作者
原帖由 jamesr 于 2008-8-28 12:25 发表


楼主的要求就是这样的啊?

有多个bit为1的也可以用switch,返回第一个为1的bit号
参看17楼

看了,还是用了循环。
还是内核里面这个逻辑最简单

  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. }
复制代码

论坛徽章:
0
52 [报告]
发表于 2008-08-28 13:11 |只看该作者
我有一个用小表的方案,思路与楼上贴的代码很类似。我的只递归一步就停止了


  1. int
  2. nth_bit(int x)
  3. {
  4.         static t[17];
  5.         t[1]=1, t[2]=2, t[4]=3, t[8]=4;

  6.         if (x & 0xf)
  7.                 return t[x];
  8.         else
  9.                 return t[x>>4]+4;
  10. }
复制代码

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
53 [报告]
发表于 2008-08-28 13:55 |只看该作者
原帖由 win_hate 于 2008-8-28 13:11 发表
我有一个用小表的方案,思路与楼上贴的代码很类似。我的只递归一步就停止了


int
nth_bit(int x)
{
        static t[17];
        t[1]=1, t[2]=2, t[4]=3, t[8]=4;

        if (x & 0xf)
                return t[x];
        else
                ret ...

这个不错
可以推广到N个byte去

论坛徽章:
0
54 [报告]
发表于 2008-08-28 14:55 |只看该作者
原帖由 retuor 于 2008-8-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
55 [报告]
发表于 2008-08-28 20:42 |只看该作者
楼上几位写得好.

论坛徽章:
1
技术图书徽章
日期:2014-03-06 15:32:30
56 [报告]
发表于 2008-08-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);
   retval = ((retval >> 4) & 0x0F) + (retval & 0x0F);
   return retval;
}

论坛徽章:
0
57 [报告]
发表于 2008-08-29 15:25 |只看该作者

回复 #1 cookis 的帖子

數學公式:
log2[Num] + 1

论坛徽章:
0
58 [报告]
发表于 2008-08-29 15:39 |只看该作者
原帖由 zx_wing 于 2008-8-28 10:40 发表

switch这个方法不好,只适用于只有一个bit为1的情形,不通用。

这个不是问题,k&(k-1)可以找出最后一个为1的bit

论坛徽章:
0
59 [报告]
发表于 2008-08-29 17:38 |只看该作者
硬件实现,利用8-3编码器扩展,直接出结果.

论坛徽章:
0
60 [报告]
发表于 2008-09-02 16:02 |只看该作者
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP