0

私は単純な DBMS を作成しようとしています。それについて多くのことを読み、システムを既に設計しましたが、実装に関していくつかの問題があります。

長さが動的になる一連のビットを使用する C++ での最適な方法を知る必要があります。この一連のビットは、ファイル内のどのページが空いているか、空いていないかを判断するために保存されます。単一のファイルの場合、使用されるページ数は固定されるため、おそらくビットセットを使用できます。ただし、ページおよびファイルあたりのレコード数は固定されません。したがって、ビットセットがこれを行うための最良の方法になるとは思いません。

各文字は 1 バイト = 8 ビットなので、文字の配列を使用すると、必要なビット マップを作成できるのではないかと考えました。

これほど低レベルでビットを操作する必要はなかったので、これを行うための他のより良い方法があるかどうか、またはこの方法がまったく機能するかどうかさえもわかりません。

前もって感謝します

4

2 に答える 2

0

ラッパー クラスを実装し、各チャンクが固定サイズの配列を保持するチャンクのリンク リストにビットマップを格納するだけです (特定のビット数を確保するために uint32_t のような stdint 型を使用します)。展開するリスト。読者への演習として契約を残します。

于 2012-04-09T23:21:54.970 に答える
0

ちょっとしたいじりの基本だけが必要な場合は、文字の配列を使用してそれを行う 1 つの方法を次に示します。

ビットの配列があるとします (長さは である必要があります(totalitems / 8 )):

unsigned char *bits;  // this of course needs to be allocated somewhere

次のように、配列へのインデックスとその位置内の特定のビットを計算できます。

// compute array position
int pos = item / 8;  // 8 bits per byte
// compute the bit within the byte.  Could use "item & 7" for the same
// result, however modern compilers will typically already make
// that optimization.
int bit = item % 8;

次に、ビットが次のように設定されているかどうかを確認できます (ゼロベースのインデックスを想定しています)。

if ( bits[pos] & ( 1 << bit ))
  return 1;  // it is set
else
  return 0;  // it is not set

以下は、特定のビットを設定します。

bits[pos] |= ( 1 << bit );

また、以下を使用して特定のビットをクリアできます。

bits[pos] &= ~( 1 << bit );
于 2012-04-10T16:11:24.647 に答える