我们先了解一下位异或的运算法则吧:
1、a^b = b^a。
2、(a^b)^c = a^(b^c)。
3、a^b^a = b。
对于一个任意一个数n,它有几个特殊的性质:
1、0^n = n。
2、n^n = 0。
3 、1^n = !n。(即n==0时,则所得的值为真,当 n != 0,所得值为0,即为假)
对于 ^ 运算符在实际问题的运用:
hdu 2095
题意:
给你n个数字,已知只有一个数字出现了奇数次,其他数字都出现了偶数次,要求你找出这个特别的数字。
利用位异或的运算法则:
1、a^b = b^a。
2、(a^b)^c = a^(b^c)。
3、a^b^a = b。
可以写出如下代码:
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int n,a,b;
while(scanf("%d",&n),n)
{
b=0;
while(n--)
{
scanf("%d",&a);
b^=a;
}
cout<<b<<endl;
}
return 0;
}
对于代码的理解:
对于case1:
5
1 1 3 2 2
代码是这样处理这组数据的
1^1^3^2^2 (1)
根据运算法则1、a^b = b^a。
可以化成这样:
1^1^2^2^3 (2)
(1)式为代码处理的结果,(2)式为数学变换的结果
又因为(1)--->(2)为恒等变形过程:
(1)=(2)
所以最终输出的就是3。
对于
11
3 7 9 3 3 9 7 9 9 7 7
亦可做如上理解:
3^7^9^3^3^9^7^9^9^7^7
<====>
7^7^7^7^9^9^9^9^3^3^3
=0^3
=3