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

[擂台] 求一个无符号整数的10进制位数

[复制链接]
发表于 2009-2-4 21:25:36 | 显示全部楼层

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

   emms在浮点前用就可以了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-4 21:25:45 | 显示全部楼层
我还计划 64位 的 HugeCalc,
将主动放弃对部分老型号的 CPU 的支持(即无相关指令集的),
追求的就是效率。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-4 21:28:16 | 显示全部楼层


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

  当然Cell和MIPS等不是你考虑的吧,哈哈
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 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 | 显示全部楼层
mov  edx, n
    bsr  ecx, edx
    push ebx
    mov eax, [t + ecx * 8 + 4]
    mov  ebx, eax
    sub ebx, 1
    cmp  edx, [t + ecx * 8]
    cmovb  eax, ebx
    pop ebx
=====================
9条指令
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-5 08:29:19 | 显示全部楼层
或者利用setcc

    mov edx, n
    bsr  ecx, edx
    mov eax, [t + ecx * 8 + 4]
    push ebx
    xor ebx, ebx
    cmp edx, [t + ecx * 8]
    setb bl
    sub eax, ebx
    pop ebx
=====================
还是9条, 如果能想办法只用3个寄存器,则就更完美了
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-2-5 08:34:57 | 显示全部楼层
===========================
    mov eax, n     
    bsr  ecx, eax
    xor edx, edx
    cmp  eax, [t + ecx * 8]
    setb dl
    mov eax, [t + ecx * 8 + 4]
    sub eax, edx   
============================
7条指令!!!!
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

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

GMT+8, 2024-4-20 13:11 , Processed in 0.058954 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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