Естественно, что XOR можно использовать дважды, чтобы вернуть исходное значение. Что, если исходное значение является частью маски?Решение побитового уравнения XOR и ADD
Кодирование:
e[i] = c[i]^(c[i] + c[i-1])
Предполагая: начальное значение с [-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)). Так что да, должна быть потеряна по одному байту над множеством.
Простой. По определению. c = e^(p + c) – LawfulEvil
Э-э, да. Как насчет только с слева? :) – Fil
Верно ли, что: a^(b + c) = (a^b) + (a^c); или похожие? – Fil