我正在为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指挥官的助手之外,您已经了解到检查点即将受到自动审查,这意味着您的破坏活动将被发现并且封面被炸掉-除非您可以欺骗自动审查系统。
要欺骗系统,您需要编写一个程序以返回与警卫检查完所有工作人员之后相同的安全校验和。幸运的是,兰姆达指挥官对效率的渴望不允许长时间的排队,因此检查站后卫已经找到了提高通过率的方法。警卫人员没有检查每一个经过的工人,而是在注意他们的安全ID的同时检查了所有排队的人,然后允许排队补齐。一旦他们做完了,他们就会再次越过生产线,这次离开最后一个工人。他们继续执行此操作,每次都在该行中再派一名工人,但要记录他们要检查的人员的安全ID,直到他们跳过整行为止,然后,他们将记录下来的所有工人的ID与X校验和,然后起飞吃午饭。幸运的是,工人的井然有序的性格使他们始终按数字顺序排列,没有任何缝隙。
例如,如果该行中的第一个工作程序具有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(开始)和行的长度(长度),因此您的程序必须仅使用这两个值来生成正确的校验和。
测试用例
输入:
(int) start = 0
(int) length = 3
输出:
(int) 2
输入:
(int) start = 17
(int) length = 4
输出:
(int) 14
解决方案
按位运算的基本思想是,每个数字在计算机内部以2为底的二进制格式表示。二进制运算符使用此数字表示法进行计算。
如果应用操作(如xor^,和&或或|),则使用此表示形式。
二进制数是这样表示的,可以转换为十进制表示形式(反之亦然):0b1101 = 1 + 4 + 8 = 13
其中每一位代表2的幂。
当对两个数进行异或运算时,例如0b1100和0b1010,您将创建一个新的数,只设置了那些在两个参数中不相同的位
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