【问题标题】:Solving bitwise XOR and ADD equation求解按位 XOR 和 ADD 方程
【发布时间】:2015-06-11 17:03:56
【问题描述】:

自然可以使用两次异或来取回原始值。如果原始值是掩码的一部分怎么办?

编码:

e[i] = c[i] ^ (c[i] + c[i-1])

假设:起始值c[-1] = 0,^表示按位异或

命令式 C 形式:

void encode(byte *p, int len)
{
    byte prev = 0;
    for (auto i = 0; i < len; i++)
    {
        auto byt = p[i];
        p[i] = byt ^ (prev + byt);
        prev = byt;
    }
}

如何创建一个从 e => c 反转这个的解码步骤?

鉴于我从您的回答中学到的知识,我已经简化/澄清(阅读:更改)问题!使用与 DanL 类似的步骤,从原始方程开始:

e[i] = c[i] ^ (c[i] + c[i-1])

e[i] ^ c[i] = c[i] ^ (c[i] + c[i-1]) ^ c[i]
e[i] ^ c[i] = c[i] + c[i-1]
c[i] = e[i] ^ c[i] - c[i-1]
c[i] ^ c[i] = (e[i] ^ c[i] - c[i-1]) ^ c[i]
0 = e[i] ^ c[i] ^ c[i] - c[i-1] ^ c[i]
0 = e[i] - c[i-1] ^ c[i]
c[i-1] ^ c[i] = e[i]
c[i-1] ^ c[i] ^ c[i-1] = e[i] ^ c[i-1]
c[i] = e[i] ^ c[i-1]

???

现在,查看原始编码 - 第一个字节将始终为零 (= c[i] ^ (c[i] + 0))。所以是的,在这个集合中肯定会丢失一个字节。

【问题讨论】:

  • 你显然不能,e = 0, p = 0与任何c一致
  • e = 1, p = 1 与任何偶数c 一致,所以仍然没有运气。顺便说一句,xor 不会分布在加法上。
  • 你的方程式不是重言式。 1 = 1^(0&0)。 (c 既是 1 又是 0)当然,如果这是编程,右边的“c”是 c 的前一个值,所以整个事情可能没问题。也许如果你给我们上下文。
  • 你能发布那个(整个)函数吗?
  • 您需要使用下标等将循环中的项目与之前的值区分开来。

标签: bitwise-operators logical-operators equation-solving bitwise-xor


【解决方案1】:

在循环的每次迭代中,您都在有效地计算

c_i = e ^ ( p + c_(i-1) )

如果你想反转循环,那么给定一个 c_i 你需要计算 c_(i-1)

但是,正如您所说,两次异或可以让您回到原始值,并且异或是一个交换运算,所以如果您将上述方程与 e 异或,我们就会得到

c_i ^ e = e ^ ( p + c_(i-1) ) ^ e

简化为

c_i ^ e = p + c_(i-1)

然后从两边拿走p给你

(c_i ^ e) - p = c_(i-1)

因此在你的“反转”循环中

你想要代码

c = (c ^ e) - p

编辑:在上下文中看到带有代码的修改后的问题后,我认为这是不可能的,因为我相信 mix 函数有效地将 len 字节数组映射到 len-1 字节数组。

我相信这是因为以下论点:

让未混合的数组称为unmixed,应用mix函数后的混合数组称为mixed

mixed[0] = unmixed[0] ^ (0 + unmixed[0])  //Remember prev = 0 initially

因此 混合[0] = 未混合[0] ^ 未混合[0] = 0

所以混合数组的第一个字节总是 0。

mix 函数不会增加或减少数组的大小,所以我们最终得到一个第一个元素为 0 的 len 字节数组。

因此,我们有效地将 len 字节数组的空间映射到 len-1 字节数组。

如果这是完全可逆的,我们将能够将一个 n 字节数组压缩为一个 n-1 字节数组,然后将该 n-1 字节数组压缩为一个 n-2 字节数组,依此类推。

如果我们以单字节数组为例,那么我们看到 mix 只生成一个元素为 0 的数组,你怎么知道它是之前 256 个可能的未混合数组中的哪一个?

【讨论】:

  • 事实上,原始数组中的任何零位都会导致后续字节的等效位丢失。相当有损:)
猜你喜欢
  • 1970-01-01
  • 2021-07-25
  • 1970-01-01
  • 2018-06-17
  • 2020-08-18
  • 2014-12-16
  • 2013-09-04
  • 2021-07-06
  • 2013-06-01
相关资源
最近更新 更多