【问题标题】:Can someone please explain XOR (for checksum) in Python 3有人可以在 Python 3 中解释 XOR(用于校验和)吗
【发布时间】:2017-03-20 18:55:41
【问题描述】:

我正在为 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 异或到校验和中,然后然后起飞吃午饭。幸运的是,工人们的有序性使他们总是按数字顺序排列,没有任何间隙。

例如,如果队列中的第一个工作人员的 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 之间(含),检查点行将始终至少有 1 个工作人员。

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

测试用例

输入:

(int) start = 0

(int) length = 3

输出:

(int) 2

输入:

(int) start = 17

(int) length = 4

输出:

(int) 14

【问题讨论】:

    标签: python python-3.x checksum xor


    【解决方案1】:

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

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

    如果你应用一个操作(比如 xor ^, and & or or 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
    

    【讨论】:

    • 太棒了,谢谢你的解释。这现在更有意义了。你肯定给我指明了正确的方向。
    【解决方案2】:

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

    XOR 是对给定输入的奇偶校验运算符:如果 1 的位数是偶数,则 XOR 返回 0;如果是奇数,则异或返回 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 位,依此类推。

    【讨论】:

      猜你喜欢
      • 2020-06-25
      • 2018-09-05
      • 1970-01-01
      • 2015-03-20
      • 1970-01-01
      • 2012-05-29
      • 2010-12-13
      • 1970-01-01
      相关资源
      最近更新 更多