C / C ++, 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.
Кожне виклик R розширюється на чотири фрагменти (макрос F) з чотирьох констант (макро K) для загальної кількості 16 "стовпців" даних.
Макрос K - це розкручений цикл, індексований k в коді з початкового запитання. Він оновлює значення c вісім разів, викликаючи макрос C.
Це рішення на основі препроцесора використовує зовсім небагато пам'яті під час розширення макросу. Я спробував зробити його трохи коротшим, маючи додатковий рівень розширення макросу, і мій компілятор рвонув. Код вище компілюється (повільно) з Visual C ++ 2012 та g ++ 4.5.3 під Cygwin (Windows 7 64-бітова 8 Гб оперативної пам’яті).
Редагувати:
Фрагмент вище 295 байт, включаючи пробіл. Після розширення всіх макросів, крім C, він зростає до 9 918 байт. Зі збільшенням кожного рівня макросу C розмір швидко зростає:
- 25,182
- 54,174
- 109,086
- 212,766
- 407,838
- 773,406
- 1,455,390
- 2,721,054
Тож до моменту розширення всіх макросів цей маленький 295-байтний файл розшириться на понад 2,7 мегабайт коду, який потрібно скомпілювати для створення оригінального масиву 1024 байтів (якщо вважати 32 бітні неподписані довгі значення)!
Ще одна редакція:
Я змінив макрос С на основі макросу з іншої відповіді, щоб видавити зайві 11 байт, і значно зменшив повний розмір розширеного макросу. Хоча 2,7 Мб не так вже й погано, як 54 Мб (попередній кінцевий розмір усіх розширень макросу), він все ще є значним.