Да, спасибо, в хороший вид привели (кстати, делятся инвертированные данные, иначе было бы - if(!DoInvert ))
Я вижу отличие в том что каждый новый бит данных добавляется в СТАРШИЙ разряд сдвигового регистра. А когда мы "по-школьному" делим "в столбик" новый разряд (цифру) мы всегда добавляем справа - то есть в МЛАДШИЙ разряд. На самом деле понятно почему так - мы же после блока данных не вдвигаем еще дополнительных два нулевых байта, вместо этого мы умножаем каждый бит данных на 0x10000 сразу при вдвигании, поэтому дополнительные байты не нужны. То есть математика тут у нас та же - полиномиальное деление конкатенации сообщения и шестнадцати дополнительных замыкающих нулей. Просто хотелось бы привести к обычному делению "в столбик" (с вкидыванием нового разряда вправо), но видимо такая модификация алгоритма к нему не приводится.
Впрочем, по Вашему последнему коду сейчас видно, что если на вход подать 16-битное значение совпадающее с тем что в регистре на данный момент, то ни один xor не будет выполнен и получим 0. Об алгоритме как там сумма вычислялась вообще можно в таком случае не думать.





Ответить с цитированием