当前位置: 首页 > 知识库问答 >
问题:

在无符号int中搜索位模式

夏侯涵映
2023-03-14

我正在通过Kochan的C语言编程学习C语言,其中一个练习是:

使bitpat_search()函数搜索数字0xE1F4(=1110 0001 1111 0100二进制)是否出现三位模式0x5(=101二进制)。该函数返回11,以指示在源代码中找到了以11位开头的模式。

确保函数没有对int的大小做任何假设。

这是我实现函数的方式:

#include <stdio.h>

int bitpat_search(unsigned int source, unsigned int pattern, int n);
int int_size(void);

int main(void)
{
    printf("%i\n", bitpat_search(0xe1f4, 0x5, 3));

    return 0;
}

int bitpat_search(unsigned int source, unsigned int pattern, int n)
{
    int size = int_size();
    pattern <<= (size - n);
    unsigned int compare = source;
    
    int bitnum = 0;

    while (compare)
    {
        compare >>= (size - n);
        compare <<= (size - n);

        if (compare & pattern)
        {
            return bitnum;
        }
        else
        {
            source <<= 1;
            bitnum++;
            compare = source;
        }       
    }

    return -1;
}

// Calculates the size of an integer for a particular computer
int int_size(void)
{
    int count = 0;
    unsigned int x = ~0;

    while (x)
    {   
        ++count;
        x >>= 1;
    }

    printf("%i\n", count);

    return count;
}

但是,我的程序的输出结果是14,而不是11。我用铅笔和纸跟着程序走,不明白哪里出了问题...帮忙?

共有1个答案

燕经国
2023-03-14

您的测试不正确:(compare&pattern)只检查comparepattern是否至少有一个相同的位。您应该使用掩码并编写if((compare&mask)==pattern)

以下是更正后的版本:

int bitpat_search(unsigned int source, unsigned int pattern, int n) {
    int i, bitcount;
    unsigned int mask = (1U << n) - 1;

    pattern &= mask;   /* mask off the n rightmost bits */

    for (bitcount = 0; (source >> bitcount) != 0; bitcount++)
        continue;

    for (i = 0; i <= bitcount - n; i++) {
        if (((source >> (bitcount - n - i)) & mask) == pattern)
            return i;
    }
    return -1;  /* not found */
}
 类似资料:
  • 问题内容: 我在Elasticsearch中有一个带有value的字段。当我要使用查询字符串“ cgn:4189”进行搜索时,没有结果。我尝试像“ cgn:4189”那样逃脱冒号,但是我有语法错误。我不知道该怎么做。 结果: 和 结果: 你能帮我吗? 问题答案: 尝试以下查询,看看它是否适合您: 这是一些我用来测试的Sense代码: http://sense.qbox.io/gist/1c9096

  • 我试图实现一个文档索引(大致对应于DB行),其中一个字段是整数。我将它们添加到索引中,比如:

  • 我刚开始使用hibernate lucene搜索。从几天以来,我一直致力于搜索关键字与特殊字符。我正在使用MultiFieldQueryParser进行精确短语匹配以及布尔搜索。但在这个过程中,我无法得到搜索关键字的结果,如“有1年以上的经验”,如果我没有在搜索关键字周围添加任何引号,那么我就得到了结果。所以我在执行lucene查询时观察到的是,它正在转义特殊符号(+)。我正在使用Standard

  • 精明的加法学专家会注意到,它只能加到62位。我在编译器和芯片设计方面的经历告诉我,保留位值黄金。所以我们有两个(设置为零)。 那么这是否意味着: 问题一: ~表示36位移位,包含10位类型Id和其余36位本地Id: #00000000000000000000# ShardID 3429的 二进制=1101 0110 0101 因此(hashedValue>>46)=00000 0 110 1 01

  • 应用内搜索 当应用内包含大量信息的时候,用户希望能够通过搜索快速地定位到特定内容。 最基本的搜索包括以下过程: 打开一个搜索文本框 输入查询并提交 显示搜索结果集 然而,可以通过加入一些增强功能来显著提升搜索体验: 启用语音搜索 提供基于用户最近历史查询的搜索建议,即使是在输入查询之前 提供满足应用数据中实际结果的自动完成搜索建议 应用内搜索中有两种主要的模式:持久性搜索(persistent s

  • 问题内容: 我正在尝试为我的应用程序编写一个过滤器函数,该函数将采用输入字符串并以某种方式过滤掉与给定输入不匹配的所有对象。最简单的方法是使用String的contains方法,即仅检查对象(对象中的String变量)是否包含在过滤器中指定的字符串,但这不会考虑重音。 所讨论的对象基本上是Person,而我要匹配的字符串是名称。因此,例如,如果有人搜索Joao,我希望Joáo会包含在结果集中。我已