Цитата Сообщение от Patron Посмотреть сообщение
Вот классический "безразмерный" вариант, вычисляющий CRC-16 для произвольной последовательности битов.

Внутренний вариант ВП1-128:
Код:
unsigned short int crc16_bitstep( unsigned short crc, int bit )
{
	int crc_high_bit = ( crc & 0x8000 ? 1 : 0 );
	int DoInvert     = bit ^ crc_high_bit;

	if( DoInvert ) { crc = (crc << 1) ^ 0x1021; }
	else           { crc = (crc << 1);          }

	return crc;
}
Да, спасибо, в хороший вид привели (кстати, делятся инвертированные данные, иначе было бы - if(!DoInvert ))

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

Впрочем, по Вашему последнему коду сейчас видно, что если на вход подать 16-битное значение совпадающее с тем что в регистре на данный момент, то ни один xor не будет выполнен и получим 0. Об алгоритме как там сумма вычислялась вообще можно в таком случае не думать.