gxqcn 发表于 2009-2-3 09:16:31

原帖由 无心人 于 2009-2-3 09:02 发表 http://bbs.emath.ac.cn/images/common/back.gif
那这么描述可以么?
如果n本身满足最多2个bit是1,则是n
否则返回比n大的最小的2^k

还不确切。

正确的为:
如果n本身满足最多2个bit是1,则是n
否则返回 $2^k+2^(h+1)$,其中 $k,h$ 分别为 n 的bit=1的最高位及次高位。

无心人 发表于 2009-2-3 09:20:44

mov eax, n
    mov edi, eax
    cmpeax, 6
    jbe exit
    bsrecx, eax
    mov edx, 1
    shl edx, cl
    mov ebx, edx
    xor eax, edx
    bsr ecx, eax
    jzl1
    mov edx, 1
    shl edx, cl
    xor eax, edx
    jz l1
    shl edx, 1
    add ebx, edx
    mov eax, ebx
    jmp exit
l1:
    mov eax, edi
exit:

无心人 发表于 2009-2-3 09:22:25

===================================================
呵呵该死的chrome, 让我看不到你们的式子的真实样子
确实是11#的样子

无心人 发表于 2009-2-3 09:37:00

12#应该差不多了吧

无心人 发表于 2009-2-3 09:44:32

化简1   
    movebx, n
    cmpebx, 6
    jbe l1
    bsrecx, ebx
    mov edx, 1
    shl edx, cl
    mov eax, edx
    xor ebx, edx
    bsr ecx, ebx
    jzl1
    mov edx, 1
    shl edx, cl
    xor ebx, edx
    jz l1
    shl edx, 1
    add eax, edx
    jmp exit
l1:
    mov eax, n
exit:

无心人 发表于 2009-2-3 09:50:49

化简2   
    movebx, n
    cmpebx, 6
    jbe l1
    bsrecx, ebx
    mov edx, 1
    shl edx, cl
    mov eax, edx
    xor ebx, edx
    bsr ecx, ebx
    jzl1
    mov edx, 1
    shl edx, cl
    xor ebx, edx
    jz l1
    lea, eax,
    jmp exit
l1:
    mov eax, n
exit:

无心人 发表于 2009-2-3 09:57:30

:lol

再次化简就要Cache数组了
假设power = {1, 2, 4, 8, 16, 32, 64, 128}

化简3   
    movebx, n
    cmpebx, 6
    jbe l1
    bsrecx, ebx
    mov eax, dword ptr power
    xor ebx, eax
    bsr ecx, ebx
    jzl1
    mov edx, dword ptr power
    xor ebx, edx
    jz l1
    lea, eax,
    jmp exit
l1:
    mov eax, n
exit:

无心人 发表于 2009-2-3 10:02:50

:lol

下面就很难再化简了
已经低于32个时钟周期执行时间了
有谁测试下是否正确??
============================
bsr很难被更好的指令组代替,其执行时间不固定

无心人 发表于 2009-2-3 10:11:31

用C描述就是二分查找
预先把所有可能的结果增序排列
然后对输入n在序列中找
k <= n < m
的相邻的k, m
然后输出k

liangbch 发表于 2009-2-3 12:06:22

jzf 是什么指令,我这里编译不过。
页: 1 [2] 3 4 5 6 7 8 9 10 11
查看完整版本: 求bit位为1数目不超出2的正整数