Binary 检查uint16\u t是否包含二进制uin8\u t

Binary 检查uint16\u t是否包含二进制uin8\u t,binary,contains,Binary,Contains,假设我有两个字节,0xE1和0xE6。这些连续字节是从一个较长的位范围中剪切而来的。由于切点与实际字节值无关,我需要检查这些字节是否包含另一个字节,例如0x3C。基本上,二进制字符串包含 0xE1 0xE6 1110000111100110 00111100 // It matches! 0x3C 如何从算法上测试它?这是一个二进制字符串。。。所以任何字符串搜索都应该有效。例如,这个简单的C#代码段应该可以工作: ushort s = 123; byte b

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

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

如何从算法上测试它?

这是一个二进制字符串。。。所以任何字符串搜索都应该有效。例如,这个简单的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;
}
static void Main(字符串[]args)
{
ushort s=123;
字节b=3;
int result=IndexOf(s,b);
Console.ReadLine();
}
静态int IndexOf(ushort s,字节b)
{
对于(int i=0;i<8;i++)
{
//首先,我们将短字符向下移动到一个字节:(s>>(8-i))
//这将删除“正确”位。然后执行“和”
//删除任何不必要的“左”位。
var shortSegment=(s>>(8-i))&255;
如果(短段==b)返回i;
}
返回-1;
}
(注意:ushort表示C#中的两个字节,而一个字节表示1个字节)。

将单词(2个字节)向右移动,获取较低的字节并进行比较

玩它

#包括
int包含(短两个字节,字符一个字节)
{
int i=0;
对于(;i>i)和0xFF))
返回1;
}
返回0;
}
内部主(空){
if(包含(0xE1E6、0x3C))
{
printf(“是!\n”);
}
其他的
{
printf(“编号:(\n”);
}
返回0;
}

我不认为它是二进制的会有多大区别,只要运行旧的。