0

マスクを伴う 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 = falseoffset に割り当てられた値は無視されます。offset_present が false の場合、明らかに他の入力とマージできません。

問題をより興味深いものにするために、見つかったものに関する情報 (見つかった input_id、オフセットの場所など) を提供する出力を報告したいと思います。一部の入力をマージすると (他はマージしない)、これが少し難しくなります。

私は CompositeInput クラスを定義することを検討し、基になるマージをビットセットにすることを考えていましたが、ビットセットについてさらに読むと、それは私が本当に考えていたものではないことに気付きました。私の経験不足により、複合的なアイデアをあきらめ、力ずくで行ってしまいました。入力が見つかったときに出力用に収集される追加情報 (たとえば、ページ番号、パラグラフ番号) など、他の入力タイプに関する詳細をスキップする必要がありました。出力クラスの例を次に示します。

class Output {
  public:
    Output();
    int id_result;
    unsigned int offset_result;
};

N 個の 16 進文字列をマージし、マージの詳細をユーザーから隠したままにする場合、これらの N 個を生成したいと思います。

4

3 に答える 3

2

hexstringが何であるかはわかりませんが、それ以外は次のようになります。

 outcome = (value1 & mask1) | (value2 & mask2);
于 2009-10-15T07:51:05.290 に答える
0

|、&、および ~ のように聞こえますか?

于 2009-10-15T07:41:36.243 に答える
0
const size_t prefix = 2; // "0x"
const size_t bytes  = 2;
const char* value1 = "0x0A";
const char* mask1  = "0xFE";
const char* value2 = "0x0B";
const char* mask2  = "0x0F";
char output[prefix + bytes + 1] = "0x";

uint8_t char2int[] = { /*zeroes until index '0'*/ 0,1,2,3,4,5,6,7,8,9 /*...*/ 10,11,12,13,14,15 };
char int2char[] = { '0', /*...*/ 'F' };

for (size_t ii = prefix; ii != prefix + bytes; ++ii)
{
    uint8_t result1 = char2int[value1[ii]] & char2int[mask1[ii]];
    uint8_t result2 = char2int[value2[ii]] & char2int[mask2[ii]];
    if (result1 & result2)
        throw invalid_argument("conflicting bits");
    output[ii] = int2char[result1 | result2];
}
于 2009-10-17T15:30:36.367 に答える