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