• 异或运算的性质及用途


       1.两个数的交换

       利用异或运算可以实习一种简单的不使用第三个数的交换方式, 代码如下所示:

    void swap(int a,int b)  
    {  
         a = a^b;  
         b = a^b;  
         a = a^b;  
    }  

       原因是:异或运算是它本身的逆运算,故对于两个数或是布尔变量有如下性质:

    (a XOR b) XOR b = a
     补充,异或运算的简单性质:
     1. a ⊕ a = 0
     2. a ⊕ b = b ⊕ a    //  异或运算满足交换律
     3. a ⊕ b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;    //  异或运算满足结合律
     4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
     5. a ⊕ b ⊕ a = b.
     6.若x是二进制数0101,y是二进制数1011
     则x⊕y=1110
     只有在两个比较的位不同时其结果是1,否则结果为0
     即“相同为0,不同为1”.
     由上述这些性质我们可以得到异或运算的第二个应用————判断两个数是否相等。
     
     2.判断两个数是否相等
     该应用可以参照LintCode的道题目,内容如下所示:

      给出2*n + 1 个的数字,除其中一个数字之外其他每个数字均出现两次,找到这个数字。

      样例

      给出 [1,2,2,1,3,4,3],返回 4

      挑战 

      一次遍历,常数级的额外空间复杂度。(题目链接

      如果你考虑的是通过遍历该数组,依次取出数组中的元素然后对其进行匹配的话。那么时间复杂度是O(N2)。

      很明显这不是一个优质的解法,故我们可以通过将该数组中全部的数进行异或操作,最终得到的数便是我们所需要的结果。代码如下所示:

    public class Solution {
        /**
         *@param A : an integer array
         *return : a integer 
    *一个数与0异或仍为其本身
    */ public int singleNumber(int[] A) { if (A == null || A.length == 0) { return 0; } int rst = A[0]; for (int i = 1; i < A.length; i++) { rst = rst ^ A[i]; } return rst; } }

      

      3.位数的奇偶判断

      ^a操作就是将a中的每一位按位逐一进行异或。例如a = 1010,则^a = 1^0^1^0=0,由此可以判断a中为1的位数是奇数还是偶数,是一个便捷的操作。

     



  • 相关阅读:
    iOS 色值 转换 干货
    控制器view及UIApplication的生命周期
    runtime认识及其用处
    block底层实现原理
    iOS开发,你不得不知的数据存储---干货
    UIImageView(UIImage)的那些细节
    UIButton那些应用细节
    使用gevent写异步代码
    数据分析三剑客之pandas
    数据分析之numpy
  • 原文地址:https://www.cnblogs.com/cherryljr/p/7056980.html
Copyright © 2020-2023  润新知