求一个整数n的2的对数,只取整数部分 ( 积分: 200 )

  • 主题发起人 主题发起人 wanderld
  • 开始时间 开始时间
W

wanderld

Unregistered / Unconfirmed
GUEST, unregistred user!
最好用基本汇编语句
如求17的2的对数为4
分n很小(小于integer)和n较大(大于int64)两种情况
 
最好用基本汇编语句
如求17的2的对数为4
分n很小(小于integer)和n较大(大于int64)两种情况
 
直接与2的n次方比较就可以了吧
 
function LogN(const Base, X: Extended): Extended;
Description
LogN returns the log base Base of X.
 
.....17 shr 2 就行了。。。位移算是最快的吧。。。。。
 
//来自:hs-kill
//.....17 shr 2
应该是shl才对
//EAX->InInt LOG->EAX
//没有保存ECX,我记得好像ECX是可以直接使用的,如果需要可以添加
MOV ECX, 32
@LP_1:
SHL EAX
JNC @THIS_POS
LOOP @LP_1
@THIS_POS:
MOV EAX, ECX
DEC EAX
RET
对于优化,其实也可以分段判断是否为0
MOV ECX,0
ROL EAX,16
CMP AX,0
JNZ @LP_1 //高16位有1,现在在AX

...
SHL AL
JNC @...
LOOP @LP_2
可以细分到BYTE/WORD
而至于>32位的整数,应该数据科学计算的范畴.不过如果在Intel计算机上有一个好处,就是高高低低(高位高址),因此可以使用字串扫描语句查找非0的最高位的字节.找到此字节之后,然后SHL扫描具体是哪一位,
然后计算一下具体位数即可.
上边的实例代码之中可能会涉及到和答案相差1,根据需要调整即可,身边没有环境编写调试.思路如上
 
呵呵 抱歉 上面写的错了 呵呵~~~~忘了什么是对数了。。。
学习下吧
 
function LogN(const X: Extended): integer;
var
ret : integer;
begin
ret := 0;
while(TRUE)do
begin
if (X < (1 shl ret)) then
begin
Result := ret - 1;
exit;
end
else
ret := ret + 1;
end;
end;
 
后退
顶部