js移位运算符
下面我们来看下例题
(N >> j << j) | (((N >> i << i)) ^ N) | (M << i)
**!!!**想要了解移位运算符必须要静下心来,慢慢看,否则没啥效果
注意:右边是低位,左边是高位
首先我们给变量赋值 N=1024 ,M=19,i=2,j=6,
不懂二进制转换的自己百度一下
1.首先N的二进制是 100 0000 0000 ,M的二进制 1 0011,
我们将上面的式子进行分解,精讲
(N >> j << j)
首先右移6位得到 100 00,再左移6位,得到100 0000 0000,
讲到这,许多同学就迷惑了,这不是没改变吗?
重点:这实现的目的就是让低6位清零。
这个例子不够明显,让我们来体验下M
(M >> i<<i)
M先右移2位得到100,在左移2位得到1 0000,将镜头拉回到M,坐下对比 1 0011 =》 1 0000,是不是将低两位进行了清零。
相信理解了这个上面的例题也就很好理解了。
在将镜头切换到例题:我们来表述一下他的意义
首先将低6位进行清零 | 将低二位进行清零^N | 将M左移两位
2.接下来我们讲下^ 异或,相同为0,不同为1
例如 00 ^ 11 得到的结果就是11 00^01 得到01
(((N >> i << i)) ^ N) 这句话是啥意思呢?
10011>>2<<2 => 1 0000 ^ 10011 => 10011,简单点说就是让低两位不发生变化
(N >> j << j) | (((N >> i << i)) ^ N),这句话的意思也就呼之欲出了,就是将中间4位清零(5 4 3 2),保留低两位(1 0bit)
(N >> j << j) | (((N >> i << i)) ^ N) | (M << i)也就是说用M的前三位代替N的中间4位,差的位用0代替。