数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
查看: 6447|回复: 3

关于求以2为底的对数的快速的方法!!

[复制链接]
发表于 2008-3-24 21:58 | 显示全部楼层 |阅读模式
只需要求出整数部分即可,在计算机上实现,请问谁有关于这方面的数学理论资料嘛?
谢谢!也欢迎大家来讨论.
目前的方法有:
1 数末尾的0的个数
2 利用计算机对浮点数的存储特点
但是想了解一下还有没有更精巧的快速的方法?
谢谢!!
发表于 2008-4-5 19:58 | 显示全部楼层

关于求以2为底的对数的快速的方法!!

只求整数部分就容易,转换为整数,其2进制最高位的位数-1就是整数位,比如:
123的二进制为1111011,最高位位数为7,所以所求整数为6。这使用位运算>>就可快速实现。
发表于 2008-4-20 18:03 | 显示全部楼层

关于求以2为底的对数的快速的方法!!

有没有这种方法啊,我也想学一下
匿名  发表于 2014-5-15 18:57

关于求以2为底的对数的快速的方法!!

自己写的,求64位整数的以2为底的对数,如果是32位整数,代码更加简单。

------------------------------------------------
以下代码可用微软的ml.exe编译
------------------------------------------------
.486
    .model  flat
PUBLIC  _Uint64_Log2_ALU
_TEXT   SEGMENT
_Uint64_Log2_ALU PROC
    mov ecx,[esp+4]
    mov edx,[esp+8]
    or   edx,edx
    jnz  check_64
check_is_zero:
    or ecx,ecx
    jnz check_32
    mov eax,-1
    ret
check_32:
    bsr eax,ecx
    ret
check_64:
    bsr  eax,edx
    add  eax,32
    ret
    ret 0
_Uint64_Log2_ALU ENDP
_TEXT   ENDS
END
--------------------------------------
以下代码可用gcc编译
--------------------------------------
.intel_syntax noprefix
.text
    .globl Uint64_Log2_ALU
    .type  Uint64_Log2_ALU, @function

.ifndef M64
Uint64_Log2_ALU:
    mov ecx,[esp+4]
    mov edx,[esp+8]
    or   edx,edx
    jnz  check_64
check_is_zero:
    or ecx,ecx
    jnz check_32
    mov eax,-1
    ret
check_32:
    bsr eax,ecx
    ret
check_64:
    bsr  eax,edx
    add  eax,32
    ret
.else
.equ PARA1,rdi
Uint64_Log2_ALU:
check_is_zero:
or PARA1, PARA1
jnz check_64
mov rax,-1
ret
check_64:
bsr  rax,PARA1
    ret
.endif
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2025-6-19 23:18 , Processed in 0.095936 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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