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 

     

  • 相关阅读:
    【POJ】2778 DNA Sequence(AC自动机+矩阵快速幂)
    【HDU】4352 XHXJ's LIS(数位dp+状压)
    【BZOJ】1756: Vijos1083 小白逛公园(线段树)
    【POJ】1062 昂贵的聘礼 (最短路)
    【Codeforces】Codeforces Round #491 (Div. 2) (Contest 991)
    【Codeforces】Codeforces Round #492 (Div. 2) (Contest 996)
    【Codeforces】Educational Codeforces Round 46(Contest 1000)
    【POJ】1935 Journey(树形dp)
    【UVALive】4094 WonderTeam(神结论)
    【POJ】1185 炮兵阵地(状压dp)
  • 原文地址:https://www.cnblogs.com/gczmn/p/8196543.html
Copyright © 2011-2022 走看看