2015-02-23 3 views
-1

Учитывая, что байтом является 8 бит, а символ 1 байт, Есть ли способ манипулировать массивом символов (строки), чтобы мы могли представлять каждый символ в строке в более компактное количество бит (скажем, 5 бит?)Бит-манипуляция (Cutting down bits)

+0

Да, это возможно. Посмотрите на побитовые операторы '|', '&', '<<', and '>>' для этой цели. – user4815162342

+0

вы можете вывести 64 или замаскировать 6-й бит. – mch

+0

Да, есть. Вы в основном псевдокодировали алгоритм для себя уже. Тем не менее, Google. Скорее всего, вы уже существуете. –

ответ

3

Несомненно, просто сопоставьте каждого символа с новой кодировкой. Однако, уменьшая количество бит, вы поддерживаете меньшее количество символов в своем «алфавите». Например, 5 бит могут поддерживать только 32 возможных символа.

Кодировка Huffman допускает коды переменной длины, но при правильном проектировании вы в среднем имеете более короткие коды.

Третий вариант заключается в том, чтобы сохранить кодировку ascii, но использовать некоторое сжатие для уменьшения количества байтов.

Существует немало фактических реализаций для выполнения каждого из этих действий. Например, если вы знаете, что у вас есть только 26 букв в верхнем регистре «a» - «z», пробелы и цифры, вы можете использовать 5-битное значение, потому что вам нужно всего 27 значений. Простой метод будет преобразовывать каждый символ, как это:

out_char = (in_char == ' ') ? 31 : (in_char - 'A'); 

Если вам нужен верхний и нижний регистр, вам нужно было бы 52 символов, так что вам нужно 6 бит.

Реализация Хаффмана требует понимания статистики того, как часто происходит каждый символ.

+0

Я думал о способе реализовать это, но есть ли способ сохранить значение бит, если бы я должен был отбросить его от байтовой кодировки с помощью оператора смены битов? Например, если бы мне пришлось сдвинуть смену >> 00000001, есть ли способ сохранить 1, который я просто сбросил? –

+0

Значение, которое вытолкнуто, просто (val & 0x01), прежде чем вы на самом деле сдвигаетесь. – caveman