最近做一道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,也就是余数。
用位运算的优点就是位运算(&)效率要比代替取模运算(%)高很多,主要原因是位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快。
今天就水到这里了。