烟台seo网站推广,河南万安建设集团有限公司网站,网站建设原理试卷,在线教育网站开发时长今天我们来学习C语言中的异或。 文章目录 一、基本知识#xff1a;异或操作满足的定律#xff1a;(important) 二、拓展应用#xff1a;1. 交换两个变量的值#xff1a;2. 判断两个数的奇偶性#xff1a;3. 检测落单的数(出现奇数次的数)#xff1a;检测丢失的数: 4. 加密…今天我们来学习C语言中的异或。 文章目录 一、基本知识异或操作满足的定律(important) 二、拓展应用1. 交换两个变量的值2. 判断两个数的奇偶性3. 检测落单的数(出现奇数次的数)检测丢失的数: 4. 加密和解密 三、与离散数学中的异或进行对比 一、基本知识
✨在C语言中异或XOR是一种逻辑运算符用符号^表示。异或操作是将两个操作数的每一位进行比较如果相同则结果为0如果不同则结果为1。
左操作数右操作数结果000011101110
例如假设有两整数变量a和b其二进制表示分别为 a 1010 , b 1100执行a ^ b操作后得到的结果是 a ^ b 0110
✨总结起来0和任何数异或还是任何数1和任何数异或则是任何数的取反。 异或操作满足的定律(important) 结合律对于任意三个操作数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 0a ^ 0 a。即一个数与自身进行异或操作的结果为0与0进行异或操作的结果为它本身。 二、拓展应用 1. 交换两个变量的值
✨可以使用异或操作来交换两个变量的值而无需使用第三个变量。 例如
int a 10;
int b 20;a a ^ b;
b a ^ b;
a a ^ b;
// 现在a的值为20b的值为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 tempa;
ab;
btemp;当然还有很多交换变量值的方法我们这里就不展开论述了以后有机会会进行讲解。 2. 判断两个数的奇偶性
✨可以使用异或操作来判断两个数的奇偶性。如果一个数的二进制表示的最后一位为1则该数为奇数如果最后一位为0则该数为偶数(我们上节已经讲过了)。因此可以使用异或操作来判断两个数的奇偶性。例如
int num 10;
int resultnum ^ 1
if (resultnum) {printf(num是奇数);
} else {printf(num是偶数);
}为啥要这样写呢❓
如果一个数为奇数则其的二进制表示的最后一位为1和1异或后最后一位变为0其余位值不变所以异或的结果小于原数(小了1)反之若一个数为偶数则其的二进制表示的最后一位为0和1异或后最后一位变为1其余位值不变所以异或的结果大于原数(大了1) 3. 检测落单的数(出现奇数次的数)
✨异或操作可以用来检测数组中是否存在落单的元素。通过对数组中的所有元素进行异或操作如果结果为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);
}检测丢失的数:
给定范围[a,b]的一系列数但是一个调皮的数跑丢了需要你把它找出来请问该怎么找答利用今天学习的异或知识就能轻松解决即把[a,b]所有的数(b-a1个)和丢失一个数的那些数(b-a个)放在一堆然后一起异或重复的数必定两两相消剩下的一个数就是那个调皮的数。 4. 加密和解密
✨异或操作可以用来进行简单的加密和解密操作。通过将明文和密钥进行异或操作得到密文再将密文和密钥进行异或操作得到明文。例如
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语言中的异或运算类似只不过它的操作对象是逻辑值真或假。
在离散数学中异或运算的结果为真1的条件是有且仅有一个操作数为1。如果两个操作数都为1或都为0则结果为假0。
例如假设有两个命题p和q它们的真假分别为(p 1q 0) 或(p0,q1)。那么p ⊕ q的结果为1因为有且仅有一个操作数为1。 ————————————————
好了今天的讲解就到这里了相信你也是收获满满吧!❤️