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)};
Bekerja secara terbalik, kita berakhir dengan array panjang tanpa tanda bernama crc_table. Kita dapat menghilangkan ukuran array karena makro akan memastikan ada persis 256 elemen dalam array. Kami menginisialisasi array dengan 16 'baris' data dengan menggunakan 16 doa makro R.
Setiap doa R berkembang menjadi empat fragmen (makro F) dari empat konstanta (makro K) dengan total 16 'kolom' data.
Makro K adalah loop terbuka dengan diindeks oleh k dalam kode dari pertanyaan asli. Ini memperbarui nilai c delapan kali dengan memanggil makro C.
Solusi berbasis preprosesor ini menggunakan sedikit memori selama ekspansi makro. Saya mencoba membuatnya sedikit lebih pendek dengan memiliki level tambahan ekspansi makro dan compiler saya muntah. Kode di atas mengkompilasi (secara perlahan) dengan Visual C ++ 2012 dan g ++ 4.5.3 di bawah Cygwin (Windows 7 64 bit 8GB RAM).
Edit:
Fragmen di atas adalah 295 byte termasuk spasi. Setelah memperluas semua makro kecuali untuk C tumbuh menjadi 9,918 byte. Karena setiap tingkat makro C diperluas ukurannya tumbuh dengan cepat:
- 25.182
- 54.174
- 109.086
- 212.766
- 407.838
- 773.406
- 1.455.390
- 2,721,054
Jadi pada saat semua makro telah diperluas, file 295 byte kecil itu berkembang menjadi lebih dari 2,7 megabita kode yang harus dikompilasi untuk menghasilkan array 1024 byte asli (dengan asumsi 32 bit nilai panjang yang tidak ditandatangani)!
Suntingan lain:
Saya memodifikasi makro C berdasarkan makro dari jawaban lain untuk memeras tambahan 11 byte, dan sangat mengurangi ukuran makro yang diperluas penuh. Meskipun 2,7 MB tidak seburuk 54 MB (ukuran akhir sebelumnya dari semua ekspansi makro), ini masih signifikan.