C / C ++, 306 295 octets
#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)};
En travaillant en sens inverse, nous nous retrouvons avec un long tableau non signé nommé crc_table. Nous pouvons omettre la taille du tableau car les macros garantiront qu'il y a exactement 256 éléments dans le tableau. Nous initialisons le tableau avec 16 «lignes» de données en utilisant 16 invocations de la macro R.
Chaque invocation de R se développe en quatre fragments (macro F) de quatre constantes (macro K) pour un total de 16 «colonnes» de données.
La macro K est la boucle déroulée indexée par k dans le code de la question d'origine. Il met à jour la valeur c huit fois en appelant la macro C.
Cette solution basée sur un préprocesseur utilise beaucoup de mémoire lors de l'expansion des macros. J'ai essayé de le raccourcir un peu en ayant un niveau supplémentaire d'expansion de macro et mon compilateur a vomi. Le code ci-dessus se compile (lentement) avec Visual C ++ 2012 et g ++ 4.5.3 sous Cygwin (Windows 7 64 bits 8 Go de RAM).
Éditer:
Le fragment ci-dessus fait 295 octets, espace blanc compris. Après avoir développé toutes les macros sauf C, il passe à 9 918 octets. Au fur et à mesure que chaque niveau de macro C est développé, la taille augmente rapidement:
- 25 182
- 54 174
- 109,086
- 212 766
- 407 838
- 773 406
- 1 455 390
- 2 721 054
Donc, au moment où toutes les macros ont été développées, ce petit fichier de 295 octets se développe en plus de 2,7 mégaoctets de code qui doivent être compilés pour générer le tableau d'origine de 1024 octets (en supposant des valeurs longues non signées 32 bits)!
Un autre montage:
J'ai modifié la macro C sur la base d'une macro d'une autre réponse pour extraire 11 octets supplémentaires et j'ai considérablement réduit la taille de la macro étendue. Bien que 2,7 Mo ne soit pas aussi mauvais que 54 Mo (la taille finale précédente de toutes les extensions de macro), il est toujours important.