为了能到远方,脚下的每一步都不能少.|

园龄:粉丝:关注:

2021-12-16 00:30阅读: 65评论: 0推荐: 0

有符号非2的幂的第一种优化

xc=x2nc12n

这样就把除法转换为被除数x乘以一个整数,再右移n位的形式,但是有一个问题,因为右移n位是取下整

右移n位是取下整 例子:

​ -3/2 = 0xFFFFFFFD / 2 =0xFFFFFFFD >> 1 = 0xFFFFFFFE = 0xFFFFFFFE.1 = -2

由于小数位1被舍去了,所以负数扩大了。

回到正题,当被除数是正数时,自然没问题,但是当被除数是负数时要向上取整才能得到正确的计算结果,所以要在被除数是负数时将去下整转换为去上整

首先将2nc变得略大一些,这样c就会比实际的除数略小一些,能这样做的原因是因为书上的推导6

有整数a,b和实数x且ab,b0

|1b|<x0,ab+x=ab

由于c比实际的除数略小于,除数为整数,所以c不等于整数(当a$ \neq 0a \neq b,b\neq0c,\frac{x}{c}$比实际的值略小,所以才满足上面公式

又因为推导3

当x不为整数

x+1=x

由于c不为整数,所以xc也不为整数,满足上述公式,所以有下面的推导:

xc=xc+1

最终得出除数为有符号非2的幂的优化

当x>=0

xc=x2nc12n

因为x>0,c比实际的除数略小,所以xc比实际的值略大,满足当 0x<|1b|,ab+x=ab

注:右边的c要比实际的除数略小

当x<0

xc=x2nc12n=x2nc12n+1

参考书籍:C++反汇编与逆向分析技术揭秘 第二版

本文作者:乘舟凉

本文链接:https://www.cnblogs.com/czlnb/p/15696125.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   乘舟凉  阅读(65)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起