关于异或的一些东西和应用

异或是一种基于二进制的位运算,用符号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、自反性 A XOR B XOR B = A xor  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的结果也是有规律的,算法比高斯定律还该简单的多。
 
google面试题的变形:一个数组存放若干整数,一个数出现奇数次,其余数均出现偶数次,找出这个出现奇数次的数?
 

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


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

转载于:https://www.cnblogs.com/JSD1207ZX/p/9386255.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295920.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android之自定义ContentProvider详解

第一个版本 对android中MIME类型的理解 初始MIME类型,是在学习ContentProvider的时候。 当在创建自己的ContentProvider的时,需要从抽象类ContentProvider中派生出自己的子类,并实现其中5个抽象方法: query(Uri, String[], Strin…

dwr 写的小程序,配置

第一、在web.xml里面有如下配置&#xff1a; <?xml version"1.0" encoding"UTF-8"?><web-app xmlns"http://java.sun.com/xml/ns/j2ee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"h…

PHP开发学习-Apache+PHP+MySQL环境搭建

我现在开始php的学习之旅啦&#xff01; 入门&#xff1a;开发环境搭建 组件版本&#xff1a; apache2.2.22 下载地址&#xff1a;http://httpd.apache.org/ php5.4.11 下载地址&#xff1a;http://windows.php.net/download/ mysql5.5.29 下载地址&#xff1a;http://www.mys…

如何不露声色地知道别人是不是单身?

1 世界上竟然会有这么香的东西&#xff01;&#xff01;&#xff01;2 全网吧的电脑都死机了&#xff0c;唯独写论文的电脑没死机&#xff01;3 哈哈哈哈哈哈哈哈哈哈哈好拉风啊&#xff01;&#xff01;4 中国好邻居5 《秋游》&#xff0c;五年级男生写的诗图自我们1班王悦微6…

Android 防火墙 知乎,知乎回应:防火墙太“坑爹” 正检查用户隐私是否有泄露...

9月7日消息&#xff0c;知乎今日下午系统瘫痪无法登陆&#xff0c;各个页面变为一片空白&#xff0c;并且还出现了知乎账号“串号”现象&#xff0c;当时有消息称是服务器原因。其后知乎发布公告&#xff0c;声称由第三方防火墙故障引起客户端临时下线&#xff0c;并引起数据展…

再谈C#中的委托和事件

写在最前我相信全网关于委托和事件的文章和概述&#xff0c;大家应该已经读过很多篇。但是就我的观察来看&#xff0c;大多数文在讲述这方面概念时&#xff0c;都会用烧开水和狗叫主人的例子来讲述事件怎么工作&#xff0c;这样比喻固然与生活联系紧密&#xff0c;但看多了难免…

MIT Scheme 使用 Edwin

MIT Scheme 的基本使用&#xff1a;http://www.math.pku.edu.cn/teachers/qiuzy/progtech/scheme/mit_scheme.htm 安装过程 安装brew XQuartz 转载于:https://www.cnblogs.com/IDRI/p/4989171.html

js.domReady

2019独角兽企业重金招聘Python工程师标准>>> var dom [], dom_isReady false, domReady function (a) { if (dom_isReady) a(); else dom.push(a) }, dom_fireReady function () { if (!dom_isReady) { if (!document.body) return setTimeout(dom_fireReady, 1…

mongo-rename操作

重命名集合 > show collectionstianyc_test9> db.runCommand({renameCollection:Gps.tianyc_test9, to:Gps.tianyc_test99}){ "ok" : 1 }> show collectionstianyc_test99 另&#xff1a;通过db.listCommands()&#xff0c;可以查看到所有mongo的命令。转载…

Android之监测database的改变--notifyChange

我们在ContentProvider的insert,update,delete等改变之后调用getContext().getContentResolver().notifyChange(uri, null);这样就通知那些监测databases变化的observer了&#xff0c;而你的observer可以在一个service里面注册。 以Downloadmanger为例子&#xff1a; 定义Cont…

双一流高校出新规:研究生未经导师同意发论文,不得用于毕业、评奖!

全世界只有3.14 % 的人关注了爆炸吧知识本文转自&#xff1a;募格学术近日&#xff0c;吉林大学研究生院发布文件《吉林大学关于加强对研究生在学期间公开发表论文等学术成果管理的通知》&#xff0c;因内容涉及校内研究生论文发表要求&#xff0c;引起很多研究生的注意。其中包…

android http 三次 握手,面试解析:3次握手与4次挥手

在面试中&#xff0c;三次握手和四次挥手可以说是问的最频繁的一个知识点了&#xff0c;我相信大家也都看过很多关于三次握手与四次挥手的文章。今天的这篇文章&#xff0c;重点是围绕着面试&#xff0c;我们应该掌握哪些比较重要的点&#xff0c;哪些是比较多被面试官给问到的…

微服务组件记事本:Skywalking执行效果 · 多图篇

立冬时节知多少今天立冬&#xff0c;周末两天在家继续研究了下Skywalking&#xff0c;感觉这个组件还是很不错的&#xff0c;无论是设计思想还是架构设计&#xff0c;都能从中受到启发和帮助&#xff0c;建议感兴趣的小伙伴可以看看&#xff0c;当然&#xff0c;如果不感兴趣还…

《Starting with Starling》 Ep 1~11

starling 1.3&#xff0c;Hi-ReS-Stats FlashDevelop设置 Project->Properties ->Output->Platform->Flash Player->11.5 ->Classpaths->Add Classpath->(starling和Stats的src文件夹) 程序入口 [SWF(frameRate"60", width"800", …

Android之TextUtils类介绍

对于字符串处理Android为我们提供了一个简单实用的TextUtils类&#xff0c;如果处理比较简单的内容不用去思考正则表达式不妨试试这个在android.text.TextUtils的类&#xff0c;主要的功能如下: 是否为空字符 boolean android.text.TextUtils.isEmpty(CharSequence str) 拼接…

堆和栈的区别 (转贴)

从其他博客复制过来的&#xff0c;因为这个够详细&#xff0c;转过来学习一下&#xff01; 堆和栈的区别一、预备知识—程序的内存分配一个由c/C编译的程序占用的内存分为以下几个部分1、栈区&#xff08;stack&#xff09;— 由编译器自动分配释放 &#xff0c;存放函数的参数…

ios和android交互差异,Android 和 iOS 主要交互区别整理

我简单整理了一下Android 和 iOS 主要的交互区别&#xff0c;如果有遗漏欢迎批评补充。我总结有下面五类区别&#xff1a;一、界面布局形式的差异1 iOS 的 Tab Bar在iOS应用内最多用Tab Bar来切换不同的模块&#xff0c;Tab Bar 也是最受欢迎最容易被用户认知的方式。2 Android…

要比惨吗?看看这个女人

全世界只有3.14 % 的人关注了爆炸吧知识她从不知道辞职是什么滋味&#xff0c;因为被炒的总是她&#xff1b;连续被三家公司炒掉之后&#xff0c;她不得不自己做SOHO。生了双胞胎&#xff0c;本是喜事&#xff1b;但还在月子里&#xff0c;却发现老公出轨。小三还没打走&#x…

【Blog.Core开源】完成升级.NET 6.0

(千呼万唤始出来&#xff0c;_ _ _ _ _ _ _)是不是每个人都已经尝试一遍vs2022和.NET6.0了&#x1f601;&#xff0c;从各个微信群和盆友圈就可见一斑。今天一大早&#xff0c;一位粉丝就发私信&#xff0c;让升级6.0&#xff0c;这么简单的需求&#xff0c;必须满足&#xff0…

Mac 修改用户名

系统偏好设置 > 用户与群组 > 解锁 > 用户 > 右键 > 高级选项 > 全名转载于:https://www.cnblogs.com/SimonGao/p/4989662.html