C / C ++, 306 295 bayt
#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)};
Tersine çalışarak, crc_table adında imzasız uzun bir dizi ile ayrılırız. Makroların dizide tam olarak 256 öğe olmasını sağlayacağından dizinin boyutunu atlayabiliriz. Diziyi 16 R makro çağrısını kullanarak 16 'satır' veri ile başlatırız.
Her R çağrılması, toplam 16 'sütun' veri için dört sabitten (makro K) dört parçaya (makro F) genişler.
K makrosu, orijinal sorudaki kodda k tarafından dizine eklenmiş açılmamış döngüdür. C makroyu çağırarak c değerini sekiz kez günceller.
Bu önişlemci tabanlı çözüm, makro genişletme sırasında biraz bellek kullanır. Ekstra bir makro genişletme düzeyine sahip olarak biraz daha kısa yapmaya çalıştım ve derleyicim kustu. Yukarıdaki kod Cygwin (Windows 7 64 bit 8GB RAM) altında hem Visual C ++ 2012 hem de g ++ 4.5.3 ile derlenir (yavaşça).
Düzenle:
Yukarıdaki parça, beyaz boşluk dahil 295 bayttır. C hariç tüm makroları genişlettikten sonra 9.918 bayta kadar büyür. Her bir C makrosu düzeyi genişletildikçe, boyut hızla büyür:
- 25182
- 54174
- 109086
- 212766
- 407838
- 773406
- 1455390
- 2721054
Bu nedenle, tüm makrolar genişletildiğinde, bu 295 baytlık dosya, orijinal 1024 bayt dizisini oluşturmak için derlenmesi gereken 2.7 megabayttan fazla koda genişler (32 bit işaretsiz uzun değerler varsayarak)!
Başka bir düzenleme:
Fazladan bir 11 bayt sıkıştırmak için C makrosunu başka bir cevaptan bir makroya göre değiştirdim ve tam genişletilmiş makro boyutunu büyük ölçüde azalttım. 2,7 MB, 54 MB (tüm makro genişletmelerinin önceki son boyutu) kadar kötü olmasa da, yine de önemlidir.