マスクを伴う 2 つの 16 進文字列があり、それらを 1 つの文字列値/マスク ペアにマージしたいと考えています。文字列にはオーバーラップするバイトが含まれる場合がありますが、マスクを適用した後、オーバーラップするビットは、そのビットの値がどうあるべきか矛盾してはなりません。上のニブルはすべて「0」で、下のニブルは 01011 でなければなりません
私はこれをすでにストレート c を使用して行い、文字列をバイト配列に変換し、memcpy をプロトタイプとしてバッファーに変換しました。テスト済みで、動作するようです。ただし、これは見苦しく読みにくく、矛盾する特定のビット要件に対して例外をスローしません。ビットセットの使用を検討しましたが、変換オーバーヘッドを必要としない別の方法はありますか? パフォーマンスは優れていますが、重要ではありません。
編集: 詳細ですが、これを書いていると、単純な問題を難しくしすぎていることに気付きます。でも、とにかくここです。
混合コンテンツ ドキュメントのバイナリ検索である多数の入力が与えられます。ドキュメントはページに分割され、ページは一度に 1 ページずつ配信する API によって提供されます。各ページは、提供された検索語で検索する必要があります。
ページをリクエストする前に、すべての検索用語を取得しています。入力は、16 進数を表す文字列 (これが 16 進数文字列の意味です) と、入力 16 進数文字列で重要なビットを示すマスクです。すべての入力が前もって与えられているので、返される各ページの検索を改善したいと考えました。これらの16進文字列を一緒にマージする前処理が必要でした。問題をさらに興味深いものにするために、すべての文字列には、表示する必要があるページへのオプションのオフセットがあり、オフセットがないことは、文字列が要求されたページのどこにでも表示できることを示しています。したがって、次のようなものです。
class Input {
public:
int input_id;
std::string value;
std::string mask;
bool offset_present;
unsigned int offset;
};
指定された Input オブジェクトに がある場合、offset_present = false
offset に割り当てられた値は無視されます。offset_present が false の場合、明らかに他の入力とマージできません。
問題をより興味深いものにするために、見つかったものに関する情報 (見つかった input_id、オフセットの場所など) を提供する出力を報告したいと思います。一部の入力をマージすると (他はマージしない)、これが少し難しくなります。
私は CompositeInput クラスを定義することを検討し、基になるマージをビットセットにすることを考えていましたが、ビットセットについてさらに読むと、それは私が本当に考えていたものではないことに気付きました。私の経験不足により、複合的なアイデアをあきらめ、力ずくで行ってしまいました。入力が見つかったときに出力用に収集される追加情報 (たとえば、ページ番号、パラグラフ番号) など、他の入力タイプに関する詳細をスキップする必要がありました。出力クラスの例を次に示します。
class Output {
public:
Output();
int id_result;
unsigned int offset_result;
};
N 個の 16 進文字列をマージし、マージの詳細をユーザーから隠したままにする場合、これらの N 個を生成したいと思います。