无心人 发表于 2009-2-4 21:25:36

:)
   SSE2做这个题目可能能超过宝宝的代码

   emms在浮点前用就可以了

gxqcn 发表于 2009-2-4 21:25:45

我还计划 64位 的 HugeCalc,
将主动放弃对部分老型号的 CPU 的支持(即无相关指令集的),
追求的就是效率。

无心人 发表于 2009-2-4 21:28:16

:L

   支持64位的系统,目前似乎都支持SSE2

当然Cell和MIPS等不是你考虑的吧,哈哈

liangbch 发表于 2009-2-4 21:28:31

回19#,这样虽然没有跳转指令,但对于任意一个输入,都要执行好多条指令,而我的那个汇编版本,对于任意一个数,最多仅需要执行8条指令。
另外,无心人如有时间的话,可测试一下各个版本,看看那个更快。

无心人 发表于 2009-2-4 21:30:27

就是说,要找到个少于8条指令的SIMD版本

无心人 发表于 2009-2-4 21:36:42

刚尝试SSE2,大概在20条指令左右, 不理想

无心人 发表于 2009-2-5 08:23:40

利用宝宝的思路能得到一个简单的汇编算法

    假设初始化一个表,有32项,每项两个值,
    对i = 0..31
      第一个是2^i, 如果2^i < 10^k < 2^(i+1), 则是10^k
      第二个是第一个的题目意义的位数

    假设表名t
   
    t [] = {1, 1, 2, 1, 4, 1, 10, 2, 16, 2, 32, 2, 100, 3, 128, 3, 256, 3, 1000, 4, 1024, 4, 2048, 4, 4096, 4, 10000, 5, 16384, 5, 32468, 5
            100000, 6, 131072, 6,262144, 6, 1000000, 7, 1048576, 7,2097152, 7,4194304, 7, 10000000, 8,16777216, 8
               33554432, 8, 100000000, 9,134217728, 9,268435456, 9, 1000000000, 10, 1073741824, 10,2147483648, 10}

无心人 发表于 2009-2-5 08:26:08

movedx, n
    bsrecx, edx
    push ebx
    mov eax,
    movebx, eax
    sub ebx, 1
    cmpedx,
    cmovbeax, ebx
    pop ebx
=====================
9条指令

无心人 发表于 2009-2-5 08:29:19

或者利用setcc

    mov edx, n
    bsrecx, edx
    mov eax,
    push ebx
    xor ebx, ebx
    cmp edx,
    setb bl
    sub eax, ebx
    pop ebx
=====================
还是9条, 如果能想办法只用3个寄存器,则就更完美了

无心人 发表于 2009-2-5 08:34:57

===========================
    mov eax, n   
    bsrecx, eax
    xor edx, edx
    cmpeax,
    setb dl
    mov eax,
    sub eax, edx   
============================
7条指令!!!!
页: 1 2 [3] 4 5 6 7
查看完整版本: 求一个无符号整数的10进制位数