【发布时间】: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