0

C++ でビット操作を使用して問題を解決しようとしていますが、本当に行き詰まっています。次のクエリで私を助けてください。

1) メモリ内で正確に 100000 ビットを使用し、A&B のような操作が有効な変数の A と B を作成することは可能ですか?

2) 最初の n ビットが 0、最後の m ビットが 0、残りが 1 になるように B(100000 ビット) を生成する高速な方法はありますか? (例: B が 10 ビットの場合、0000011000 のような数値)

4

1 に答える 1

3

1 の答えとして、確かに、これはクラスが意図された種類のものです。単純に 100,000 ビット (約 12.5K) を含むクラスを作成し、operator&メソッド (アドレス演算子ではなくバイナリー) をオーバーライドします。

良いスタートは次のようになります (ビットマスクを保持する 2 つの整数があるとします):

BigBits BigBits::operator &(const BigBits &that) const {
    BigBits bb(*this);
    bb.array[0] = this->array[0] & that.array[0];
    bb.array[1] = this->array[1] & that.array[1];
    return bb;
}

これはテストされていませんが、基本的な考え方は理解できるはずです。それをテストするには、コンストラクタ、デストラクタ、代入などを含め、かなりのコードを作成する必要がありますが、それが本当にあなたの仕事であるべきです:-)

2つ答えれば、それも簡単です。唯一のトリック ビットは 2 つのエッジ バイトです。すべての内部バイトはすべて 1 ビットに設定できます。

エッジ バイトを設定するには、ビットの除算と 1 バイトのビット数によるモジュロを使用してから、ビットマスクを使用してそれらを設定します。ビットマスクは0x800xc00xe0、などで0xf00xf8後続の値ごとに 1 ビットが追加されます。

次にbitmask[bitpos % 8]、さまざまな形式で を使用してエッジ バイトを設定します。その配列インデックスは になりますbitpos / 8

于 2012-11-03T08:29:45.403 に答える