检查序列中的位模式

时间:2015-11-19 15:51:06

标签: c++ c

所以基本上我需要检查某个比特序列是否出现在其他比特序列(32比特)中。 该函数需要3个参数:

  1. n值的大部分位。
  2. 一个值
  3. 应检查n位的发生顺序
  4. 该函数必须返回所需序列开始的位数。例如,如果最后3位0x5出现在0xe1f4中,则为chek。

    void bitcheck(unsigned int source, int operand,int n)
    {
       int i,lastbits,mask;
       mask=(1<<n)-1;
       lastbits=operand&mask;
    
       for(i=0; i<32; i++)
       {
          if((source&(lastbits<<i))==(lastbits<<i))
              printf("It start at bit number %i\n",i+n);
       }
    }
    

3 个答案:

答案 0 :(得分:0)

我接受你的意思是你想把n作为一个位数组,并搜索operand void bitcheck(uint32_t source, uint32_t operand, unsigned int n) { uint32_t mask = ~((~0) << n); uint32_t needle = operand & mask; int i; for(i = 0; i <= (32 - n); i += 1) { if (((source >> i) & mask) == needle) { /* found it */ break; } } } 最低位的位指定的位序列。看起来你想要执行一个标准的面具&amp;相比;您需要扫描的唯一(次要)并发症。你似乎已经有了这个想法。

我这样写:

source

我和你的细节之间存在一些差异,但主要的功能差异是循环限制:你必须小心忽略你与目标比较的某些位是由移位操作引入的情况,如反对源于stdint.h,以免你得到误报。我写这种比较的方式让我更清楚(对我来说)应该是什么。

我还使用def histogram(): stars = [10,2,3] characters = [] for i in stars : cur_stars = "*" * i characters.append( cur_stars ) print cur_stars return characters >>> stars = histogram() ********** ** *** 中的显式宽度整数数据类型来表示代码依赖于特定宽度的所有值。如果你想编写端口干净的代码,这是一个很好的习惯。

答案 1 :(得分:0)

也许:

if((source&(maskbits<<i))==(lastbits<<i))

由于: 对于旧代码,在11中找到10将是正确的。事实上,当源&#39;来源时,您的原始状态将始终为真。由所有人组成。

答案 2 :(得分:0)

你的循环太过分了,我很害怕。例如,它可以在值~0中'找到'位模式'0001',它只包含一个。

这样做会更好(我希望):

void checkbit(unsigned value, unsigned pattern, unsigned n)
{
    unsigned size = 8 * sizeof value;
    if( 0 < n && n <= size)
    {
        unsigned mask = ~0U >> (size - n);
        pattern &= mask;

        for(int i = 0; i <= size - n; i ++, value >>= 1)
            if((value & mask) == pattern)
                printf("pattern found at bit position %u\n", i+n);
    }
}