Алгоритм, если он допускает перекрытия, должен быть с потерями.
Из вашего примера:
01110101 00110000
| |
101 001
| |
110101
Если вы меняете их местами, значения:
01110101 00110000
| |
110 101
*** - Mismatch!
| |
101001
*** - Mismatch!
Независимо от того, что, если вы разрешаете перекрытие, вы не можете гарантировать, что сможете получить те же исходные значения после выполнения обмена.
Два способа решения этой проблемы:
- Документируйте, что ваша функция с потерями, и что вы не можете гарантировать, что вы сможете извлечь замененные биты обратно.
Мне не нравится эта идея, потому что я не знаю, что бы я использовал такойалгоритм для - Бросьте исключение, если в алгоритм введено перекрытие, и напишите свою программу, которая использует этот алгоритм таким образом, чтобы он не генерировал перекрытия.