zoukankan      html  css  js  c++  java
  • 异或运算

      异或运算是位运算,不产生进位,也不会对其他bit产生影响。一般用XOR表示,在C语言中,异或用'^'表示。

    异或运算法则与无进位的二进制加法一致:0^0=0,1^0=1,0^1=1,1^1=0(同为0,异为1), 其逻辑表达

    式为A XOR B=A'B + AB'

    对任意元素a, 令其二进制位第k位为a[k],

    真值表:

    a[k] b[k] XOR
    0 0 0
    0 1 1
    1 0 1
    1 1 0

    异或运算有如下规律:

    1) 交换律 a ^ b = b ^ a

      由真值表, 对任意k,有a[k] ^ b[k] = b[k] ^ a[k]。因为异或不对其他位产生影响,可得a ^ b = b ^ a。

    2) 恒等律 a ^ 0 = a

      同上

    3) 归零律 a ^ a = 0

      同上

    4) 结合律 (a ^ b) ^ c = a ^ (b ^ c)

    第一种方法,列出a[k],b[k], c[k] 和 (a[k] ^ b[k]) ^ c[k] = a[k] ^ (b[k] ^ c[k])真值表即可。

    第二种方法,由异或表达式:A ^ B  = A * B' + A' * B

    (A ^ B) ^ C = (A ^ B)' * C + (A ^ B) ^ C'

          = (A'*B + A*B')' *C + (A'*B + A*B')*C' 

          = (A'*B)'* ( A*B')'*C + A'*B*C' + A*B'*C' (摩根律)

          = (A+B')*(A'+B)*C + A'*B*C' + A*B'*C'

          = ABC + AB'C' + A'BC' + A'B'C 

    同样可以把A ^ (B ^ C) 展开为 ABC + AB'C' + A'BC' + A'B'C,得证。

    简单应用:原地交换两个数:

    a = a ^ b 

    b = a ^ b

    a = a ^ b

    假设原来的a, b 表示为ak, bk

    第一步:a = ak ^ bk

    第二步:b = a ^ bk = (ak ^ bk) ^ bk = ak ^ (bk ^ bk) = ak ^ 0 = ak

    第三步:a = a ^ b = (ak ^ bk) ^ ak = ak ^ (ak ^ bk) = (ak ^ ak) ^ bk = 0 ^ bk = bk ^ 0 = 0

    得证。

  • 相关阅读:
    NOIP2011 D1T1 铺地毯
    NOIP2013 D1T3 货车运输 倍增LCA OR 并查集按秩合并
    POJ 2513 trie树+并查集判断无向图的欧拉路
    599. Minimum Index Sum of Two Lists
    594. Longest Harmonious Subsequence
    575. Distribute Candies
    554. Brick Wall
    535. Encode and Decode TinyURL(rand and srand)
    525. Contiguous Array
    500. Keyboard Row
  • 原文地址:https://www.cnblogs.com/ym65536/p/4104089.html
Copyright © 2011-2022 走看看