6

逆メモリ比較を行うにはどうすればよいですか?のように、2つのシーケンスの終わりを指定し、ポインタを最後に向かってインクリメントするのではなく、最初に向かってデクリメントするようにします。

4

4 に答える 4

6

C標準ライブラリにはそれを行うための組み込み関数はありません。これがあなた自身を転がす簡単な方法です:

int memrcmp(const void *s1, const void *s2, size_t n)
{
    if(n == 0)
        return 0;

    // Grab pointers to the end and walk backwards
    const unsigned char *p1 = (const unsigned char*)s1 + n - 1;
    const unsigned char *p2 = (const unsigned char*)s2 + n - 1;

    while(n > 0)
    {
        // If the current characters differ, return an appropriately signed
        // value; otherwise, keep searching backwards
        if(*p1 != *p2)
            return *p1 - *p2;
        p1--;
        p2--;
        n--;
    }

    return 0;
}

高性能なものを使用する場合は、メモリの待ち時間がボトルネックになるため、個々のバイトではなく、一度に4バイトのワードを比較する必要があります。ただし、そのソリューションは非常に複雑であり、実際には価値がありません。

于 2011-12-06T20:37:28.693 に答える
1

Vlad Lazarenkoによって最初にリンクされた投稿(C memcpy in reverse)のように、これに基づく解決策があります。これはまだテストしていませんが、開始する必要があります。

int reverse_memcmp(const void *s1, const void *s2, size_t n)
{
    unsigned char *a, *b;
    a = s1;
    b = s2;
    size_t i = 0;

    // subtracting i from last position and comparing
    for (i = 0; i < n; i++) {
        if (a[n-1-i] != b[n-1-i]) {
            // return differences between different byte, strcmp()-style
            return (a[n-1-i] - b[n-1-i]);
        }
    }

    return 0;
}
于 2011-12-06T20:20:59.700 に答える
0

あなたがする必要があるのはあなたの両端とあなたが比較したいサイズ、そしてステップサイズを指定することです。特に、期待される結果を得るには、ステップサイズが最も重要な部分である可能性があることに注意してください。サイズを制限すると、実装が大幅に容易になります。文字のサイズについては、次のようなことができます。

int compare (void *one, void *two, size_t size)
  {
  char *one_char = (char *)one;
  char *two_char = (char *)two;
  size_t i;

  for (i = 0; i < size; i++)
    {
    if (*(one_char - i) != *(two_char - i))
       return(NOT_EQUAL);
    }  

  return(EQUAL);
  }
于 2011-12-06T20:25:16.847 に答える
0

短いコード(Cコードは強制ポインター型キャストを必要としません):

int reverse_memcmp(const void *end1, const void *end2, size_t n) {
    const unsigned char *a = end1, *b = end2;
    for (; n; --n)
        if (*--a != *--b) return *a - *b;
    return 0;
}
于 2015-08-30T10:48:18.933 に答える