异或运算的性质及用途

两个数交换:
一种简单的不使用第三个数的交换方式:

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

异或运算是其本身的逆运算,即对于任何两个布尔变量或者数有(a xor b) xor b=a。故而有下面的交换方式:

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

补充,异或运算的简单性质:
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”!
异或运算出了上述性质之外,还具有消去律:a^b=b^c => a=b,与、或运算均不满足该性质。
关于异或运算,一位网友(http://www.physixfan.com/archives/563),在阐述Nim问题时,给出这样一个问题:现在给你2n+1个正整数,其中有n对数和1个单独的数,(这里规定一对数的意思是这两个数相等),然后让你设计一种算法,把这个单独的数给找出来,要求时间复杂度为O(n)。比如说这2n+1个数是1 2 3 2 1,那么这个单独的数就是3。如果你的思路是依次挑出一个数然后和其余所有数比较一下看看是否相等,那就换个思路吧,因为这样的时间复杂度是O(n2)的。
解答方案就是:所有的数字异或起来就得到那个异类。

你可能感兴趣的:(刷题)