用移位表示除法的“四舍五入”思想

一般写工程量比较大的代码,如果有除法运算,则必须考虑到除法“/”和乘法"*"复杂度的问题,乘法除法复杂度都是比较高的,如果较多的使用这两个运算符无疑会导致算法复杂度上增加。因此就必须采用某种方法代替一般的乘除法。对于乘法除法,最简单的就是尽量使用移位操作代替乘除法。比如下面的例子:

求3*4:3<<2;
求6除以4:6>>2;

移位操作符“>>”指右移,右移1位代表除以2;“<<”指左移,左移1位代表乘以2.

使用移位操作符进本不增加运算复杂度,因为是直接对二进制数据进行操作,所以用移位操作符代替乘除运算符是一个非常好的选择。但是,要使用移位操作符代替乘除法,除数和乘除必须是2的幂次方,所以当不满足这个条件的时候,就不得不用乘法操作符直接进行运算,不过对于除法,还是得使用LUT查表的方式用乘法去代替除法运算,因为除法的运算复杂度是比乘法还要高很对的,如果不能移位去解决,就最好用查询LUT表的方式去解决。

对于用移位去表示除法运算,还要一点比较重要的需要强调的是关于四舍五入的问题,如何用移位实现整数除法四舍五入的问题呢?
其实很简单,我举一个例子,比如我们要求5/4≈1,还有7/4≈2。其用移位就可以表示如下:
5/4=(5+2)>>2;
7/4=(7+2)>>2;
其中这里面加的2就是用于四舍五入的,原因如下:
①现将被除数都转化为二进制的,5的二进制是101,2的二进制是10,然后将5和2的二进制数相加得:111,然后将111右移两位得二进制1,二进制1就是十进制的1。
②7的二进制是111,2的二进制是10,然后将7和2的二进制数相加得:1001,然后将1001右移两位得二进制10,二进制10就是十进制的2。

综上所述,但凡我们要计算一个整数M右移N位去表示除法:M/2^N 时。考虑到四舍五入就要给M加上 2^(N-1) 后再去右移N位。如(M+2^(N-1))>>N.

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值