shshsh_0510
发表于 2009-2-5 10:29:47
18#liangbch 的程序,最差情况也就执行这么几句,恐怕很难优化了
bsr eax,ecx
jmpDWORD PTR JTAB_1004
cmpecx, 100
sbbeax, eax
addeax, 3
ret
但是,在平均意义下,4294967295个数中有
3294967296 个返回 10
900000000个返回 9
90000000 个返回 8
9000000 个返回 7
900000 个返回 6
90000 个返回 5
9000 个返回 4
900 个返回 3
90 个返回 2
9 个返回 1
于是,将19#无心人的顺序倒过来,假设每多判断一层多3条指令,以指令条数计算复杂性有:
平均复杂性 = (3294967296*3+900000000*6+90000000*9+9000000*12+900000*15+90000*18+9000*21+900*24+90*27+9*30)/4294967295=3.8
也不差呀:)
无心人
发表于 2009-2-5 10:57:43
呵呵
谁有兴趣比较下时间差异????
suan1024
发表于 2009-2-5 13:45:00
我不知道怎么算位数
我只知道按计算器int(log10(n))+1
无心人
发表于 2009-2-5 14:16:50
呵呵
以后不能和 shshsh_0510以及mathe 一起论问题
什么问题都要计算这么精确
很理智的说
gxqcn
发表于 2009-2-6 13:40:49
分享一个搜索到的页面:
Calculating number of digits from 64Bit-Unsigned-Integer
无心人
发表于 2009-2-6 14:14:25
呵呵
锅老大提供的连接上面的算法,似乎并不比我们实现的有多好啊
64位的也能用我提供的查表法(根据宝宝的算法)解决,不过要用SSE2了
无心人
发表于 2009-2-6 14:22:21
呵呵
不过64位的不跳转的可就难了啊
无心人
发表于 2009-2-6 14:29:40
呵呵
不知道VC2008支持跳转表么?
马上测试去
无心人
发表于 2009-2-6 14:37:08
#include "stdafx.h"
int JmpTest(void)
{
__asm
{
mov eax, 1
mov edx, jmp1
jmp edx
jmp1:
mov ecx, 2
jmp exit1
jmp2:
mov ecx, 3
jmp exit1
exit1:
mov eax, ecx
}
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("%d\n", JmpTest());
return 0;
}
===================================
可以通过编译,也能执行!!!!
现在去做真正的跳转表!!!!
无心人
发表于 2009-2-6 14:48:17
/ JmpTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
int JmpTest(void)
{
__asm
{
mov eax, 1
mov edx, jmpTable
mov ecx, 2
add edx, ecx
jmp edx
jmpTable:
jmp jmp1
jmp jmp2
jmp1:
mov ecx, 2
jmp exit1
jmp2:
mov ecx, 3
jmp exit1
exit1:
mov eax, ecx
}
}
int _tmain(int argc, _TCHAR* argv[])
{
printf("%d\n", JmpTest());
return 0;
}
================================
VC2008, 真正的跳转表, 也可编译,可执行
但现在问题是当前的标号都是短标号(偏移在-128 -- 127内)
所以jmp表指令都是2字节的
不知道,长汇编是否有差异