今天我们来学习C语言中的异或。
✨在C语言中,异或(XOR)是一种逻辑运算符,用符号^
表示。异或操作是将两个操作数的每一位
进行比较,如果相同
则结果为0
,如果不同
则结果为1
。
左操作数 | 右操作数 | 结果 |
---|---|---|
0 | 0 | 0 |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
✨总结起来,0和任何数异或还是任何数
,1和任何数异或则是任何数的取反
。
结合律:对于任意三个操作数a、b、c,有(a ^ b) ^ c = a ^ (b ^ c)
。即异或操作在多个操作数之间满足结合律。
交换律:对于任意两个操作数a和b,有a ^ b = b ^ a
。即异或操作的顺序可以交换。
自反性:对于任意操作数a,有a ^ a = 0
。即一个数与自身进行异或操作的结果为0。
零元素:对于任意操作数a,有a ^ 0 = a
。即一个数与0进行异或操作的结果为它本身。
唯一性:对于任意操作数a,有a ^ a = 0
,a ^ 0 = a
。即一个数与自身进行异或操作的结果为0,与0进行异或操作的结果为它本身。
✨可以使用异或操作来交换两个变量的值,而无需使用第三个变量。
例如:
int a = 10;
int b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 现在a的值为20,b的值为10
❓可能会有人有疑问,为啥右边都是a^b,但最终的结果就可以交换呢?让我们来一步步分析:
a = a ^ b
后,a的值将会发生改变,至于变为多少,我们不关心,因为没必要算(实在想算也可以,写出二进制表达后再用定义计算)。b = a ^ b
后,因为a的值已经发生了改变,即此式等价于b = a ^ b ^ b = a ^ 0 = a
,从而将a的值赋给了b。a = a ^ b = a ^ b ^ a = a ^ a ^ b = 0 ^ b = b
。从而实现两个数值的交换。✨你是否又想到了排序算法中两个值的交换呢?当时我们是通过定义一个临时变量(中间媒介)来完成两个数的交换,类似下面这种方法:
int temp=a;
a=b;
b=temp;
当然,还有很多交换变量值的方法,我们这里就不展开论述了,以后有机会会进行讲解。
✨可以使用异或操作来判断两个数的奇偶性。如果一个数的二进制表示的最后一位为1,则该数为奇数;如果最后一位为0,则该数为偶数(我们上节已经讲过了)。因此,可以使用异或操作来判断两个数的奇偶性。例如:
int num = 10;
int result=num ^ 1
if (result<num) {
printf("num是奇数");
} else {
printf("num是偶数");
}
为啥要这样写呢❓
✨异或操作可以用来检测数组中是否存在落单的元素。通过对数组中的所有元素进行异或操作,如果结果为0,则表示数组中没有落单的元素;反之则有,且计算结果就是该落单的数。例如:
int arr[] = {1, 2, 1, 3, 4, 3, 2, 1, 1};
int n = sizeof(arr) / sizeof(arr[0]);
int result = 0;
for (int i = 0; i < n; i++) {
result = result ^ arr[i];
}
if (result == 0) {
printf("数组中没有落单的元素");
} else {
printf("数组中存在落单的元素,输出如下:");
printf("%d",result);
}
✨异或操作可以用来进行简单的加密和解密操作。通过将明文和密钥进行异或操作得到密文,再将密文和密钥进行异或操作得到明文。例如:
char plaintext[] = "Hello World";
char key = 'A';
int n = strlen(plaintext);
for (int i = 0; i < n; i++) {
plaintext[i] = plaintext[i] ^ key;
}
printf("加密后的密文:%s\n", plaintext);
for (int i = 0; i < n; i++) {
plaintext[i] = plaintext[i] ^ key;
}
printf("解密后的明文:%s\n", plaintext);
哈哈,是不是很有趣呢?
✨离散数学中的异或运算是一种基于布尔代数的运算,也称为逻辑异或运算
。它的规则与C语言中的异或运算类似,只不过它的操作对象是逻辑值
(真或假)。
例如,假设有两个命题p和q,它们的真假分别为(p =1,q = 0) 或(p=0,q=1)。那么p ⊕ q的结果为1,因为有且仅有一个操作数为1。
————————————————
好了,今天的讲解就到这里了,相信你也是收获满满吧!❤️