2017-03-20 27 views
0

我正在为foo.bar进行练习,基本思想是获取一个整数列表,并对它做一些事情来派生该列表的特定子集,则XOR(对于校验),通过此装置的那些值:是否有人可以在Python 3中解释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与检查和进行异或,然后起飞吃午饭。幸运的是,工人的有序性让他们总是按照数字顺序排列,没有任何差距。

例如,如果在第一线工人具有ID 0和安全检查线保持三名工人,处理是这样的:

0 1 2/

3五分之四

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和20亿(含)之间,和检查点线将总是至少1名工人长。

有了这些信息,写一个函数的答案(起点,长度),将通过输出相同的校验守卫会在午餐前通常提交缺少的安全检查覆盖。在自动检查发生之前,您只有足够的时间来查找要检查的第一个工人的ID(开始)和行的长度(长度),因此您的程序必须使用这两个值生成适当的校验和。

测试用例

输入:

(int) start = 0 

(int) length = 3 

输出:

(int) 2 

输入:

(int) start = 17 

(int) length = 4 

输出:

(int) 14 

回答

2

你想看看位操作,这似乎是一个关于它的有点道理的文章:在计算机内https://www.programiz.com/c-programming/bitwise-operators

位运算的基本思想是,每个数字都在基地2表示,二进制格式。二元运算符使用这个数字表示进行计算。

如果您应用操作(如xor ^&或or |),则使用此表示法。

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

在这里,每一位表示的二的幂。

当异或二把手,说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 
+0

太棒了,谢谢你的解释。这现在更有意义了。你已经明确指出了我的正确方向。 –

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位等。

相关问题