Учитывая, что байтом является 8 бит, а символ 1 байт, Есть ли способ манипулировать массивом символов (строки), чтобы мы могли представлять каждый символ в строке в более компактное количество бит (скажем, 5 бит?)Бит-манипуляция (Cutting down bits)
ответ
Несомненно, просто сопоставьте каждого символа с новой кодировкой. Однако, уменьшая количество бит, вы поддерживаете меньшее количество символов в своем «алфавите». Например, 5 бит могут поддерживать только 32 возможных символа.
Кодировка Huffman допускает коды переменной длины, но при правильном проектировании вы в среднем имеете более короткие коды.
Третий вариант заключается в том, чтобы сохранить кодировку ascii, но использовать некоторое сжатие для уменьшения количества байтов.
Существует немало фактических реализаций для выполнения каждого из этих действий. Например, если вы знаете, что у вас есть только 26 букв в верхнем регистре «a» - «z», пробелы и цифры, вы можете использовать 5-битное значение, потому что вам нужно всего 27 значений. Простой метод будет преобразовывать каждый символ, как это:
out_char = (in_char == ' ') ? 31 : (in_char - 'A');
Если вам нужен верхний и нижний регистр, вам нужно было бы 52 символов, так что вам нужно 6 бит.
Реализация Хаффмана требует понимания статистики того, как часто происходит каждый символ.
Я думал о способе реализовать это, но есть ли способ сохранить значение бит, если бы я должен был отбросить его от байтовой кодировки с помощью оператора смены битов? Например, если бы мне пришлось сдвинуть смену >> 00000001, есть ли способ сохранить 1, который я просто сбросил? –
Значение, которое вытолкнуто, просто (val & 0x01), прежде чем вы на самом деле сдвигаетесь. – caveman
Да, это возможно. Посмотрите на побитовые операторы '|', '&', '<<', and '>>' для этой цели. – user4815162342
вы можете вывести 64 или замаскировать 6-й бит. – mch
Да, есть. Вы в основном псевдокодировали алгоритм для себя уже. Тем не менее, Google. Скорее всего, вы уже существуете. –