C / C ++, 306 295 bytes
#define C(c)((c)>>1^((c)&1?0xEDB88320L:0))
#define K(c)(C(C(C(C(C(C(C(C(c))))))))),
#define F(h,l)K((h)|(l+0))K((h)|(l+1))K((h)|(l+2))K((h)|(l+3))
#define R(h)F(h<<4,0)F(h<<4,4)F(h<<4,8)F(h<<4,12)
unsigned long crc_table[]={R(0)R(1)R(2)R(3)R(4)R(5)R(6)R(7)R(8)R(9)R(10)R(11)R(12)R(13)R(14)R(15)};
Trabajando en reversa, terminamos con una matriz larga sin signo llamada crc_table. Podemos omitir el tamaño de la matriz ya que las macros se asegurarán de que haya exactamente 256 elementos en la matriz. Inicializamos la matriz con 16 'filas' de datos utilizando 16 invocaciones de la macro R.
Cada invocación de R se expande en cuatro fragmentos (macro F) de cuatro constantes (macro K) para un total de 16 'columnas' de datos.
La macro K es el bucle desenrollado indexado por k en el código de la pregunta original. Actualiza el valor c ocho veces invocando la macro C.
Esta solución basada en un preprocesador utiliza bastante memoria durante la expansión de macro. Traté de hacerlo un poco más corto al tener un nivel adicional de expansión de macro y mi compilador vomitó. El código anterior se compila (lentamente) con Visual C ++ 2012 y g ++ 4.5.3 en Cygwin (Windows 7 64 bit 8GB RAM).
Editar:
El fragmento anterior es de 295 bytes, incluido el espacio en blanco. Después de expandir todas las macros, excepto C, crece a 9.918 bytes. A medida que se expande cada nivel de macro C, el tamaño crece rápidamente:
- 25,182
- 54,174
- 109,086
- 212,766
- 407,838
- 773,406
- 1,455,390
- 2,721,054
Entonces, para cuando se hayan expandido todas las macros, ¡ese pequeño archivo de 295 bytes se expande en más de 2.7 megabytes de código que se debe compilar para generar la matriz original de 1024 bytes (suponiendo valores largos sin signo de 32 bits)!
Otra edición:
Modifiqué la macro C basada en una macro de otra respuesta para exprimir 11 bytes adicionales y reduje en gran medida el tamaño de la macro expandida completa. Si bien 2.7 MB no es tan malo como 54 MB (el tamaño final anterior de toda expansión macro), sigue siendo significativo.