Некропост, конечно, но вдруг кому понадобится:
Раз используется одна и та же маска, только со сдвигом, то надо ее также обратно сдвигать. Правильно отметили, что это деление полиномов.
Как происходит деление?
полином 011000101000 = 0x628
00001100100110011001 = 0х0C9999
011000101000 - не делится => 0
-------------------
0000110010011
011000101000 - не делится => 0
------------------
00001100100110
011000101000 - не делится => 0
------------------
000011001001100
011000101000 - опа, делится => 1, делаем xor
-----------------
0000000011001001 <- добавляем следующий бит из исходного числа
011000101000 - не делится => 0
00000000110010011
011000101000 - не делится => 0
000000001100100110
011000101000 - не делится => 0
0000000011001001100
011000101000 - опа, делится => 1, делаем xor
-----------------
00000000000011001001
011000101000 - не делится => 0
-----------------
00000000000011001001 0 <- исходное число кончилось, добавляем нули
01100010100 0 - не делится => 0
-----------------
00000000000011001001 00
0110001010 00 - не делится => 0
-----------------
00000000000011001001 000
011000101 000 - опа, делится => 1, делаем xor
-----------------
00000000000000001100 0000
01100010 0000 - не делится => 0
-----------------
00000000000000001100 00000
0110001 00000 - не делится => 0
-----------------
00000000000000001100 000000
011000 000000 - не делится => 0
-----------------
00000000000000001100 0000000
01100 0000000 - делится => 1
-----------------
0
еще 4 разряда будут нули
[[
записываем результат сверху вниз - 00010001000100010000 = 0х111110
последняя единица потерялась, потому что маска, ссответствующая этому биту - 0, и не влияет на результат