सी / सी ++, 306 295 बाइट्स
#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)};
रिवर्स में काम करते हुए, हम crc_table नाम के एक अहस्ताक्षरित लंबे सरणी के साथ हवा करते हैं। हम सरणी के आकार को छोड़ सकते हैं क्योंकि मैक्रो सुनिश्चित करेगा कि सरणी में बिल्कुल 256 तत्व हैं। हम मैक्रो आर के 16 चालान का उपयोग करके डेटा की 16 'पंक्तियों' के साथ सरणी को आरंभीकृत करते हैं।
R का प्रत्येक आह्वान डेटा के कुल 16 'कॉलम' के लिए चार स्थिरांक (मैक्रो K) के चार टुकड़ों (मैक्रो F) में फैलता है।
मैक्रो K मूल प्रश्न से कोड में k द्वारा अनुक्रमित अनियंत्रित लूप है। यह मैक्रो C को दबाकर आठ बार मान c को अद्यतन करता है।
यह प्रीप्रोसेसर आधारित समाधान मैक्रो विस्तार के दौरान स्मृति का काफी उपयोग करता है। मैंने मैक्रो विस्तार के एक अतिरिक्त स्तर और मेरे कंपाइलर को पुक करके इसे थोड़ा कम करने की कोशिश की। विजुअल C ++ 2012 और सिग्विन (विंडोज 7 64 बिट 8 जीबी रैम) के तहत विजुअल C ++ 2012 और जी ++ 4.5.3 दोनों के साथ कोड ऊपर (धीरे)।
संपादित करें:
सफेद स्थान सहित 295 बाइट्स के ऊपर का टुकड़ा है। सी को छोड़कर सभी मैक्रोज़ का विस्तार करने के बाद यह 9,918 बाइट्स तक बढ़ता है। C मैक्रो के प्रत्येक स्तर का विस्तार होने के कारण आकार जल्दी बढ़ता है:
- 25,182
- 54,174
- 109,086
- 212,766
- 407,838
- 773,406
- 1,455,390
- 2,721,054
इसलिए जब तक सभी मैक्रोज़ का विस्तार नहीं किया गया, तब तक कि 295 295 बाइट फ़ाइल 2.7 मेगाबाइट से अधिक कोड में फैल जाती है, जिसे मूल 1024 बाइट सरणी (32 बिट अहस्ताक्षरित लंबे मान मान) उत्पन्न करने के लिए संकलित किया जाना चाहिए!
एक और संपादन:
मैंने एक अतिरिक्त 11 बाइट को निचोड़ने के लिए एक अन्य उत्तर से एक मैक्रो पर आधारित सी मैक्रो को संशोधित किया, और पूर्ण विस्तारित मैक्रो आकार को बहुत कम कर दिया। जबकि 2.7 एमबी 54 एमबी (सभी मैक्रो विस्तार का पिछला अंतिम आकार) जितना बुरा नहीं है, यह अभी भी महत्वपूर्ण है।