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字节的
不知道,长汇编是否有差异
页: 1 2 3 [4] 5 6 7
查看完整版本: 求一个无符号整数的10进制位数