Правое смещение битов (>>) и по модулю (%) являются необратимыми операциями:
В случае правильного смещения битов потерянные биты теряются, поэтому при обращении a >> b
вы получите 2 ^ bразличные возможные результаты.
Для оператора по модулю в x % 8 = y
есть 32 возможных значения для x, предполагая, что его максимальная длина составляет 8 бит.(Это будет каждый x * 8 + y
, который умещается в 8 битах)
Операция xor является единственной обратимой.Если у вас есть
a ^ b = c
, тогда
c ^ b = a
Таким образом, для более чем одного входа у вас будет одинаковый выход.Например, давайте рассмотрим случай, когда j = 0
j % 8 = 0 % 8 = 0
paramString[j] >> (j % 8) = paramString[0] >> 0 = paramString[0]
paramString[0] ^ paramString[j] = paramString[0] ^ paramString[0] = 0
Это означает, что для вашего первого символа и каждого восьмого последующего символа (это каждый символ, индекс которого j кратен 8, поэтому j % 8 = 0
) результат будет равен 0, в зависимости от того, каким был исходный символ (как вы можете видеть в выходной строке вашего примера).
Вот почему, даже если вы переборщили все возможные входные данные (всего 256 *n возможных строк ввода (длина строки n), вы никогда не можете быть уверены в том, что было исходным входом, так как многие входы дают одинаковый результат.