什么是异或运算异或运算的作用.docx
- 文档编号:4291625
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:11
- 大小:18.63KB
什么是异或运算异或运算的作用.docx
《什么是异或运算异或运算的作用.docx》由会员分享,可在线阅读,更多相关《什么是异或运算异或运算的作用.docx(11页珍藏版)》请在冰豆网上搜索。
什么是异或运算异或运算的作用
什么是异或运算,异或运算的作用
异或
目录定义
异或运算法则
异或逻辑
作用
定义
异或(xor)是一个数学运算符。
它应用于逻辑运算。
异或符号为“^”。
其运算法则为a异或b=a'b或ab'(a'为非a)。
真异或假的结果是真,假异或真的结果也是真,真异或真的结果是假,假异或假的结果是假。
就是说两个值不相同,则异或结果为真。
反之,为假。
不同为1,相同为0,如1001异或1010等于0011.
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:
二进制下用1表示真,0表示假,则异或的运算法则为:
0异或0=0,1异或0=1,0异或1=1,1异或1=0,这些法则与加法是相同的,只是不带进位。
异或运算法则
1.a^b=b^a2.a^b^c=a^(b^c)=(a^b)^c;3.d=a^b^c可以推出a=d^b^c.4.a^b^a=b.x是二进制数0101y是二进制数1011则结果为x^y=11100^0=00^1=11^0=11^1=0只有在两个比较的位不同时其结果是1,否则结果为0即“相同为0,不同为1”!
真^真=假
或者为:
True^False=True
False^True=True
False^False=False
True^True=False
部分计算机语言用1表示真,用0表示假,所以两个字节按位异或如下
00000000
异或
00000000
=00000000============我是分界线============11111111异或00000000=11111111
异或1的配对性定理:
设a为任意非负偶数,b=a+1为比a大1的正奇数;则必有a^1=b,b^1=a;
用于处理两两配对问题(如正向、反向边)时很好用!
!
!
如a=2,b=3:
2^1=3,3^1=2;98^1=99;99^1=98;123^1=122;9870^1=9871
如a=0,b=1:
0^1=1,1^1=0;
证明:
由异或的自反性a^b^b=a^0=a,可知a^1^1=a;
又因为对于任意非负偶数有a^1=a+1;
所以有:
a^1=a+1=b;
a^1^1=(a+1)^1=b^1=a;
异或的性质及运用
异或是一种基于二进制的位运算,用符号XOR或者^表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。
它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结果为0。
简单理解就是不进位加法,如1+1=0,,0+0=0,1+0=1。
性质
1、交换律
2、结合律(即(a^b)^c==a^(b^c))
3、对于任何数x,都有x^x=0,x^0=x
4、自反性AXORBXORB=Axor0=A
异或运算最常见于多项式除法,不过它最重要的性质还是自反性:
AXORBXOR
B=A,即对给定的数A,用同样的运算因子(B)作两次异或运算后仍得到A
本身。
这是一个神奇的性质,利用这个性质,可以获得许多有趣的应用。
例如,所有的程序教科书都会向初学者指出,要交换两个变量的值,必须要引入一个中间变量。
但如果使用异或,就可以节约一个变量的存储空间:
设有A,B两个变量,存储的值分别为a,b,则以下三行表达式将互换他们的值表达式(值):
类似地,该运算还可以应用在加密,数据传输,校验等等许多领域。
运用距离:
1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现
一次。
每个数组元素只能访问一次,一个算法,将它找出来;不用辅助存储空
间,能否设计一个算法实现?
解法一、显然已经有人提出了一个比较精彩的解法,将所有数加起来,减去1+2+...+1000的和。
这个算法已经足够完美了,相信出题者的标准答案也就是这个算法,唯一的问题是,如果数列过大,则可能会导致溢出。
解法二、异或就没有这个问题,并且性能更好。
将所有的数全部异或,得到的结果与1^2^3^...^1000的结果进行异或,得到的结果就是重复数。
但是这个算法虽然很简单,但证明起来并不是一件容易的事情。
这与异或运算的几个特性有关系。
首先是异或运算满足交换律、结合律。
所以,1^2^...^n^...^n^...^1000,无论这两个n出现在什么位置,都可以转换成为1^2^...^1000^(n^n)的形式。
其次,对于任何数x,都有x^x=0,x^0=x。
所以1^2^...^n^...^n^...^1000=1^2^...^1000^(n^n)=
1^2^...^1000^0=1^2^...^1000(即序列中除了n的所有数的异或)。
令,1^2^...^1000(序列中不包含n)的结果为T
则1^2^...^1000(序列中包含n)的结果就是T^n。
T^(T^n)=n。
所以,将所有的数全部异或,得到的结果与1^2^3^...^1000的结果进行异或,得到的结果就是重复数。
当然有人会说,1+2+...+1000的结果有高斯定律可以快速计算,但实际上1^2^...^1000的结果也是有规律的,算法比高斯定律还该简单的多。
google面的变形:
一个数组存放若干整数,一个数出现奇数次,其余数均出现偶数次,找出这个出现奇数次的数?
解法有很多,但是最好的和上面一样,就是把所有数异或,最后结构就是要找的,原理同上!
!
longzxr.i.sohu./blog/view/190676432.htm
奇数个异或是本身,偶数个是0;0^a=a;异或有交换律
异或^
的几个作用
一、交换两个整数的值而不必用第三个参数
a=9;
b=11;
a=a^b;1001^1011=0010
b=b^a;1011^0010=1001
a=a^b;0010^1001=1011
a=11;
b=9;
二、奇偶判断
^a操作就是将a中的每一位按位逐一进行异或,例如a=4'b1010,则
b=1^0^1^0=0,由此可以判断a中为1的位数是奇数还是偶数,是一个便捷的操作。
三、格雷码(Graycode)
格雷码(Graycode)是由贝尔实验室的FrankGray在1940年提出,用于在PCM(PusleCodeModulation)方法传送讯号时防止出错,并于1953年三月十七日取得美国专利。
格雷码是一个数列集合,相邻两数间只有一个位元改变,为无权数码,且格雷码的顺序不是唯一的。
直接排列
以二进制为0值的格雷码为第零项,第一项改变最右边的位元,第二项改变右起第一个为1的位元的左边位元,第三、四项方法同第一、二项,如此反覆,即可排列出n个位元的格雷码。
1、自然二进制码转换成二进制格雷码
自然二进制码转换成二进制格雷码,其法则是保留自然二进制码的最高位作为格雷码的最高位,而次高位格雷码为二进制码的高位与次高位相异或,而格雷码其余各位与次高位的求法相类似。
2、二进制格雷码转换成自然二进制码
二进制格雷码转换成自然二进制码,其法则是保留格雷码的最高位作为自然二进制码的最高位,而次高位自然二进制码为高位自然二进制码与次高位格雷码相异或,而自然二进制码的其余各位与次高位自然二进制码的求法相类似。
二进制数转格雷码
(假设以二进制为0的值做为格雷码的0)
格雷码第n位=二进制码第(n+1)位+二进制码第n位。
不必理会进制。
Verilog代码:
gray=(binary>>1)^binary;
格雷码转二进制数
二进制码第n位=二进制码第(n+1)位+格雷码第n位。
因为二进制码和格雷码皆有相同位数,所以二进制码可从最高位的左边位元取0,以进行计算。
verilog代码:
//------假设reg[n-1]gray,binary;
integeri;
for(i=0;i<=n-1;i=i+1)
binary[i]=^(gray>>i)//gray移位后,自身按位异或
放一段代码这,用于参考:
/*LogictoconvertbinarynumbersintoGraycodedbinarynumbersisimplementedinthefollowingVerilogCode.*/
modulebinary2gray();
regclk;
regrstn;
reg[5:
0]counter_binary,counter_binary_reg,counter_gray,counter_gray_reg;
integercount,file_wr;
/*Initialblocktogenerateclockandreset*/
initialbegin
clk=0;rstn=0;#100rstn=1;
foreverbegin
#10clk=!
clk;
endend
/*SynchronousLogicforregisteringthedataandincrementingthecounterforbinarydata*/
always@(posedgeclkornegedgerstn)
begin
if(!
rstn)begin
counter_binary_reg<='b0;
counter_gray_reg<='b0;end
elsebegin
counter_binary_reg<=counter_binary+1;
counter_gray_reg<=counter_gray;
$display("binarynumber=6'b%b:
grayen-codedbinarynumber=
6'b%b",counter_binary_reg,counter_gray_reg);endend
/*LogicistogetGraycodefromBinarycode*/
function[5:
0]binary2gray;
input[5:
0]value;
integeri;
begin
binary2gray[5]=value[5];
for(i=5;i>0;i=i-1)
binary2gray[i-1]=value[i]^value[i-1];end
endfunction
/*Getgrayencodedoutput*/
always@(*)
begin
counter_gray=counter_gray_reg;
counter_binary=counter_binary_reg;
counter_gray=binary2gray(counter_binary_reg);endendmodule
四、奇数分频
奇数分频电路:
奇数分频电路常用的是错位“异或”法的原理。
如进行三分频,通过待分频时钟的上升沿触发计数器进行模三技术,当计数器计数到邻近值进行两次翻转。
比如计数器在计数到1时,输出时钟进行翻转,计数到2时再进行翻转,即在邻近的1和2时刻进行两次翻转。
这样实现的三分频占空比为1/3或2/3.如果要实现占空比为50%的三分频时钟,可通过待分频的时钟上升沿触发计数器和下降沿触发计数器进行三分频,然后将上升沿和下降沿产生的三分频时钟进行相或预算,即可得到占空比为50%的三分频时钟。
错位“异或”法推广:
对于实现占空比为50%的N倍奇数分频,首先进行上升沿触发的模N计数,计数到某一选定值时,进行输出时钟翻转,然后进过(N-1)/2再次进行翻转得到一个占空比非50%的技术分频时钟。
再者同时进行下降沿触发的模N计数,到和上升沿触发输出时钟翻转选定值相同时,进行输出时钟翻转,同样经过(n-1)/2时,输出时钟再次翻转生成占空比非50%的奇数N分频时钟。
两个占空比非50%的时钟相或运算,得到占空比为50%的奇数N分频时钟。
内容仅供参考
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 什么是 运算 作用