数学研发论坛

 找回密码
 欢迎注册
楼主: gxqcn

[擂台] 求bit位为1数目不超出2的正整数

[复制链接]
 楼主| 发表于 2009-2-3 09:16:31 | 显示全部楼层
原帖由 无心人 于 2009-2-3 09:02 发表
那这么描述可以么?
如果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
    cmp  eax, 6
    jbe exit
    bsr  ecx, eax
    mov edx, 1
    shl edx, cl
    mov ebx, edx
    xor eax, edx
    bsr ecx, eax
    jz  l1
    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   
    mov  ebx, n
    cmp  ebx, 6
    jbe l1
    bsr  ecx, ebx
    mov edx, 1
    shl edx, cl
    mov eax, edx
    xor ebx, edx
    bsr ecx, ebx
    jz  l1
    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   
    mov  ebx, n
    cmp  ebx, 6
    jbe l1
    bsr  ecx, ebx
    mov edx, 1
    shl edx, cl
    mov eax, edx
    xor ebx, edx
    bsr ecx, ebx
    jz  l1
    mov edx, 1
    shl edx, cl
    xor ebx, edx
    jz l1
    lea, eax, [eax + 2 * edx]
    jmp exit
l1:
    mov eax, n
exit:
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-3 09:57:30 | 显示全部楼层


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

化简3   
    mov  ebx, n
    cmp  ebx, 6
    jbe l1
    bsr  ecx, ebx
    mov eax, dword ptr power[ecx]
    xor ebx, eax
    bsr ecx, ebx
    jz  l1
    mov edx, dword ptr power[ecx]
    xor ebx, edx
    jz l1
    lea, eax, [eax + 2 * edx]
    jmp exit
l1:
    mov eax, n
exit:
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-3 10:02:50 | 显示全部楼层


下面就很难再化简了
已经低于32个时钟周期执行时间了
有谁测试下是否正确??
============================
bsr很难被更好的指令组代替,其执行时间不固定
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-3 10:11:31 | 显示全部楼层
用C描述就是二分查找
预先把所有可能的结果增序排列
然后对输入n在序列中找
k <= n < m
的相邻的k, m
然后输出k
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-3 12:06:22 | 显示全部楼层
jzf 是什么指令,我这里编译不过。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2019-12-11 15:45 , Processed in 0.056760 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表