C++ でビット操作を使用して問題を解決しようとしていますが、本当に行き詰まっています。次のクエリで私を助けてください。
1) メモリ内で正確に 100000 ビットを使用し、A&B のような操作が有効な変数の A と B を作成することは可能ですか?
2) 最初の n ビットが 0、最後の m ビットが 0、残りが 1 になるように B(100000 ビット) を生成する高速な方法はありますか? (例: B が 10 ビットの場合、0000011000 のような数値)
C++ でビット操作を使用して問題を解決しようとしていますが、本当に行き詰まっています。次のクエリで私を助けてください。
1) メモリ内で正確に 100000 ビットを使用し、A&B のような操作が有効な変数の A と B を作成することは可能ですか?
2) 最初の n ビットが 0、最後の m ビットが 0、残りが 1 になるように B(100000 ビット) を生成する高速な方法はありますか? (例: B が 10 ビットの場合、0000011000 のような数値)
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 バイトのビット数によるモジュロを使用してから、ビットマスクを使用してそれらを設定します。ビットマスクは0x80
、0xc0
、0xe0
、などで0xf0
、0xf8
後続の値ごとに 1 ビットが追加されます。
次にbitmask[bitpos % 8]
、さまざまな形式で を使用してエッジ バイトを設定します。その配列インデックスは になりますbitpos / 8
。