2016-01-09 2 views
2

Как правило, на C++ при создании массива я объявляю его как int. Однако, поскольку я имею дело только с двоичными числами (только 1 и 0), я думаю, что это возможно для того, чтобы я мог скрывать 4 байта 'int' до 1 бит.Как создать массив «бит» вместо массива «int»?

Например

int array1[] = {1,0,0,0,0,1,0}; // -----had total of 32 bytes 

Так как это только двоичное, эффективность памяти только 1/32, поскольку каждый Int 1-х будет хранить как 000000000000000000000000000001 (4 байта).

Итак, мой вопрос заключается в том, как я могу преобразовать все это в бит, чтобы 32 байта могли быть «сжаты» в 1 байт (вместо 8 int из 32 байтов, я хочу 8-битные данные)?

+3

http://en.cppreference.com/w/cpp/utility/bitset/bitset - это должно сделать трюк –

+3

Вы можете использовать 'станд :: вектор ' –

+1

длина вашего массива во время компиляции постоянной или известно только во время выполнения? – Superlokkus

ответ

7

Использование std::bitset. Я думаю, это то, что вы хотите.

Я не знаю, являетесь ли вы конкурентоспособным программистом, но иногда в конкурентном программировании требуется наличие 10^9 флагов. Тогда bitset или в основном определении сита это чрезвычайно полезно.

#include<bitset> 
... 
... 
bitset<10000000> bs; 

.. 
bs[1]=1; 
bs[i]=0; 
..etc 
+0

Привет, как использовать битсет для массива? (Выделение в массив) – CHONG

+1

Спасибо @Paul R ..I пропустил это. – coderredoc

+0

Последний вопрос, а как насчет выделения его в многомерный массив? – CHONG

4

Обычно в C++, при создании массива, я объявить его как Int.

Нет такого общего соглашения.

Однако, поскольку я имею дело только с двоичными числами (только 1 и 0), я думаю, что это возможно для того, чтобы я мог скрывать 4 байта 'int' до 1 бит.

Естественно можно было бы подумать, что это должно привести к объявляя что-то вроде

bool array1[]{true,false,false,false,false,true,false}; 

Хотя выше реализация только уменьшает пространство, используемое для одного бита в unsigned char, которая является наименьшей единицей памяти, которая может быть адресуется в C++.


К счастью C++ обеспечивает специализацию std::vector<bool>, что на самом деле пространство оптимизирует ваш массив битов, как вы хотите.

+0

oh dear god 'std :: vector ', просто нет, держите его подальше от нас – Puppy

+1

@Puppy Для случая, спрошенного, это именно то, чего хочет OP. Я не сказал, что 'std :: vector ' является реальной хорошей реализацией для решения общей проблемы. –

+0

@ πάντα ῥεῖ std :: vector размер один байт, мне нужно, чтобы он был одним битом, так как я делаю миллионы времени итераций, я думаю, что выборка 1 бит по сравнению с одним байтом в миллионы раз должна улучшить некоторые ее характеристики, просто попробовать. – CHONG

Смежные вопросы