2

私のプログラムは、ブール値で満たされた大きな配列を生成します。それらをファイルに保存する最もコンパクトな方法が必要です。

私はここでhttp://www.kirupa.com/forum/showthread.php?339670-How-is-boolean-represented-in-memoryを読んで、メモリ内の8つのブール値が1バイトとして表現される可能性があるため、1つのブール値は1ビットです。しかし、これらのブール値の同じコンパクトの配列をファイルに保存するにはどうすればよいですか? 私は知っています-ファイル書き込み関数は、ビットではなくバイトで動作するようなものです。

まもなく - ブール値の配列を Array.Length の 8 分の 1 のサイズでファイルに保存できるようにしたい

4

1 に答える 1

2

あなたが投稿したリンクはc++フォーラムにつながるので、c++でコーディングしていると思いますか?

各ブール値がバイトの特定のビットにあるビットマスクとビット操作を使用できます。したがって、1 バイト (uint8) を使用して 8 つのブール値を格納できます。これは非常に低レベルであり、C でコーディングし、ストレージが大きな問題である場合にこれを行っていました。

本当にその道を進みたい場合は、以下の操作をいくつかの高レベルの読み取り/書き込みおよび設定/リセット機能に隠すのが最善です。ブール値をバイトに変換した後 (これでバイトの配列ができました!)、ここで説明されているようにバイナリ ファイルに単純に書き込むことができます。

ブール値をバイトに変換する方法に関するいくつかのヒントを次に示します。関心のある各ブール値のマスクを作成して、バイト内のどの位置で書き込み/読み取りを行うかを指定します。

読みやすくするために、16 進数を使用しています。

例えば:

uint8 bitFlags = 0x00; // empty mask  0000 0000

uint8 maskA = 0x01;    // first bit:  0000 0001
uint8 maskB = 0x02;    // second bit: 0000 0010

変数を設定するには、ビットごとの OR を使用します (他のすべてのビットを保持しますが、関心のあるビットを設定します。

bitFlags = bitFlags | maskA;

変数を読み取ります。

bool isTrueA = ( bitFlags & maskA ) > 0 ; // bitwise AND, result is 1 if bit is set, 
                                          // 0 otherwise

変数をリセットします。

bitFlags = bitFlags & (!maskA);           // bitwise AND with inverse mask: 1111 1110
                                          // forces position of A to be zero

ビットマスクの使用に関する詳細については、こちらを参照してください

于 2013-06-16T11:02:13.560 に答える