Как я могу управлять битами / двоичными файлами в C ++? - PullRequest
3 голосов
/ 20 октября 2010

Что мне нужно сделать, это открыть текстовый файл с 0 и 1, чтобы найти шаблоны между столбцами в файле.

Итак, моей первой мыслью было разобрать каждый столбец в большой массив bools, а затем выполнить логику между столбцами (теперь в массивах). Пока я не обнаружил, что размер bools на самом деле является байтом, а не битом, я бы потратил 1/8 памяти, назначая каждому значению bool.

Это вообще актуально в сетке значений 800х800? Что было бы лучшим способом справиться с этим? Буду признателен за фрагмент кода, если ответ сложный

Ответы [ 4 ]

4 голосов
/ 20 октября 2010

Вы можете использовать std :: bitset или Boosts dynamic_bitset , которые предоставляют различные методы, которые помогут вам управлять вашими битами.

Они, например, поддерживают конструкторы, которые создают наборы битов из других типов по умолчанию, таких как int или char. Вы также можете экспортировать набор битов в ulong или в строку (которая затем может быть снова превращена в набор битов и т. Д.)

Однажды я спросил о конкатенации тех, которые невозможно было выполнить. Но, возможно, вы могли бы использовать информацию и в этом вопросе .

4 голосов
/ 20 октября 2010

вы можете использовать std::vector<bool>, который является специализацией вектора, который использует компактное хранилище для логических значений .... 1 бит, а не 8 бит.

2 голосов
/ 20 октября 2010

Я думаю, что именно Кнут сказал, что «преждевременная оптимизация - корень всего зла».Давайте узнаем немного больше о проблеме.Ваш массив составляет 800 ** 2 == 640 000 байт, что не составляет большого труда для чего-то более мощного, чем цифровые часы.

Хотя хранение его в байтах может показаться расточительным - как вы говорите, 7/8 от объема памяти избыточны, - но с другой стороны, большинство машин не выполняют битовые операции так же эффективно, как байты;экономя память, вы могли бы тратить столько усилий на маскировку и тестирование, что вам лучше было бы работать с байтовой моделью.

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

Суть в том, что есть несколько возможностей, но никто не может сказать вам «правильное» представление беззная, в чем проблема.

1 голос
/ 20 октября 2010

Для сетки такого размера ваш массив bools будет около 640KB.Зависит от того, сколько у вас памяти, если это будет проблемой.Это, вероятно, будет самым простым для кода логического анализа.

Группируя биты и сохраняя их в массиве int, вы можете снизить требования к памяти до 80 КБ, но логический код будет сложнее, чем вывсегда изолируйте биты, которые вы хотели проверить.

...