Я использую C++, мне нужно хранить 6 булевых данных, не используя более 8 бит использования пространства. И мне нужно хранить их, используя массив-подобный материал (вектор, массив, матрица и т. Д.). Некоторые методы, такие как вектор, используют много данных, чем его элементы. Мне нужно сохранить на хранение данных, какой метод я должен использовать?Как хранить данные, не занимая много места в C++
ответ
Если вы хотите сохранить 6 bools с использованием всего 8 бит (1 байт), вы можете сделать это только вручную, сохраняя их в unsigned char. std::vector<bool>
(std::vector bool) действительно использует битную упаковку для хранения bools, но он добавляет около 20 байтов накладных расходов в других членах и виртуальных функциях. std::bitset
(std::bitset) хранит биты пакета, но с шагом в 4 байта у вас будет 3 байта для хранения 1 байт.
Итак, чтобы хранить 6 бит по битам, мне нужно предоставить хранение 24 бит? Если это правда, это так много, arent там более сберегающий способ сделать это? –
@ user6551379 вы можете сохранить 6 бит в 1 байт, используя один символ без знака (1 байт) и записывая все функции самостоятельно. Если вы хотите использовать стандартную библиотеку, будут накладные расходы. – buld0zzr
Хм я понял, спасибо. –
Вы можете использовать std::bitset
(http://en.cppreference.com/w/cpp/utility/bitset) хранить только один бит на BOOL или вы можете использовать std::vector<bool>
, который определяется использовать бит на BOOL внутренне.
Битрейт построен на количестве элементов, как вектор может быть определен как битовый набор внутри? – Borgleader
Хорошо, но это не бит-бит, а «один бит на bool». –
Но разве вектор
Если вы не можете использовать более 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;
и так далее ...
Это плохое и подверженное ошибкам решение, когда доступен std :: bitset. – Borgleader
@Borgleader Я не был знаком с std :: bitset, thx. BTW, если не может использовать std :: bitset - будет ли это еще плохое решение? – CIsForCookies
Что | = и & = означает, я googled, но ничего не нашел? Btw это выглядит как хороший способ –
Вы можете использовать класс 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 бит.
Использование [std :: bitset] (http://en.cppreference.com/w/cpp/utility/bitset) – Borgleader
Это не C++, но он использует меньше «пространства», как вы его называете. Просто используйте 'char', и вы используете только 8-битный. Меньше, чем это невозможно в моей точке зрения, потому что все меньшее, чем будет выровнено по крайней мере на 8 бит. – ckruczek
U думаю, что ckruczek ..? Я надеялся, что смогу найти способ хранения менее 8 бит. На самом деле он не должен быть в C++ вообще. Все возможности для компьютера подходят для меня. Знаешь что-нибудь для этого? –