2016-07-05 3 views
-4

Я использую C++, мне нужно хранить 6 булевых данных, не используя более 8 бит использования пространства. И мне нужно хранить их, используя массив-подобный материал (вектор, массив, матрица и т. Д.). Некоторые методы, такие как вектор, используют много данных, чем его элементы. Мне нужно сохранить на хранение данных, какой метод я должен использовать?Как хранить данные, не занимая много места в C++

+2

Использование [std :: bitset] (http://en.cppreference.com/w/cpp/utility/bitset) – Borgleader

+0

Это не C++, но он использует меньше «пространства», как вы его называете. Просто используйте 'char', и вы используете только 8-битный. Меньше, чем это невозможно в моей точке зрения, потому что все меньшее, чем будет выровнено по крайней мере на 8 бит. – ckruczek

+0

U думаю, что ckruczek ..? Я надеялся, что смогу найти способ хранения менее 8 бит. На самом деле он не должен быть в C++ вообще. Все возможности для компьютера подходят для меня. Знаешь что-нибудь для этого? –

ответ

0

Если вы хотите сохранить 6 bools с использованием всего 8 бит (1 байт), вы можете сделать это только вручную, сохраняя их в unsigned char. std::vector<bool> (std::vector bool) действительно использует битную упаковку для хранения bools, но он добавляет около 20 байтов накладных расходов в других членах и виртуальных функциях. std::bitset (std::bitset) хранит биты пакета, но с шагом в 4 байта у вас будет 3 байта для хранения 1 байт.

+0

Итак, чтобы хранить 6 бит по битам, мне нужно предоставить хранение 24 бит? Если это правда, это так много, arent там более сберегающий способ сделать это? –

+0

@ user6551379 вы можете сохранить 6 бит в 1 байт, используя один символ без знака (1 байт) и записывая все функции самостоятельно. Если вы хотите использовать стандартную библиотеку, будут накладные расходы. – buld0zzr

+0

Хм я понял, спасибо. –

0

Вы можете использовать std::bitset (http://en.cppreference.com/w/cpp/utility/bitset) хранить только один бит на BOOL или вы можете использовать std::vector<bool>, который определяется использовать бит на BOOL внутренне.

+0

Битрейт построен на количестве элементов, как вектор может быть определен как битовый набор внутри? – Borgleader

+0

Хорошо, но это не бит-бит, а «один бит на bool». –

+0

Но разве вектор сам использует дополнительные данные, ожидающие его элементов? Будет ли вектор v (6) использовать всего 6 бит? –

-1

Если вы не можете использовать более 8 бит, вы можете использовать char. Вы можете использовать каждый бит как BOOL - 1, если оно истинно, 0 если ложь:

char my_bool = 0; 
if(condition_1 == TRUE) 
    my_bool |= 1; 
else 
    my_bool &= 0b11111110; 
if(condition_2 == TRUE) 
    my_bool |= 2; 
else 
    my_bool &= 0b11111101; 
if(condition_3 == TRUE) 
    my_bool |= 4; 
else 
    my_bool &= 0b11111011; 

и так далее ...

+1

Это плохое и подверженное ошибкам решение, когда доступен std :: bitset. – Borgleader

+0

@Borgleader Я не был знаком с std :: bitset, thx. BTW, если не может использовать std :: bitset - будет ли это еще плохое решение? – CIsForCookies

+0

Что | = и & = означает, я googled, но ничего не нашел? Btw это выглядит как хороший способ –

0

Вы можете использовать класс BITSET (в стандартной библиотеки C++).

Это фрагмент, как использовать его:

#include <bitset> 
#include <iostream> 

int main(int argc, char* argv[]) { 
    std::bitset<6> bitarray; // [0,0,0,0,0,0] 

    bitarray.set(3, true)  // [0,0,0,1,0,0] 

    if (bitarray.test(3) == true) { // Yeah is true! 
    std::cout << "The fourth bit is true\n"; 
    } 
} 

В этом случае вы должны использовать только 6 бит.