zoukankan      html  css  js  c++  java
  • 按位运算符以及位移运算探讨

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

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

    比如:

       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

  • 相关阅读:
    MySQL的语句执行顺序
    mysql 基本使用
    spring 事务详解
    java 设计模式
    hibernate 简单查询
    qwq(一些有趣的数学题)
    关于libra9z
    HDU6756 Finding a MEX
    CF1386C Joker
    CF1340F Nastya and CBS
  • 原文地址:https://www.cnblogs.com/pssp/p/5836018.html
Copyright © 2011-2022 走看看