关于取模运算的小技巧

取模运算的定义:a%b=a-b*(a/b),其中b≠0。

众所周知,相对于位运算而言除法运算是个相当奢侈的操作,因此在需要大量使用取模运算且对性能有要求的情况下,若满足b为2的整数次幂(即b=1<<k,k为整数)时,可用一个特殊的小技巧将取模运算转化为位运算,即:a%b=a&(b-1),且b=1<<k(k为整数)。为什么呢?

我们以8为例,8的二进制表示为下图:

在3号位以上均为8的倍数,即对8取模均为0,因此对取模有贡献的为3号位以下的。

根据上述公式:b-1=8-1=7,7的二进制表示为下图:

此时任何1~7的数与7进行按位与(&)操作,均为其本身,即恰好是对8取模的结果,如下图:

 

参考:

1.https://www.quora.com/Why-is-the-modulo-operator-expensive-How-do-you-replace-the-modulo-operation-with-equivalent-but-less-expensive-operations

2.https://blog.csdn.net/akakakak250/article/details/54377664?spm=1001.2014.3001.5502

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值