zoukankan      html  css  js  c++  java
  • 位运算

    位运算针对的是二进制,所以需要将进行位运算的数现转成在内存中二进制的表示形式

     

    左移或右移

    例如: 3 << 2 = 12

    内存中二进制(32位):   0000 0000 0000 0000 0000 0000 0000 0011
    左移后的结果为(32位):   0000 0000 0000 0000 0000 0000 0000 1100

    原理就是:

       左移就是从左边开始去掉几位,就在最后面添加0,补成32位

       右移同理,在前面补0还是1要看最高位(最左边)是0还是1。

    计算方法: 左移:往左移几位就乘以2的几次幂  (就是乘以2的移动位数次幂)

                                 3 << 2 等价 3 * 2的2次幂   3 << 3 等价 3 * 2的3次幂

                      右移: 同理往右移几位就除以2的几次幂  (除以2的移动的位数次幂)

    >> : 有符号的右移  

    >>>: 无符号右移无论最高位是什么,右移后,前面都补0

     

    &运算:   1 & 1 = 1 、1 & 0 = 0、0 & 0 = 0 由此可以进行&运算

    例如:

      6 & 3 = 2

                   0000 0000 0000 0000 0000 0000 0000 0110
               &   0000 0000 0000 0000 0000 0000 0000 0011
    ---------------------------------------------------------------------------
                   0000 0000 0000 0000 0000 0000 0000 0010

     

    |  运算 : 1 | 1 = 1 、1 | 0 = 1、0 | 0 = 0 由此可以进行 | 运算

    例如:

      6 | 3 = 7

              0000 0000 0000 0000 0000 0000 0000 0110
            | 0000 0000 0000 0000 0000 0000 0000 0011
    ---------------------------------------------------------------------------
              0000 0000 0000 0000 0000 0000 0000 0111

     

    ^ 异或 :  相同为false , 不同为true     

    (ps: 一个数异或同一个数两次,结果还是那个数,可以用在数据加密上)

    例如:

     6 ^ 3 = 5

              0000 0000 0000 0000 0000 0000 0000 0110
            ^ 0000 0000 0000 0000 0000 0000 0000 0011
    ---------------------------------------------------------------------------
              0000 0000 0000 0000 0000 0000 0000 0101

     

    ~ 取反:  0和1互换,得到的结果减一再取反就得到十进制的数,然后加上负号就是结果

    例如:

    ~6 = - 7

                   0000 0000 0000 0000 0000 0000 0000 0110
    取反          1111 1111 1111 1111 1111 1111 1111 1001
    减一          0000 0000 0000 0000 0000 0000 0000 0001
    结果          1111 1111 1111 1111 1111 1111 1111 1001
    取反          0000 0000 0000 0000 0000 0000 0000 0110   = 7
    加上负号最终结果是 -7

    一个负数的等价于对应的正数取反加一

    -6 = ~6 + 1

     

    小技巧:不使用第三个变量交换两个数

    int n = 3, m = 5;
    //使用加法
    n = n + m; //n = 8
    m = n - m; //8 - 5 = 3  m = 3
    n = n - m; //8 - 3 = 5  n = 5
    
    //使用异或
    n = n ^ m; 
    m = n ^ m; // (n^m)^m 结果是n 此时m是n
    n = n ^ m; //( n ^ m)^ n 结果是 m 

     

  • 相关阅读:
    uva 11248 最大流 ISAP
    【力扣】133. 克隆图
    【力扣】125. 验证回文串
    【力扣】130. 被围绕的区域
    【力扣】337. 打家劫舍 III
    【力扣】104. 二叉树的最大深度-及二叉树的遍历方式
    【力扣】392. 判断子序列
    【力扣】95. 不同的二叉搜索树 II
    【力扣】120. 三角形最小路径和
    【力扣】两个数组的交集 II
  • 原文地址:https://www.cnblogs.com/gczmn/p/8196543.html
Copyright © 2011-2022 走看看