Пишу реализацию алгоритма сжатия Хаффмана в учебных целях и застрял на собственно кодировании и записи закодированного файла.
Результатом кодирования Хаффмана является массив пар символ-код, где код — целое число произвольной битовой длины. Для достижения сжатия из кодов следует получать битовый поток, который записывается в закодированный файл.
В приведённом ответе makeAndSlice() создаёт битовый поток BitsStream из data[] и отсекает по 8 старших значимых битов в OutputByte по мере накопления их в потоке (while (BitsStreamCount >= ByteBits)). Чтобы получить лаконичный ответ, массивом data[] подменяется последовательность кодовых значений символов исходного файла.
Например, пускай data[] = {110, 1110, 11110, 1110, 110, 11110, 1110, 1}, где все числа записаны в двоичном представлении, тогда makeAndSlice() создаёт битовый поток 11011101111011101101111011101 и разделяет его на следующий список байтов: {11011101, 11101110, 11011110, 11101000}.
3405691582(десятичная запись) можно его представить ввиде 4 байт:cafebabe(шестнадцатиричная запись) или тоже самое 32 бит:11001010111111101011101010111110(двоичная запись). Чтобы в файл число записать, как оно в памяти представлено, можноfwrite()использовать. Пример "входные данные + соответствующий результат" мог бы прояснить вопрос. – jfs Apr 10 '15 at 20:37intиBitsStreamчисло.getBitsCount()похоже считает сколько бит надо, чтобы число представить. Затем старший байт отсекается. Правильно я понимаю, что вопрос как реализовать некоторый шаг из алгоритма Хаффмана и не имеет отношения к тому как извлечь заданный бит из числа? – jfs Apr 10 '15 at 22:50result = data[curr_int] & (1 << curr_bit);из @VladD ответа, извлекаетcurr_bit-ый бит изdata[curr_int]числа. – jfs Apr 11 '15 at 11:58makeAndSlice()функция не является стандартным шагом в алгоритме Хаффмана (на что тело вопроса указывает), то в вопросе не хватает описания (словами) чтоmakeAndSlice()делает (ответ говорит как, но не говорит что), с конкретным примером, например, еслиint data[] = {3735928559};(откуда массив обычно берётся?), то какой значениеBitsStreamна выходе ожидается и почему. – jfs Apr 11 '15 at 13:14while (BitsStreamCount >= ByteBits)). data[] — искусственная сущность, после кодирования Хаффмана исходный файл пробегается ещё раз, и каждому символу переназначается код, последовательность этих кодов и должна составлять битовый поток. – Apr 11 '15 at 14:14makeAndSlice()есть баг -- что в описании может помочь найти его (по описанию невозможно понять какие конкретно значения на выходе должны получаться) или доказать, чтоmakeAndSlice()работает корректно. – jfs Apr 11 '15 at 14:26