异或运算的性质及用途

   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的位数是奇数还是偶数,是一个便捷的操作。

				
时间: 2024-12-24 06:25:21

异或运算的性质及用途的相关文章

二进制异或运算的应用

异或运算又称XOR或EOR 二进制中为对应位进行运算,若相同则为0,不同则为1. 简单性质: 0与x(任何数)异或运算得x 可以使用交换律和结合律 应用1:判断两个数是否相等 根据异或运算的定义,当两个数相同时,运算结果为0 应用2:通过异或运算将重复的两个数去除. 例:https://leetcode.com/problems/single-number/ 应用3:交换两个变量的值without额外空间 a^=b b^=a a^=b 应用4:异或加密

异或运算实现两个数的交换

通常的交换两个变量a,b的过程为 int temp; temp=a a=b; b=temp; 需借助上面的第3个临时变量temp. 采用下面的方法,对于给定两个整数a,b,下面的异或运算可以实现a,b的交换,而无需借助第3个临时变量: a = a ^ b;     b = a ^ b;     a = a ^ b; 这个交换两个变量而无需借助第3个临时变量过程,其实现主要是基于异或运算的如下性质: 1.任意一个变量X与其自身进行异或运算,结果为0,即X^X=0 2.任意一个变量X与0进行异或运算

集合的异或运算(对称差)

1.集合的异或运算(AΔB)定义属于A或属于B,但不同时属于A和B的元素的集合称为A和B的对称差,即A和B的异或. 注:草绿色部分即为 AΔB 2.对称差(异或)运算的定律2.1 AΔB = (A-B)∪(B-A) = (A∪B)-(A∩B)该公式的证明已在 集合的证明及相关习题 中证明了 2.2 对称差运算的交换律(AΔB)ΔC = (AΔC)ΔB 注:图1中草绿色部分为 (AΔB) ,三角形区域为 C ,(AΔB)ΔC  = 仅含草绿色或仅含三角形的区域注:图2中草绿色部分为 (AΔC) ,

异或运算的应用

异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示, 其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1. 它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结果为0. 异或的性质 交换律:a ^ b = b ^ a 结合律:a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c d = a ^ b ^ c 可以推出 a = d ^ b ^ c 自反性:a ^ b ^ a = b x ^ x = 0, x ^ 0 = x 应用: 1

leetcode 268 Missing Number(异或运算的应用)

Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missing from the array. For example,Given nums = [0, 1, 3] return 2. Note:Your algorithm should run in linear runtime complexity. Could you implement it usi

强大的异或运算

什么是异或? Wikipedia的解释: 在逻辑学中,逻辑算符异或(exclusive or)是对两个运算元的一种逻辑析取类型,符号为 XOR 或 EOR 或 ⊕(编程语言中常用^).但与一般的逻辑或不同,异或算符的值为真仅当两个运算元中恰有一个的值为真,而另外一个的值为非真.转化为命题,就是:"两者的值不同."或"有且仅有一个为真." 定义: 1 ⊕ 1 = 0 0 ⊕ 0 = 0 1 ⊕ 0 = 1 0 ⊕ 1 = 1 真值表:   Y B = 0 B = 1

位运算之异或运算

位运算 位运算就是基于整数的二进制表示进行的运算.理解位运算首先要理解二进制.位运算总共只有5种运算:与(&).或(|).异或(^).左移(<<).右移(>>). 异或运算 维基百科中对「异或」的解释: 在逻辑学中,逻辑算符异或(exclusive or)是对两个运算元的一种逻辑析取类型,符号为 XOR 或 EOR 或 ⊕(编程语言中常用^).但与一般的逻辑或不同,异或算符的值为真仅当两个运算元中恰有一个的值为真,而另外一个的值为非真.转化为命题,就是:"两者的值

HDU 5175 Misaki&#39;s Kiss again (异或运算,公式变形)

Misaki's Kiss again Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 201    Accepted Submission(s): 57 Problem Description After the Ferries Wheel, many friends hope to receive the Misaki's kiss

异或运算实现加密解密

异或运算中,如果某个字符(或数值)x 与 一个数值m 进行异或运算得到y,则再用y 与 m 进行异或运算就可以还原为 x ,因此应用这个原理可以实现数据的加密解密功能. 异或运算在java中通常有两个比较常用的方法,一个是两个变量的互换(不借助第三个变量),一个便是数据的简单加密解密. 两个变量的互换 java运算中,如果要交换两变量的值,通常的做法就是借助第三个临时变量,然后完成操作. 如 public static void main(String[] args) { int[] arr =