C / C ++, 306 295 byte
#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)};
Lavorando al contrario, finiamo con un array lungo senza segno chiamato crc_table. Possiamo omettere le dimensioni dell'array poiché le macro assicureranno che ci siano esattamente 256 elementi nell'array. Inizializziamo l'array con 16 "righe" di dati utilizzando 16 invocazioni della macro R.
Ogni invocazione di R si espande in quattro frammenti (macro F) di quattro costanti (macro K) per un totale di 16 "colonne" di dati.
La macro K è il ciclo srotolato indicizzato da k nel codice della domanda originale. Aggiorna il valore c otto volte invocando la macro C.
Questa soluzione basata su preprocessore utilizza un bel po 'di memoria durante l'espansione delle macro. Ho provato a renderlo un po 'più breve avendo un ulteriore livello di espansione macro e il mio compilatore ha vomitato. Il codice sopra si compila (lentamente) sia con Visual C ++ 2012 che g ++ 4.5.3 sotto Cygwin (Windows 7 64 bit 8 GB RAM).
Modificare:
Il frammento sopra è di 295 byte incluso lo spazio bianco. Dopo aver espanso tutte le macro ad eccezione di C, aumenta a 9.918 byte. Man mano che si espande ogni livello di macro C, le dimensioni aumentano rapidamente:
- 25.182
- 54.174
- 109.086
- 212.766
- 407.838
- 773.406
- 1.455.390
- 2.721.054
Quindi, quando tutte le macro sono state espanse, quel piccolo file da 295 byte si espande in oltre 2,7 megabyte di codice che deve essere compilato per generare l'array originale da 1024 byte (assumendo valori lunghi senza segno a 32 bit)!
Un'altra modifica:
Ho modificato la macro C in base a una macro da un'altra risposta per comprimere altri 11 byte e ho ridotto notevolmente le dimensioni della macro espansa. Mentre 2.7 MB non è così male come 54 MB (la dimensione finale precedente di tutta l'espansione macro), è comunque significativa.