Как хранить String в битах для уменьшения занимаемой памяти - PullRequest
4 голосов
/ 18 октября 2011

У меня есть один массив указателей charater, который указывает на некоторые помехи

каждый элемент указывает на некоторые строки, но в одной строке есть только 1 и 0.

например

У меня есть символьный указатель, в котором хранится строка типа «100110», поэтому для ее хранения требуется 6 байт, но я хочу сохранить ее в битах, чтобы уменьшить объем занимаемой памяти.

Ответы [ 4 ]

3 голосов
/ 18 октября 2011

В стиле C, что-то вроде этого должно работать:

char* str = "100101";
unsigned out = 0;

for (int i = 0; str[i]; i++) {
   out = (out << 1);
   if (str[i] == '1')
      out++;
}

(я не могу проверить это сейчас, поэтому, пожалуйста, исправьте меня, если я ошибаюсь)

Объяснение:

str = "100101"
out = 0000 0000 0000 0000

i = 0:
   out = 0000 0000 0000 0000 (out << 1)
   out = 0000 0000 0000 0001 (out++ because str[0] == '1')

i = 1:
   out = 0000 0000 0000 0010 (out << 1)

[...]

i = 5:
   out = 0000 0000 0010 0100 (out << 1)
   out = 0000 0000 0010 0101 (out++ because str[5] == '1')
3 голосов
/ 18 октября 2011

Вы пробовали контейнер STL bitset? Он оптимизирован именно для этой цели. Кроме того, при создании элементов vector из bool биты будут внутренне упакованы для экономии места.

0 голосов
/ 02 февраля 2012

Почему бы не использовать 'strtol'? Это стандартная функция lib. Или вы пишете низкоуровневый код для оборудования с нехваткой памяти?

char *str = "010101";
int i = strtol(str ,(char**)NULL ,2);

==> i=21
0 голосов
/ 18 октября 2011

Одним из способов является определение char* [] как глобального и использования его индексов для доступа к нему:

char stringLiterals [] =  { "0101010", "10010010", "111", "010100100", ... };

Использование : вместо

char *p = stringLiteral[3];

использовать

unsigned int idx = 3;

Обоснование : Если вы уплотняете эту строку в биты для целей сериализации, тогда это нормально.Но в остальном я не вижу никакого смысла в их сжатии.В моем приведенном выше решении он не использует никакой дополнительной памяти .У вас уже есть массив строковых литералов;Я просто прошу объявить в глобальной области видимости и использовать ее индекс.

Кроме того, если размер строки> 32 байта, вы не сможете сохранить его в одном 32-битном int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...