0

假设我有两个字节,0xE1并且0xE6. 这些连续的字节从更长的位范围中切割出来。由于切割点与实际字节值无关,因此我需要检查这些字节是否包含另一个,例如0x3C. 基本上一个二进制字符串包含。

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

我如何通过算法测试这个?

4

2 回答 2

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;
}

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

于 2013-09-11T10:52:04.043 回答
1

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

在这里

#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;
}
于 2013-09-11T11:15:52.873 回答