学习内容:
逻辑运算异或XOR的相关知识与实际用法
1、 异或的概念与表示方法
2、 异或运算的二进制加法应用-Simulink
3、异或算法加密与解密的应用-C语言
4、异或算法交换两个整数的应用-C语言
1 异或的概念与表示方法
数字门电路中逻辑关系有:与(AND)、或(OR)、与非(NAND)、或非(NOR)、异或(XOR)、异或非(NXOR)、非(NOT)。 其中异或表示相异为真,相同为假;即只要运算中一方为1,一方为0,则结果为1,否则为0。
- Matlab:c=xor(a,b)
- Simulink:
- C语言:c=a^b
- 真值表如下表所示:
a | b | c |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
1 | 1 | 0 |
- XOR满足交换律和结合律:
(a xor b) xor c = a xor (b xor c);
(a xor b) xor b = a; %自己是自己的逆,因为b xor b=0
2 异或运算的二进制加法应用
-
门电路中常被用于二进制加法器上,二进制加法的结果是分为加法位和进位位。需要先理解计算机中二进制加法原理,首先计算不用进位的位置,做“或”运算(加法位);然后计算进位的位置做“与”运算(进位位),将进位的结果向左移位,再和加法位相加,按递归下去得到最终结果。
-
当只有两个一位二进制相加时,可以使用半加器(按位异或),即实现两个1位二进制数相加不考虑低位的进位;当有多个一位二进制数相加,就需要考虑前一位是否有进位,相当于要考虑三个变量,加数、被加数、低位的进位,称为全加器 (两个半加器级联)。
全加器: Simulink例子【参考其他博客,增加理解】
-
通过全加器来模拟二进制加法原理,给出两个二进制数A、B,Ci为外部进位输入信号,S为输出的和,C0为进位信号。
根据真值表写表达式,s和c0结果为0的不考虑。(注意:这里每一行都是一个单独的数,仍属于1位二进制数)
,只看s为1的四行即可,0为非,1为真。
同理只看c0为1的四行。 -
搭建Simulink模型如下图:
其中生成二进制数的脉冲发生器设置如图:
- 仿真结果如下图:
多位二进制数加法
-
最低位时是两个数的最低位相加,无需考虑进位,是半加器;其余各位都是三个数相加(加数、被加数、进位数)。所以多位加法器可以通过多个上述的一位加法器级联而来,参考网上4位串行加法器使用4个全加器级联。
对于多位二进制数,我的理解是每次运算进行的位数,如2位二进制最多运算2位,11+11;4位最多运算4位,1111+1111。1为高电平,0为低电平;2位加法器,00,01,10,11表示低低、低高、高低、高高。 -
用Simulink模型搭建一个2位加法器,可以通过1个半加器存放每个低位的结果,低位的进位给下方高位全加器作为进位输入,参考理解该博主的文章《MATLAB之Simulink(四)两位二进制数加法器》,其中有错误,正确模型如下:
第一个加数Scope(低位在上,高位在下):
第二个被加数Scope:
第三个最终Scope:
3 异或算法加密与解密的应用-C语言
加密和解密原理就是XOR是本身的逆运算,代码理解参考下方:
- https://blog.csdn.net/monster663/article/details/107295825
- https://blog.csdn.net/monster663/article/details/107142732
4 异或算法交换两个整数的应用-C语言
交换两个整数a、b有三种方法:
- 临时变量c过渡;
- 加减法 a=a+b;b=a-b;a=a-b
- 异或法,可以避免越界缺陷,计算速度也快
a = a ^ b;
b = a ^ b;
a = a ^ b;
#include <stdio.h>
void main()
{
int a=3,b=4;
a=a^b;
printf("first value %d\n",a);
b=b^a;
printf("second value %d\n",b);
a=a^b;
printf("third value %d\n",a);
}