有人能解释一下Python3中的XOR(用于校验和)吗

有人能解释一下Python3中的XOR(用于校验和)吗,python,python-3.x,checksum,xor,Python,Python 3.x,Checksum,Xor,我正在为foo.bar做一个练习,其基本思想是获取一个整数列表,并对其进行一些操作,以导出该列表的特定子集,然后通过以下方式对这些值进行XOR(用于校验和): result = 0^1^2^3^4^6 等于2 另一个例子: result2 = 17^18^19^20^21^22^23^25^26^29 等于14 我不太清楚这里发生了什么,以及这些值(2,14)是如何得出的 Foo.Bar对问题的实际描述 >排队做 您几乎已经准备好销毁LAMBCHOP末日设备,但是保护LAMBCHOP底层系统

我正在为foo.bar做一个练习,其基本思想是获取一个整数列表,并对其进行一些操作,以导出该列表的特定子集,然后通过以下方式对这些值进行XOR(用于校验和):

result = 0^1^2^3^4^6
等于2

另一个例子:

result2 = 17^18^19^20^21^22^23^25^26^29
等于14

我不太清楚这里发生了什么,以及这些值(2,14)是如何得出的

Foo.Bar对问题的实际描述

>排队做 您几乎已经准备好销毁LAMBCHOP末日设备,但是保护LAMBCHOP底层系统的安全检查点将成为一个问题。你可以在不触发任何警报的情况下取下一个,这太棒了!除了作为Lambda指挥官的助手,你已经了解到检查站即将接受自动审查,这意味着你的破坏行为将被发现,你的掩护将被揭穿——除非你能欺骗自动审查系统

为了欺骗系统,您需要编写一个程序来返回警卫在检查所有工作人员之后所拥有的相同安全校验和。幸运的是,Lambda指挥官对效率的渴望不允许长时间排队,因此检查站警卫找到了加快通过率的方法。警卫不是检查每一个经过的工人,而是检查排队的每一个人,同时记下他们的安全ID,然后让队伍重新填满。一旦他们完成了这项工作,他们会再次检查生产线,这一次会让最后一名工人离开。他们继续这样做,每次从生产线中多留下一个工人,但记录他们检查的工人的安全ID,直到跳过整行,在这一点上,他们将他们记录的所有工人的ID异或成一个校验和,然后出发吃午饭。幸运的是,工人们的有序性使他们总是按照数字顺序排列,没有任何空隙

例如,如果行中的第一个worker的ID为0,而安全检查点行包含三个worker,则流程如下所示:

0112/

3 4/5

6/7 8

其中保护的XOR(^)校验和为0^1^2^3^4^6==2

类似地,如果第一个工作进程具有ID 17,并且检查点包含四个工作进程,则流程如下所示:

17181920/

21 22 23/24

25 26/27 28

29/30 31 32

产生校验和17^18^19^20^21^22^23^25^26^29==14

所有工作进程ID(包括第一个工作进程)都介于0和2000000000之间,并且检查点行的长度始终至少为1个工作进程

根据这些信息,编写一个函数应答(开始,长度),通过输出警卫通常在午餐前提交的相同校验和来覆盖丢失的安全检查点。在自动检查发生之前,您只有足够的时间找出第一个要检查的工作进程的ID(开始)和行的长度(长度),因此您的程序必须仅使用这两个值生成正确的校验和

测试用例 投入:

(int) start = 0

(int) length = 3
(int) start = 17

(int) length = 4
输出:

(int) 2
(int) 14
投入:

(int) start = 0

(int) length = 3
(int) start = 17

(int) length = 4
输出:

(int) 2
(int) 14

让我们看看第一个示例中的值。请记住,这些都是位运算符的二进制值。请注意,您发布的内容的实际结果是2,而不是6:在Python解释器上检查它

XOR是给定输入上的奇偶校验运算符:如果1位的数目为偶数,则XOR返回0;如果是奇数,则XOR返回1。让我们看看每个二进制列中有多少个1位:

0000
0001
0010
0011
0100
0110
----
0232 -- decimal count
0010 -- 1 for odd, 0 for even
。。。这是十进制数2

如果对较长的较大数字序列执行相同的操作,则XOR的奇偶校验为1110或14位小数



请注意,这将检测几类简单错误,但它的主要缺点是无法检测两项是否按顺序颠倒。例如,[1,2,3]和[2,1,3]将具有相同的校验和。有一个简单的升级调用“循环冗余校验”(CRC),它执行异或运算,但为每个输入将输入再旋转一个位置。第一项旋转1位,第二项旋转2位,以此类推。

让我们看看第一个示例中的值。请记住,这些都是位运算符的二进制值。请注意,您发布的内容的实际结果是2,而不是6:在Python解释器上检查它

XOR是给定输入上的奇偶校验运算符:如果1位的数目为偶数,则XOR返回0;如果是奇数,则XOR返回1。让我们看看每个二进制列中有多少个1位:

0000
0001
0010
0011
0100
0110
----
0232 -- decimal count
0010 -- 1 for odd, 0 for even
。。。这是十进制数2

如果对较长的较大数字序列执行相同的操作,则XOR的奇偶校验为1110或14位小数



请注意,这将检测几类简单错误,但它的主要缺点是无法检测两项是否按顺序颠倒。例如,[1,2,3]和[2,1,3]将具有相同的校验和。有一个简单的升级调用“循环冗余校验”(CRC),它执行异或运算,但为每个输入将输入再旋转一个位置。第一项旋转1位,第二项旋转2位,以此类推。

要了解逐位操作,这篇文章似乎有点合理:

位运算背后的基本思想是,每个数字在计算机内部以二进制格式的基数2表示。二进制运算符使用此数字表示进行计算

如果应用一个操作(如xor
^
,和
&
|
),则使用此表示法

二进制数是这样表示的,可以转换为十进制表示(反之亦然):
0b1101=1+4+8=13

其中每一位代表二的幂

当对两个数字进行异或运算时,比如说
0b1100
0b1010
,您正在创建一个新的数字,仅设置了这些位,这将