私はC++を使用していますが、私は8ビット以上のスペースを使わずに6個のブール型データを格納する必要があります。そして、私は配列のようなもの(ベクトル、配列、行列など)を使用してそれらを格納する必要があります。 vectorのようないくつかのメソッドは、要素よりも多くのデータを使用します。データストレージを節約する必要がありますが、どの方法を使用する必要がありますか?C++で多くのスペースを使わずにデータを格納する方法
答えて
8ビット(1バイト)のみを使用して6つのboolを保存する場合は、unsigned charに格納して手動で行うことができます。 std::vector<bool>
(std::vector bool)は実際にboolを格納するためにビットパッキングを使用しますが、他のメンバおよび仮想関数に約20バイトのオーバーヘッドを追加します。 std::bitset
(std::bitset)はビットパケットを格納しますが、4バイト単位で1バイトを格納するために3バイトのオーバーヘッドがあります。
ビットセットで6ビットを格納するには、私は24ビットの記憶域を与える必要がありますか?それが本当であれば、それをもっと節約する方法はありませんか? –
@ user6551379 1つのunsigned char(1バイト)を使用し、すべての関数を自分で書き込むことで、1バイトに6ビットを格納できます。標準ライブラリを利用する場合は、オーバーヘッドが発生します。 – buld0zzr
ええ、私は理解して、ありがとう。 –
あなたはstd::bitset
(http://en.cppreference.com/w/cpp/utility/bitset)BOOLごとに1つのビットを格納するのに使用するか、内部ブールあたりのビットを使用するように定義されstd::vector<bool>
を使用することができます。
bitsetは要素の数に基づいてテンプレート化されています。どのようにベクトルを内部的にビットセットとして定義できますか? – Borgleader
オク、特にビットセットではなく、 "1ビットあたり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;
のように...
これは、std :: bitsetが利用可能な場合、貧弱でエラーが発生しやすいソリューションです。 – Borgleader
@Borgleader私はstd :: bitset、thxに精通していませんでした。 BTW、std :: bitsetを使用できない場合、これはまだ悪い解決策ですか? – CIsForCookies
| =と&=はどういう意味ですか、私はそれを見つけましたが、何も見つかりませんでしたか? Btwそれは良い方法のように見える –
をあなたは(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";
}
}
。
- 1. 他のテーブルに多くのIDを格納する方法
- 2. 多型関数をデータ型に格納する方法
- 3. std :: stringやSTLを使わずに、C++で文字配列に複素数を格納する方法は?
- 4. CoreDataの多対多関係にデータを格納する方法は?
- 5. プロジェクトにデータを格納する方法
- 6. 多くのデータを格納/アクセスするためのPostgreSQLとS3QL
- 7. セレンの変数の間にスペースを格納する方法
- 8. ループ内のjsでデータを多次元配列に格納する方法
- 9. SQLデータベースからデータをコンボボックスに格納する方法 - C#
- 10. スペースを使わずにMySQLテーブルにデータをロードするには?
- 11. CRLFを使わずにC#で行を書く方法
- 12. sharedPreferencesがデータを格納する方法
- 13. SQLデータの格納方法
- 14. Backbone.jsを使用してlocalStorageにデータを格納する方法
- 15. 多くのSHA1データを格納するためにデータベースを構築する方法
- 16. 多次元配列のデータベースからデータを格納する方法
- 17. ローカルデータベースにデータを格納するのを回避する方法
- 18. Ectoスキーマに多次元配列を格納する方法は?
- 19. JSONオブジェクトを多次元配列に格納する方法
- 20. Python:PyTablesにnumpy多次元配列を格納する方法は?
- 21. 多くのIP範囲を格納するPHPの最良の方法は?
- 22. C#でオブジェクトの参照をリストに格納する方法は?
- 23. OPENCV C++でベクトルのベクトルに要素を格納する方法
- 24. WS_EX_LAYEREDを使わずにC++でクリックスルーウィンドウを作成する方法
- 25. c/C++での可変長配列の格納スペース
- 26. より多くのブール値を格納する最も効果的な方法
- 27. 多くのデータフレームを格納するRメモリ効率的な方法?
- 28. c#データをExcelファイルに格納
- 29. PHPを使用してmysqlに多次元配列を格納する方法
- 30. PhonegapのAndroidアプリにデータをローカルに格納する方法(AngularJSの方法で)
[std :: bitset](http://en.cppreference.com/w/cpp/utility/bitset)を使用します。 – Borgleader
これはC++ではありませんが、それを呼び出すときに使用するスペースが少なくなります。 'char'を使うだけで、あなたは8ビットしか使用していません。私の視点では、これよりも少なくて済むことはありません。なぜなら、すべてが8ビットに内部的に調整されるよりも少ないからです。 – ckruczek
Uはとてもクルクゼクだと思う..?私は8ビット以下で保存する方法を見つけることができることを願った。実際には、C++ですべきではありません。すべてのコンピュータの機会は私にとっては大丈夫です。 Uはそれをどうにか知っていますか? –