2016-07-05 10 views
-4

私はC++を使用していますが、私は8ビット以上のスペースを使わずに6個のブール型データを格納する必要があります。そして、私は配列のようなもの(ベクトル、配列、行列など)を使用してそれらを格納する必要があります。 vectorのようないくつかのメソッドは、要素よりも多くのデータを使用します。データストレージを節約する必要がありますが、どの方法を使用する必要がありますか?C++で多くのスペースを使わずにデータを格納する方法

+2

[std :: bitset](http://en.cppreference.com/w/cpp/utility/bitset)を使用します。 – Borgleader

+0

これはC++ではありませんが、それを呼び出すときに使用するスペースが少なくなります。 'char'を使うだけで、あなたは8ビットしか使用していません。私の視点では、これよりも少なくて済むことはありません。なぜなら、すべてが8ビットに内部的に調整されるよりも少ないからです。 – ckruczek

+0

Uはとてもクルクゼクだと思う..?私は8ビット以下で保存する方法を見つけることができることを願った。実際には、C++ですべきではありません。すべてのコンピュータの機会は私にとっては大丈夫です。 Uはそれをどうにか知っていますか? –

答えて

0

8ビット(1バイト)のみを使用して6つのboolを保存する場合は、unsigned charに格納して手動で行うことができます。 std::vector<bool>std::vector bool)は実際にboolを格納するためにビットパッキングを使用しますが、他のメンバおよび仮想関数に約20バイトのオーバーヘッドを追加します。 std::bitsetstd::bitset)はビットパケットを格納しますが、4バイト単位で1バイトを格納するために3バイトのオーバーヘッドがあります。

+0

ビットセットで6ビットを格納するには、私は24ビットの記憶域を与える必要がありますか?それが本当であれば、それをもっと節約する方法はありませんか? –

+0

@ user6551379 1つのunsigned char(1バイト)を使用し、すべての関数を自分で書き込むことで、1バイトに6ビットを格納できます。標準ライブラリを利用する場合は、オーバーヘッドが発生します。 – buld0zzr

+0

ええ、私は理解して、ありがとう。 –

0

あなたはstd::bitsethttp://en.cppreference.com/w/cpp/utility/bitset)BOOLごとに1つのビットを格納するのに使用するか、内部ブールあたりのビットを使用するように定義されstd::vector<bool>を使用することができます。

+0

bitsetは要素の数に基づいてテンプレート化されています。どのようにベクトルを内部的にビットセットとして定義できますか? – Borgleader

+0

オク、特にビットセットではなく、 "1ビットあたり1ビット"です。 –

+0

しかし、ベクトルではありませんは、それ自体が余分なデータを使用しています。ベクトル v(6)はちょうど6ビットを使用しますか? –

-1

8ビットを超えて使用できない場合は、charを使用できます。

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

| =と&=はどういう意味ですか、私はそれを見つけましたが、何も見つかりませんでしたか? Btwそれは良い方法のように見える –

0

をあなたは(C++標準ライブラリに)ビットセットクラスを使用することができます。falseの場合trueの場合、1 0 - あなたはブール値として各ビットを使用することができます。

これは、それを使用する方法の抜粋です:あなたが唯一の6ビットを使用する必要があり、そのように

#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"; 
    } 
} 

関連する問題