Хранение строки в виде двоичной строки из "unsigned char's to" в вопросах сжатия
Мне нужно хранить строку из 8 символов (все они цифры) в сжатом методе,
Насколько я понимаю, каждый char
использования 8 bits
которые 1 byte
и так как я использую только цифры, я могу использовать 4 bits
(2^4=16
комбинации) так что для каждого unsigned char
Я могу хранить две цифры вместо одной. Таким образом мне нужно 4 bytes
хранить 8 цифр вместо 8 bytes
,
До этого я прав или нет?
Теперь, как я храню эти данные в строке 4 unsigned char
s? Я не ищу откровенный ответ, просто начинаю понимать мотивацию.
2 ответа
Существует три очевидных способа хранения восьми десятичных цифр в четырех восьмибитных значениях.
Одним из них является уменьшение каждой десятичной цифры до четырех битов и сохранение двух четырехбитных значений в восьми битах.
Другой способ - объединить каждую пару десятичных цифр в число от 0 до 99 и сохранить это число в восьми битах.
Другой способ - объединить все восемь десятичных цифр, чтобы получить число от 0 до 99999999, и сохранить его в 32 битах, обрабатывая четыре восьмибитных значения как одно 32-битное целое число.
Чтобы выбрать между ними, подумайте, какие операции необходимо выполнить для кодирования значения (какие арифметические или битовые операции необходимы для объединения двух цифр для получения кодированного значения) и какие операции необходимо выполнить для декодирования значения (с учетом восьми битов, как вы получаете цифры из них?).
Чтобы оценить эту проблему, вы должны знать об основных арифметических операциях и битовых операциях, таких как побитовое И и ИЛИ, сдвиг битов, использование "масок" с операциями И и так далее. Это может также помочь узнать, что деление и остаток обычно являются более трудоемкими операциями, чем другие арифметические и битовые операции на современных компьютерах.
Я предпочитаю использовать unsigned int
как предложил Гарольд в комментариях. В unsigned char[4]
вам может потребоваться дополнительный один символ для прекращения '\0'
персонаж.
Используйте переход, как вы сами предложили, для правильного преобразования из uchar в uint.