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 (64-битная оперативная память Windows 7, 8 ГБ).
Редактировать:
Фрагмент выше составляет 295 байт, включая пробелы. После расширения всех макросов, кроме C, он увеличивается до 9 918 байт. По мере расширения каждого уровня макроса C размер быстро увеличивается:
- 25182
- 54174
- 109086
- 212766
- 407838
- 773406
- 1455390
- 2721054
Таким образом, к тому времени, когда все макросы были расширены, этот маленький 295-байтовый файл расширяется до более 2,7 мегабайт кода, который должен быть скомпилирован для генерирования исходного массива из 1024 байт (при условии 32-битных длинных значений без знака)!
Другое редактирование:
Я изменил макрос C, основанный на макросе из другого ответа, чтобы выжать дополнительные 11 байтов, и значительно уменьшил полный расширенный размер макроса. Хотя 2,7 МБ не так плохо, как 54 МБ (предыдущий конечный размер всего расширения макросов), он все еще значителен.