首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何做反向memcmp?

如何做反向memcmp?
EN

Stack Overflow用户
提问于 2011-12-07 04:09:40
回答 4查看 2.5K关注 0票数 5

如何进行反向内存比较?就像在中一样,我给出了两个序列的末尾,我希望指针朝向开头递减,而不是朝向结尾递增。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-07 04:37:29

在C标准库中没有内置的函数可以做到这一点。这里有一个简单的方法来创建你自己的:

代码语言:javascript
复制
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字节字而不是单个字节,因为内存延迟将是瓶颈;然而,这种解决方案要复杂得多,而且不值得这样做。

票数 6
EN

Stack Overflow用户

发布于 2011-12-07 04:21:00

就像在Vlad Lazarenko最初链接的帖子(C memcpy in reverse)中一样,这里有一个基于此的解决方案,我还没有测试过,但应该可以让你开始使用。

代码语言:javascript
复制
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;
}
票数 1
EN

Stack Overflow用户

发布于 2011-12-07 04:25:17

所有你需要做的就是指定你的两端和你想要比较的大小,以及步长。请特别注意,步长可能是获得预期结果的最重要部分。如果限制大小,它将极大地简化实现。对于char的大小,您可以这样做:

代码语言:javascript
复制
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);
  }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8406148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档