当前位置: 代码迷 >> 汇编语言 >> 假设一个数为ox01010101,小弟我想求出ox01000000,用最快速的算法
  详细解决方案

假设一个数为ox01010101,小弟我想求出ox01000000,用最快速的算法

热度:7308   发布时间:2013-02-26 00:00:00.0
假设一个数为ox01010101,我想求出ox01000000,用最快速的算法
如何用位操作,实现只保留一个数最高位为1的那个位,其余位的全部清0.

也就是求出一个数X,与之最接近的2的n次方是多少,(上限或下限,均可。)


比如ox01010101,我想求出ox01000000,用最快速的算法


------解决方案--------------------------------------------------------
假设ecx是输入eax是输出。。

bsr %ecx, %ecx
mov $1, %eax
shl %cl, %eax

------解决方案--------------------------------------------------------
输入的值是多少位的?如果位数不是很大或者极端要求速度以至于完全不考虑内存占用的话,用xlat吧。感觉查表在很多情况下效率都是最高的,同时占用的内存也是最多的。不过xlat好像不能处理大于256的表,所以如果表比较大的话就只能用基址+偏移的方式查表了。
我刚才大概查了一下,bsr的指令周期挺长的,而且好像是不定的,我查到的是7-72。xlat的指令周期是固定的,是4。不过指令周期这个东西在不同的CPU上可能是不同的,这个只能做一个参考。
表大概是这样的(输入是8位的),这个表还是在程序运行的时候生成比较好:
table db 0,1B,10B,10B,100B,100B,100B,100B,1000B,1000B,......10000000B
xlat具体是怎么回事你自己查一下吧,基址+偏移的方法是这样的:
si为输入,al为输出
mov bx,offset table
mov al,[bx+si]
多次转换的话mov bx,offset table是不用多次执行的。
我用的是8086的汇编,MASM 5的语法。
  相关解决方案