假设我有两个字节0xE1
和0xE6
。这些连续字节从较长的位范围切割而来。由于切割点与实际字节值无关,我需要检查这些字节是否包含另一个字节,比如0x3C
。基本上二进制字符串包含。
0xE1 0xE6
1110000111100110
00111100 // It matches!
0x3C
我如何通过算法对此进行测试?
答案 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;
}