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

mxfeng 2013-01-02 01:38:39
如何用位操作,实现只保留一个数最高位为1的那个位,其余位的全部清0.

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


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

...全文
147 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
申祷无 2013-01-02
  • 打赏
  • 举报
回复
关于我为什么认为查表在很多情况下效率都是最高的: 现在很多的CPU传送指令的指令周期都是1机器周期,而查表一般情况下只需要一条指令。这个在理论上应该是不能再少了。 但同时也应该注意如果用查表法转换,并且表很大的话,建立表的时间是不能忽略的。就算是直接定义的,不是在程序运行过程中生成的话,操作系统加载程序的时候加载这个表也是需要时间的。在这种情况下,只有需要转换大量的数据才能体现出查表法的效率。
申祷无 2013-01-02
  • 打赏
  • 举报
回复
只要改变那个表,就可以分别实现“向上”,“向下”或者“四舍五入”了。
申祷无 2013-01-02
  • 打赏
  • 举报
回复
输入的值是多少位的?如果位数不是很大或者极端要求速度以至于完全不考虑内存占用的话,用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的语法。
sanae 2013-01-02
  • 打赏
  • 举报
回复
假设ecx是输入eax是输出。。

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

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧