关于异或(Xor)的一点笔记

因为博弈论里,尤其实在求sg函数时,经常会用到异或运算,所以我就把网上搜到的一些相关知识和自己的一些理解记下来。

如果出现差错,还请指出,谢谢!

异或:可以简称Xor,可以用数学符号⊕表示,计算机就一般可以用^表示了。

异或运算主要指二进制中。

  00=0,01=1

  10=1,11=0

可以看成是两个值相同得0,不同得1。

另一种求值方法就是两数相加,但是不进位,如1⊕1=0,可以看作1+1=10,但是不进位,所以1⊕1=0。

关于一些运算法则

1. a ⊕ a = 0

2. a ⊕ b = b ⊕ a

3. a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;

4. d = a ⊕ b ⊕ c  可以推出 a = d ⊕ b ⊕ c.

5. a ⊕ b ⊕ a = b.

我举例说明一下法则5的运用。

例题:已知一串只含大于0的int型整数的数字,其中大部分数都出现了两次,但只有一个数只出现了一次,求这个数的值。

     如5 5 3 2 2 1 3,数字5,3,2都出现了两次,而只有1只出现了一次,所以这串数字的答案为1。又如3,4,5,5,4,2,3 的答案为2。

对于这题,可以使用hash数组,但可能会使用过大的空间。如果用异或就简单许多了。因为a⊕a=0; 0⊕b=b;a⊕b⊕a=b;

如5 5 3 2 2 1 3求异或  5 ⊕ 5 ⊕ 3 ⊕ 2 ⊕ 2 ⊕ 1 ⊕ 3 = 5 ⊕ 5 ⊕ 3 ⊕ 3 ⊕ 2 ⊕ 2 ⊕ 1 = 0 ⊕ 0 ⊕ 0 ⊕ 1 = 1;数列中出现两次的数5,3,2在异或都将得出0,因此得出只出现一次的数字1。

这题只要将所有数字异或即可得只出现一次的数字。而且这方法极大的节约了空间和时间。

时间: 2025-01-07 21:40:20

关于异或(Xor)的一点笔记的相关文章

阅读xtrabackup代码的一点笔记

xtrabackup binary最重要的两个过程是backup和prepare,对应的函数分别是xtrabackup_backup_func()和xtrabackup_prepare_func(),这里做一些阅读代码时的笔记. xtrabackup backup的线程模型: 1. 一个log拷贝线程: 2. n个ibd文件拷贝线程: 3. 一个io监控线程: 4. 通过suspend_start/suspend_end文件来标注是否启动终止线程: typedef struct { datafi

[转&精]IO_STACK_LOCATION与IRP的一点笔记

IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料. 1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window) 2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序. IRP的头部有一个当前IO_STACK_LOCATION的数组索引,同时也有

一点笔记

去年年底的时候买了一只Kindle Paperwhite,因为尺寸较小,方便携带,所以也比较适合看一些非技术类的图书.加上每天上下班路上的2个小时,等电梯时间,以及吃饭等座的一些闲暇时间,看了一些书,有时候突然觉得,只有这些小的碎时间才是最自由的,平常上班时间为了生活,晚上回来要休息积蓄能量.几个月下来也零零散散的看了一些书,有时候看着看着很想写点东西,就在手机上用OneNote记了作为读书笔记,本来想在朋友圈分享的,由于字数限制就写了这篇水文,下面就按照觉得有意思的顺序来逐个些吧,共九本书,后

关于在VB.NET中调用使用VC++编写的类库dll的一点笔记

前言 结对作业要求一出来,我就立刻想到了把“计算核心”封装成dll,然后使用vb.net编写UI调用dll的思路.然而在实现过程中却遇到了很多的问题. 我在这个过程中是负责使用vb.net编写UI并调用编写好的DLL进行计算的. 目标 使用c++把类封装到dll,并在vb.net中调用该dll,使用该dll中封装好的类.在查找资料的过程中,发现vb.net调用dll的方法主要有两种. (IDE:Visual Studio 2013 professional) 方法一:使用Declare语句 vb

IO_STACK_LOCATION与IRP的一点笔记

IO_STACK_LOCATION和IRP算是驱动中两个很基础的东西,为了理解这两个东西,找了一点资料. 1. IRP可以看成是Win32窗口程序中的消息(Message),DEVICE_OBJECT可以看成是Win32窗口程序中的窗口(Window) 2. 任何内核模式程序在创建一个IRP时,同时还创建了一个与之关联的IO_STACK_LOCATION结构数组:数组中的每个堆栈单元都对应一个将处理该IRP的驱动程序.IRP的头部有一个当前IO_STACK_LOCATION的数组索引,同时也有一

清北学堂模拟赛d1t6 或和异或(xor)

题目描述 LYK最近在研究位运算,它研究的主要有两个:or和xor.(C语言中对于|和^) 为了更好的了解这两个运算符,LYK找来了一个2^n长度的数组.它第一次先对所有相邻两个数执行or操作,得到一个2^(n-1)长度的数组.也就是说,如果一开始时a[1],a[2],-,a[2^n],执行完第一次操作后,会得到a[1] or a[2],a[3] or a[4] ,-, a[(2^n)-1] or a[2^n]. 第二次操作,LYK会将所有相邻两个数执行xor操作,得到一个2^(n-2)长度的数

cookie随便写的一点笔记(抄书的)

cookie是保存在客户端的文本,能够在一定程度上提高用户体验.Servlet API 中提供了Cookie类,可以创建Cookie对象,并通过响应中的addCookie方法,将cookie保存到客户端. Cookie的概念与使用:    cookie是保存在客户端的文本    Servlet API提供了Cookie类,可以将文本信息封装成Cookie对象    HttpServletResponse接口中提供了addCookie方法,将cookie添加到响应中    HttpServletR

关于比较的一点笔记

在Java中要进行两个对象的比较时,会用到关系运算符.通常关系运算符生成的是一个boolean值结果.它们评价的是运算对象值之间的关系.一般关系运算符包括小于(<).大于(>).小于等于(<=).大于等于(>=).等于(==)以及不等于(!=).等于和不等于适用于所有内建的数据类型,但其他比较不适用于boolean类型. 关系运算符==和!=适用于所有对象,但是会有一些有趣的现象,下面是测试代码 1 public class Equivalence { 2 public stati

[JAVA Programming] 关于JList的一点笔记

这次写JAVA课的大作业,首先不得不佩服所给的dictionary.txt文件的厉害之处啊,各种大小写.连字符还有各种词组的不同情况在自己测试的时候都中奖了,我该高兴么... 其实要求不高,大概就是一个词典的查询软件,提供了后台词典,只要完成其中的文件I/O,进行String的处理就可以了. 下面其实主要是一些算法问题,查找的话,既然有序(但是从某些角度说,'-'的值要比a-z小啊,但是在dictionary中的顺序却不是这样啊~~所以我暴力地进行了一次QuickSort...)果断O(logn