无心人 发表于 2009-2-3 14:17:28

假设n的前2个bit = 1的索引是i, j
则结果是
2^i + [(2^j) << (n - 2^i - 2^j * (n & (n-1) != 0) != 0) ] * (n&(n-1) !=0)

无心人 发表于 2009-2-3 14:25:59

不对

这个复杂式子, 不可能用15条指令能完成

无心人 发表于 2009-2-3 14:38:05

mov ebx, n
   mov eax, 1
   bsr ecx, ebx
   shl eax, cl
   sub ebx, eax
   mov edx, 1
   mov esi, 0
   bsr ecx, ebx
   shl edx, cl
   cmovne esi, edx
   add eax, esi
   mov edi, 0
   sub ebx, edx
   cmovne edi, esi
   add eax, edi

==================
这么做么?

gxqcn 发表于 2009-2-3 14:58:39

原帖由 无心人 于 2009-2-3 14:05 发表 http://bbs.emath.ac.cn/images/common/back.gif
可能还利用了cmovcc?

猜对了!

gxqcn 发表于 2009-2-3 15:02:29

刚才查了下指令周期表,
发现AMD的BSR指令周期狂长:28,
Intel的就好很多(=2)。

无心人 发表于 2009-2-3 15:03:37

优化下
   mov eax, 1
   bsr ecx, n
   shl eax, cl
   sub n, eax
   xor edx, edx
   bsr ecx, n
   setne dl
   shl edx, cl
   add eax, edx
   xor ecx, ecx
   sub n, edx
   cmovne ecx, edx
   add eax, ecx
====================

无心人 发表于 2009-2-3 15:04:26

没有bsr几乎不能做到很完美

无心人 发表于 2009-2-3 15:06:33

36#应该类似GxQ的想法吧
而且加上ret还少一条
现在就看setne是否好了
==========================
似乎看P4/Core2的执行周期
这个版本并不存在长指令

shshsh_0510 发表于 2009-2-3 15:14:55

那也不一定,如果只看速度不在乎内存的话,可以用hash
比如为8位做一个256项的表,检测前8位,只有33/256的数据不能立即返回,需要再检验后面。
不用汇编未必会比你们慢

无心人 发表于 2009-2-3 15:20:19

:lol

汇编大概在20个时钟周期内就能完成
hash光一个除法就至少20周期
页: 1 2 3 [4] 5 6 7 8 9 10 11
查看完整版本: 求bit位为1数目不超出2的正整数