Как использовать битовые значения вместо символов в программе C ++? - PullRequest
0 голосов
/ 29 марта 2011

Я получил код, который хотел бы улучшить. Это простое приложение для одного из вариантов 2DBPP, и вы можете посмотреть на источник в https://gist.github.com/892951

Вот схема вещей, для которых я использую символы (вместо этого я бы хотел переключиться на двоичные значения.) Инициализируйте блок памяти с помощью '0's ():

...
char* bin;
bin = new (nothrow) char[area];
memset(bin, '\0', area);

иногда я проверяю определенные значения:

if (!bin[j*height+k]) {...}

или блоки:

if (memchr(bin+i*height+pos.y, '\1', pos.height)) {...}

или установите значения в «1»:

memset(bin+i*height+best.y,'\1',best.height);

Я не знаю каких-либо стандартных типов или методов для работы с двоичными значениями. Как мне использовать биты вместо байтов?

Есть связанный вопрос, который вас может заинтересовать - Производительность C ++: проверка блока памяти на наличие определенных значений в определенных ячейках

Спасибо!

Редактировать: Есть еще более важный вопрос - это будет улучшение? Меня интересует только время.

Ответы [ 3 ]

1 голос
/ 29 марта 2011

Для начала, вы можете обратиться к этому сообщению: Как установить, очистить и переключить один бит?

Также попробуйте заглянуть в битовый набор C ++ Std или битполе.

0 голосов
/ 30 марта 2011

Если только пространство памяти не является проблемой, я бы держался подальше от небольшого перепутывания.Вы можете сэкономить место в памяти, но увеличить время работы.Упаковка и распаковка бит требует времени и дополнительного кода.

Сделайте код более надежным и корректным, прежде чем пытаться немного перевернуться.Играйте с различными (высокоуровневыми) дизайнами, которые могут улучшить производительность и использование памяти.

Если вы переходите на битовый уровень, изучите булеву арифметику и логику.Перепроектируйте ваши данные, чтобы ими было легче манипулировать на битовом уровне.

0 голосов
/ 29 марта 2011

Я рекомендую прочитать на boost . dynamic_bitset , который является версией размера std::bitset.

.если по какой-то причине вы не хотите использовать boost, рассмотрите возможность использования std::vector<bool>.Цитирование cppreference.com:

Обратите внимание, что логический вектор (std::vector<bool>) - это специализация шаблона вектора, предназначенная для использования меньшего количества памяти.Обычная логическая переменная обычно использует 1-4 байта памяти, но логический вектор использует только один бит на логическое значение.

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