假设我有两个字节,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;
}
(注意:在 C# 中 ushort 代表两个字节,而一个字节代表 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;
}