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)};
Bei umgekehrter Arbeit erhalten wir ein vorzeichenloses langes Array mit dem Namen crc_table. Wir können die Größe des Arrays weglassen, da die Makros sicherstellen, dass das Array genau 256 Elemente enthält. Wir initialisieren das Array mit 16 'Datenzeilen', indem wir 16 Aufrufe des Makros R verwenden.
Jeder Aufruf von R expandiert in vier Fragmente (Makro F) von vier Konstanten (Makro K) für insgesamt 16 "Datenspalten".
Das Makro K ist die entrollte Schleife, die im Code der ursprünglichen Frage mit k indiziert ist. Der Wert c wird achtmal aktualisiert, indem das Makro C aufgerufen wird.
Diese auf Präprozessoren basierende Lösung beansprucht während der Makro-Erweiterung ziemlich viel Speicher. Ich habe versucht, es ein wenig kürzer zu machen, indem ich eine zusätzliche Stufe der Makro-Erweiterung hatte und mein Compiler puked. Der obige Code wird (langsam) mit Visual C ++ 2012 und g ++ 4.5.3 unter Cygwin (Windows 7 64-Bit 8 GB RAM) kompiliert.
Bearbeiten:
Das obige Fragment enthält 295 Bytes einschließlich Leerzeichen. Nachdem alle Makros mit Ausnahme von C erweitert wurden, wächst sie auf 9.918 Byte. Mit jeder Ebene des C-Makros wächst die Größe schnell:
- 25,182
- 54,174
- 109.086
- 212,766
- 407,838
- 773,406
- 1,455,390
- 2,721,054
Wenn also alle Makros erweitert wurden, wird diese kleine 295-Byte-Datei zu über 2,7 Megabyte Code erweitert, der kompiliert werden muss, um das ursprüngliche 1024-Byte-Array zu generieren (unter der Annahme von vorzeichenlosen 32-Bit-Long-Werten)!
Eine andere Bearbeitung:
Ich habe das C-Makro basierend auf einem Makro aus einer anderen Antwort modifiziert, um zusätzliche 11 Bytes herauszupressen, und die vollständig erweiterte Makrogröße stark reduziert. 2,7 MB sind zwar nicht so schlimm wie 54 MB (die vorherige endgültige Größe aller Makroerweiterungen), sie sind jedoch immer noch von Bedeutung.