按位运算符以及位移运算探讨

  之前一直没搞懂这个怎么计算的,主要也因为之前没怎么用到过这个,但现在想把它搞懂,所以索性一次性搞懂为妙,以后就不用再纠结了哈。

按位运算符就是把数字看作二进制来进行计算的,并且再把计算出来的二进制给它转换成十进制,也就是最终的结果了。

比如:

   7&9

这个是按位与,先不讨论与不与的,总之它现在会把7和9转换成二进制,接下来我们将7和9转换成2进制,这里我用python。

如果你看不懂这段代码没有关系,因为这里的重点不是讲python,而是按位运算符,这里我们可以看到7的二进制为111,而9的二进制为1001。明显可以看出7和9的二进制长度不一样,如果长度不一样的话,短的那个前面会自动补0。结果就成了这样:

7:0111

9:1001

前面说了所谓的按位运算符就是比较两个数的二进制,那么怎么比较呢,是这样的,如果是按位与那么就比较两个数是不是都为1如果是就是1否则为0,看下面。

比如第一个7:0 ,第一个9:1那么它们就为0,只要其中有一个是0那么它就是零,当然这是对于按位于来说的。

整体比较如下:

7:0 1 1 1

9:1 0 0 1

结果:0 0 0 1

那么结果二进制就成了0001了,那么二进制0001再转换成十进制就是1,自然7&9结果就是1。

我们可以用下面的工具来帮我们转换。

其他的东西都不要问我,我只说按位运算符,因为其他我啥也不懂,至于转换来转换去,我也是百度了一下的,但我的目的达到了,因为我不是来学进制转换的,有一句话说的很好,不忘初心,方得始终。这也是一种学习方式,以前我学习老爱纠结这些,所以一直就学不好,因为有些根本就不是你现在该考虑的,你要明确自己学这个干嘛。

那么按位或,按位非,按位取反,自然也是一个道理,不过是比较的时候换种花样罢了,再拿按位或来演示一下。

按位或

5|6

转换2进制:

5:101

6:110

只要有1就是1

结果:111 这是二进制 再转一下就是7.

我们来看看这个按位运算符有没有什么规律。

//转成二进制

console.log((1).toString(2)); //1
console.log((2).toString(2)); //10
console.log((3).toString(2)); //11
console.log((4).toString(2)); //100
console.log((5).toString(2)); //101
console.log((6).toString(2)); //110

console.log(1&0); //0

console.log(1&1); //1

console.log(1&2); //0
console.log(1&3); //1
console.log(1&4); //0
console.log(1&5); //1
console.log(1&6); //0

这里可以看出1&任何单数都为1,而1&任何双数都为0。(包括负数)

console.log(2&0); //0
console.log(2&1); //0
console.log(2&2); //2
console.log(2&3); //2
console.log(2&4); //0
console.log(2&5); //0
console.log(2&6); //2
console.log(2&7); //2
console.log(2&8); //0
console.log(2&9); //0
console.log(2&10); //2
console.log(2&11); //2
console.log(2&12); //0
console.log(2&13); //0
console.log(2&14); //2
console.log(2&15); //2

这里可以看出2的规律是0 0 2 2  可以口算出来的管理还真没看出来。 

再看一组

console.log(3&0); //0
console.log(3&1); //1
console.log(3&2); //2
console.log(3&3); //3

console.log(3&4); //0
console.log(3&5); //1
console.log(3&6); //2
console.log(3&7); //3

console.log(3&8); //0
console.log(3&9); //1
console.log(3&10); //2
console.log(3&11); //3

console.log(3&12); //0
console.log(3&13); //1
console.log(3&14); //2
console.log(3&15); //3

console.log(3|0); //3
console.log(3|1); //3
console.log(3|2); //3
console.log(3|3); //3

console.log(3|4); //7
console.log(3|5); //7
console.log(3|6); //7
console.log(3|7); //7

console.log(3|8); //11
console.log(3|9); //11
console.log(3|10); //11
console.log(3|11); //11

console.log(3|12); //15
console.log(3|13); //15
console.log(3|14); //15
console.log(3|15); //15

规律隔4加4.

其他规律就不算了。

ok了,这是一次很愉快的过程,目的达到了哈,按位运算可以告一段落了。

位运算看了半天才看懂T_T ,下面写一下位运算的原理吧。

先拿右移>>运算开刷。

如:16>>2 = 4

它的计算是先将16转成二进制,然后把这个二进制往右移动2个位置。

16的二进制:0001 0000

往右移动两个就成了0000 0100,为什么是移动两个因为我们上面写的就是2啊,>>后面表示的是你要移动多少位。实际上这里我们还是看不懂,为什么前面0001变成了0000了呢?是这样的:

16>>2表示在16这个二进制前面添加两个零或者两个1,至于是添加零还是1取决于>>左边的这个数是正数还是负数,如果是正数就填补0,如果是负数就填补1。

0001 0000

因为16是正数所以填补0

0000 0100 00 超出了两个0去掉超出的,因此就是:

0000 0100

再如5>>3=0

5的二进制为:0000 0101

结果:0000 0000

那么左移位呢?自然相反啊。

比如5<<3=40

5的二进制为:0000 0101

结果:0010 1000

啥意思?就是把0或者一往0000 0101后面补,然后把前面多余的删除。

000 0010 1000 前面三个0删除。

反正就是这样了,能不能听懂你自己看着办吧,就到这了。

网上看到这篇文章还是不错的:http://www.cnblogs.com/yyangblog/archive/2011/01/14/1935656.html

原文地址:https://www.cnblogs.com/pssp/p/5836018.html