使用位运算(&)来实现取模运算(%)

最近做一道ctf题的时候发现一个有趣的现象,汇编如下:
在这里插入图片描述
反汇编之后看的更懵了,
在这里插入图片描述
这右移这么多是想干什么???
后来我发现这么几行汇编,
在这里插入图片描述
很相似啊,而这个经过反汇编之后是这样的:在这里插入图片描述
我好像突然发现点什么,这是在取模啊,仔细的看了一下这个这个汇编,v6其实一直都是0了,所以这几句就是在用v4加前一个s[i]。

接下来说一说为什么位运算(&)可以实现取模运算(%)。
有公式:
X % 2^ n = X & (2^ n – 1)
2^ n表示2的n次方,也就是说,一个数对2^ n取模 == 一个数和(2^n – 1)做按位与运算 。
假设n为3,则2^ 3 = 8,表示成2进制就是1000。2^3 = 7 ,即0111。
此时X & (2^3 – 1) 就相当于取X的2进制的最后三位数。
从2进制角度来看,X / 8相当于 X >> 3,即把X右移3位,此时得到了X / 8的商,而被移掉的部分(后三位),则是X % 8,也就是余数。

用位运算的优点就是位运算(&)效率要比代替取模运算(%)高很多,主要原因是位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。

今天就水到这里了。

  • 8
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值