检查uint16_t是否包含二进制uin8_t

时间:2013-09-11 10:38:34

标签: binary contains

假设我有两个字节0xE10xE6。这些连续字节从较长的位范围切割而来。由于切割点与实际字节值无关,我需要检查这些字节是否包含另一个字节,比如0x3C。基本上二进制字符串包含。

0xE1    0xE6
1110000111100110
     00111100     // It matches!
     0x3C

我如何通过算法对此进行测试?

2 个答案:

答案 0 :(得分:1)

这是一个二进制字符串...所以任何字符串搜索都应该有用。例如,这个简单的C#代码段应该可以工作:

ushort s = 123;
byte b = 3;
//0000000001111011
string sBitString = Convert.ToString(s, 2).PadLeft(16,'0');
//00000011
string bBitString = Convert.ToString(b, 2).PadLeft(8,'0');
//True, because the strings match at zero-based index 3 
bool result = sBitString.Contains(bBitString);

当然,这个特定的实现并不是最高效的 - 可以编写一个更有效的解决方案,了解按位运算符 - 但一如既往,这取决于您的性能需求。

static void Main(string[] args)
{
    ushort s = 123;
    byte b = 3;
    int result = IndexOf(s, b);

    Console.ReadLine();
}

static int IndexOf(ushort s, byte b)
{
    for (int i = 0; i < 8; i++)
    {
        //  First we shift the short down into a byte: (s >> (8 - i))
        //  This removes the 'right' bits.  We then do an 'and'  
        //  to remove any unnecessary 'left' bits.
        var shortSegment = (s >> (8 - i)) & 255;
        if (shortSegment == b) return i;
    }
    return -1;
}

(注意:ushort表示C#中的两个字节,而一个字节表示1个字节)。

答案 1 :(得分:1)

将字(2个字节)向右移,得到低字节并进行比较!

使用它here

#include <stdio.h>

int contains(short twobytes, char onebyte)
{
    int i=0;
    for (; i<8; i++)
    {
        if (onebyte == ((twobytes >> i) & 0xFF))
          return 1;
    }
    return 0;
}

int main(void) {
    if (contains(0xE1E6, 0x3C))
    {
        printf("YES!\n");
    }
    else
    {
        printf("No :(\n");
    }
    return 0;
}