有人可以在Python 3中解释XOR(用于校验和)

时间:2017-03-20 18:55:42

标签: python python-3.x checksum xor

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

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为0且安全检查点行包含三个工作人员,则该过程如下所示:

0 1 2 /

3 4/5

6/7 8

守卫' XOR(^)校验和为0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 6 == 2。

同样,如果第一个工作人员的ID为17且检查点拥有四个工作人员,则该过程如下:

17 18 19 20 /

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之间(包括0和2000000000),并且检查点行始终至少为1个工作人员。

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

测试用例

输入:

(int) start = 0

(int) length = 3

输出:

(int) 2

输入:

(int) start = 17

(int) length = 4

输出:

(int) 14

2 个答案:

答案 0 :(得分:2)

你想看看按位操作,这似乎是一篇有点合理的文章:https://www.programiz.com/c-programming/bitwise-operators

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

如果您应用某项操作(例如xor ^&或或|),那么您可以使用此表示形式。

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

每个位代表2的幂。

当xoring两个数字,比如说0b11000b1010时,你创建一个新数字,只设置那些位,这两个参数在两个参数中是不相同的

0b1100 ^ 0b1010 = 0b0110

从您的具体示例:0^1^2^3^4^6 == 2

0^1 = 0b0000^0b0001 = 1
1^2 = 0b0010^0b0001 = 3
3^3 = 0b0011^0b0011 = 0
0^4 = 0b0000^0b0100 = 4
4^6 = 0b0100^0b0110 = 2

答案 1 :(得分:1)

让我们看一下第一个例子中的值。请记住,这些都是按位运算符的二进制值。请注意,您发布的内容的实际结果是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),它执行XOR,但是为每个输入旋转输入一个位置。第一项旋转1位,第二项旋转2位等