如何仅异或列表中的指定位

How to xor just the specified bits in a list

上下文: Image: XOR first and second, to form heart-shaped pixel art

我正在创建一个可视化的一次一密程序,它将输入位图分成两个不同的随机位列表,当它们一起进行异或运算时,应该会再现输入位图 - 有点像 "reverse-reverse-engineering" .

作为高度简化的解释,每个新创建的位图都提供给 2 个独立的接收者。如果他们的组合形成特定的形状(见下文),他们可能会相互信任。

在我上面的示例中,像素输入和最终输出在中间形成一个心形。


尝试: 最初,我的代码成功地将适当的位分配给两个单独的列表,具体取决于输入位是零还是一。 (随机性被包括在内,因为我希望每次都使用不同的输出。)当输入仅在白色背景上仅显示黑色(即 1 串)心形时,这一切都很好:Image: binary representation

input_pixels = [[0,0, ... 0], [0,0, ... 0], ... , [0,1, ... 1,0]]  ## I've shortened here

bitmap1 = []
bitmap2 = []

for row in input_pixels:
    temp1 = []
    temp2 = []

    for bit in row:
        ## 'Case A' when a bit in input_pixels is 0
        if bit == 0:
            randbit = random.choice((0, 1))
            temp1.append(randbit)
            if randbit == 1:
                temp2.append(1)
            else:
                temp2.append(0)

        ## 'Case B' when a bit in input_pixels is 1
        else:
            randbit = random.choice((0, 1))
            temp1.append(randbit)
            if randbit == 1:
                temp2.append(0)
            else:
                temp2.append(1)

    bitmap1.append(temp1)
    bitmap2.append(temp2)

但是,如果输入在心形以外的区域包含 1,我的代码显然不会产生预期的结果,因为条件句不会区分 "shapes",因为我们认为它们。


问题:如何更改代码以尽可能识别我指定形状的位,并且仅将'Case B'应用于此类相应部分?我对正则表达式不是很熟悉,但这也许可以解决这些边缘情况吗?

编辑(澄清):

我的代码失败,例如:Image: If the 1s occupy non-heart-shaped locations just to add noise 虽然我可以选择输入,以便只有 heart == 1(如上面标记为 'binary repr.' 的图像),但在这种情况下,用户可以立即看到,而无需求助于 XOR-ing,他们收到的位图将形成一颗心 - 我想避免。因此,我需要以某种方式将 'Case B' 应用到 只是 所需的 'specified' 区域,心脏,给定任何嘈杂的输入。

我不知道你为什么想要心脏周围的随机噪声,但只要使用 temp2.append(random.choice((0, 1)) 独立于 randbit 的值就可以做到(仅针对案例 A,如果 0表示白色,心为黑色)。

毕竟,两个随机位异或在一起仍会生成一个随机位值。