已知C 语言中的按位异或运算(“XOR”)用符号“^”表示。对于任意一个位序列a,a^a=0,C 语言程序可以?
定义
异或(xor)是一个数学运算符。它应用于逻辑运算。异或符号为“^”。 其运算法则为a异或b=a'b或ab'(a'为非a)。
真异或假的结果是真,假异或真的结果也是真,真异或真的结果是假,假异或假的结果是假。就是说两个值不相同,则异或结果为真。反之,为假。
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0异或0=0,1异或0=1,0异或1=1,1异或1=0,这些法则与加法是相同的,只是不带进位。
异或运算法则
1. a ^ b = b ^ a
2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.
4. a ^ b ^ a = b.
x是二进制数0101
y是二进制数1011
则结果为x^y=1110
0^0=0
0^1=1
1^0=1
1^1=0
只有在两个比较的位不同时其结果是1,否则结果为0
即“相同为0,不同为1”!
作用
在计算机中普遍运用,异或(xor)的逻辑符号 ^ (Shift + 6)或一个圆圈里面增加一个+(⊕)或者·.形象表示为:
真^假=真
假^真=真
假^假=假
真^真=假
或者为:
True ^ False = True
False ^ True = True
False ^ False = False
True ^ True = False
部分计算机语言用1表示真,用0表示假,所以两个字节按位异或如下
00000000
异或
00000000
=
00000000
============我是分界线============
11111111
异或
00000000
=
11111111
XOR是位运算符,即*x=a 且*y=b,设定a = 1;b = 2;
*y=*x ^ *y; /* 第一步 */ 执行后 *x = 1,*y=3
*x=*x ^ *y; /* 第二步 */ 执行后 *x = 2,*y=3
*y=*x ^ *y; /* 第三步 */执行后 *x = 2,*y=1
测试例子
int main(int argc,char *argv[])
{
int a = 1;
int b = 2;
int c = 0x55;
int d = 0xaa;
printf("a = %d b=%d
",a,b);
xor_swap(&a,&b);
printf("a = %d b=%d
",a,b);
printf("c = %d d=%d
",c,d);
xor_swap(&c,&d);
printf("c = %d d=%d
",c,d);
return 0;
}
运算结果:
各个语句执行以后的值:
1 void xor_swap(int *x, int *y)
2 {
3 *y=*x ^ *y; /* 第一步 */ *y=a^b
4 *x=*x ^ *y; /* 第二步 */ *x=a^(a^b)=(a^a)^b=0^b=b
5 *y=*x ^ *y; /* 第三步 */ *y=b^(a^b)=a^(b^b)=a^0=a
6 }