Код
#define CRC_LENGTH 32
#define POLY 0xblah-blah-blah
// коэффициенты CRC32_yy = crc32(yy, 0), где yy = {2^0, 2^1, ..., 2^(CRC_LENGTH-1)}
// считаются предварительно для требуемого полинома и CRC32_init = 0 через сдвиги
// (или берутся готовые :))
const uint32 CRC32_Table[CRC_LENGTH] = {CRC32_0, ..., CRC32_31};
uint32 crc32(uint32 x, uint32 CRC32_init)
{
uint i;
uint32 bitmask, y, CRC32 = 0;
y = x ^ CRC32_init;
for(i = 0, mask =1; i < CRC_LENGTH; i++, bitmask <<= 1)
if(y & bitmask) CRC32 ^= CRC32_Table[i];
return CRC32;
}
// или для экономии памяти
uint32 crc32(uint32 x, uint32 CRC32)
{
uint i;
uint32 bitmask;
x ^= CRC32; CRC32 = 0;
for(i = 0, mask =1; i < CRC_LENGTH; i++, bitmask <<= 1)
if(x & bitmask) CRC32 ^= CRC32_Table[i];
return CRC32;
}
// или для еще большей экономии памяти на 8-битниках
// выровнять таблицу по 0bx0000000, uint8 bitmask, i лишний и т.д.:)
Для CRC8 (цикл стОит развернуть), CRC16, CRCxx, ... аналогично.
Если время совсем не напрягает, то через сдвиги, как уже предлагали.