首页 > 其他分享 >异或运算的性质

异或运算的性质

时间:2024-01-22 22:34:43浏览次数:25  
标签:... XOR 运算 算法 异或 性质 1000

异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示。

性质

1、交换律

2、结合律:即(a^b)^c == a^(b^c))

3、对于任何数x,都有x^x=0,x^0=x,x^1=x'。即一位数(假设是a),与自身异或,一定等于0; 与0异或-->等于本身;  与1异或---->等于a'。

4、自反性 A^B^B = A^0 = A

异或运算最常见于多项式除法,不过它最重要的性质还是自反性:A XOR B XOR B = A,即对给定的数A,用同样的运算因子(B)作两次异或运算后仍得到A本身。这是一个神奇的性质,利用这个性质,可以获得许多有趣的应用。

例如,所有的程序教科书都会向初学者指出,要交换两个变量的值,必须要引入一个中间变量。但如果使用异或,就可以节约一个变量的存储空间: 设有A,B两个变量,存储的值分别为a,b,则以下三行表达式将互换他们的值 表达式 (值) :

 A=A XOR B (a XOR b)
 B=B XOR A (b XOR a XOR b = a) 
 A=A XOR B (a XOR b XOR 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的结果也是有规律的,算法比高斯定律还该简单的多。

 

 

异或的配对性定理:利用a与1异或,等于a'

设a为任意非负偶数,b=a+1为比a大1的正奇数;则必有a^1=b,b^1=a;

用于处理两两配对问题(如正向、反向边)时很好用!!!

2^1=3,3^1=2;

98^1=99;99^1=98;

123^1=122; 9870^1=9871

证明:

由异或的自反性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;

 

google面试题的变形:一个数组存放若干整数,一个数出现奇数次,其余数均出现偶数次,找出这个出现奇数次的数?

解法有很多,但是最好的和上面一样,就是把所有数异或,最后结构就是要找的,原理同上!!

奇数个异或是本身,偶数个是0;0^a=a;异或有交换律

 

转载自:https://wenku.baidu.com/view/8bb52ffb700abb68a982fbba.html?_wkts_=1705932331851&bdQuery=%E5%BC%82%E6%88%96%E7%9A%84%E6%80%A7%E8%B4%A8

标签:...,XOR,运算,算法,异或,性质,1000
From: https://www.cnblogs.com/FBsharl/p/17981214

相关文章

  • CF-1831-E-卡特兰数+异或哈希+差分
    1831-E题目大意给定一个整数\(n\),和\(k\)个区间,区间端点范围在\([1,n]\)内。如果有一个长为\(n\)合法的括号序列,且它的这\(k\)个区间\([l,r]\)中的子括号序列也是合法的,那么称这个括号序列是“好的”。请你求出有多少个长度为\(n\)的“好的”括号序列,答案对\(998244353\)取模......
  • 【C++入门到精通】C++入门 —— 类和对象(拷贝构造函数、赋值运算符重载、const成员函
    编辑一、前言二、拷贝构造函数⭕拷贝构造函数概念⭕拷贝构造函数的特点⭕拷贝构造函数的几种类型三、赋值运算符重载⭕运算符重载概念⭕赋值运算符重载⭕前置++和后置++重载四、const成员函数⭕const成员函数概念⭕常量成员函数需要满足的特点⭕常量成员函数有利条件⭕const常量的......
  • 从CF1875C学习lowbit运算判断是否为 2 的 k 次幂
    Problem-1875C-Codeforces本题判断无解的时候要判断该数是否为2的k次幂,我的做法是预处理出2的次幂数表。看题解发现可以用lowbit操作。lowbit操作intlowbit(intx){returnx&(-x);}根据补码原理,该操作可以求出来X最靠右的\(1\)构成的数。判断\(x\)......
  • FICO 三大报表运算维护表计算规则(表里维护行次的)
    1+2+3"内表整理科目报表项目汇总后计算公式1+2+3DATA:lv_strTYPEstring,lv_str1TYPEstring,lt_numTYPETABLEOFstring,lt_signTYPETABLEOFstring,lv_indexTYPECHAR4,lv_iTYPEi,lv_sumTYPEpDECIMALS3.......
  • (17)Powershell中的重定向运算符
    (17)Powershell中的重定向运算符默认情况下,Powershell把输出发送到屏幕显示。但是,Powershell也可以将输出重定向至一个文本文件,或将错误输出重定向至常规输出流。重定向运算符有什么用?重定向运算符意味着我们可以将命令的输出信息输出到指定的文件,完全满足脚本中的log的要求,......
  • JavaScript 中的展开运算符是什么?
    展开运算符(SpreadOperator)是JavaScript中的一种语法,用于将可迭代对象(如数组或字符串)展开为独立的元素。它使用三个连续的点号(...)作为操作符。展开运算符可以在多种情况下使用,包括数组、对象和函数调用等。下面是一些展开运算符的用法示例:1:展开数组:使用展开运算符可以将一......
  • 逻辑运算符||、&&
    #define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>intmain(){ inti=0,a=0,b=2,c=3,d=4; //i=a++&&++b&&d++; //当第一个&&左边的条件为假时,其后条件便不再进行(逻辑截断) i=a++||++b||d++; //当第一个||成立,其后的表达式不再进行运算 prin......
  • 位运算(c++)
    n的二进制表示第k位是几①先把第k位移到最后一位:n>>k②看个位是几:&1n>>k&1lowbit(x):返回x的最后一位1是多少例如1010--->10,101000--->1000实现:x&-x=x&(~x+1)例:输入一个数组返回数组中每个元素二进制形式中1的个数代码:#include<iostream>using......
  • (14)Powershell中的逻辑运算符
    (14)Powershell中的逻辑运算符上一节介绍了Powershell中的比较运算符,以及如何使用Powershell中的位运算来操作文件的属性,想写内容参考HERE。这一节介绍Powershell中的逻辑运算符。逻辑运算符可以连接表达式和语句,返回值为TRUE或者FALSE,以此来构成条件为真或为假的bool(TR......
  • (13)Powershell中的比较运算符与位运算符
    (13)Powershell中的比较运算符与位运算符上一节介绍了Powershell中变量的类型,详细内容使劲戳这里。本节介绍Powershell中的比较运算符。使用比较运算符,可以指定用于比较值,也可以查找与指定模式匹配的值。如果要使用比较运算符,需要同时指定要进行比较的值以及分隔这些值的运算......