【发布时间】:2019-10-23 17:51:01
【问题描述】:
我正在编写一个函数来在二进制数组(位图文件)中搜索位模式。模式的大小为 5 到 8 位长。我已经实现了这个函数来测试数组和模式中的每一位。但是,它并没有应有的效率。
首先我想用 C 来实现这段代码。
Point* FindPattern(imgInfo* pImg, int pSize, int* ptrn, Point* pDst, int* fCnt)
{
int i, j, k, l;
int mask;
int rx = pSize >> 16;
int ry = pSize & 0xFFFF;
*fCnt = 0;
for (i=0; i < pImg->height - ry; ++i)
for (j=0; j < pImg->width - rx; ++j)
{
// for a rectangle with upper lefr corner in (i,j)
// check if there is pattern in image
for (k=0; k < ry; ++k)
{
mask = 1 << (rx - 1);
for (l=0; l < rx; ++l, mask >>= 1)
if (GetPixel(pImg, j+l, i+k) != ((ptrn[k] & mask) != 0))
break;
if (l < rx) // pattern not found
break;
}
if (k >= ry) //pattern found
{
pDst[*fCnt].x = j;
pDst[*fCnt].y = i;
++(*fCnt);
}
}
例如我有这样的二进制字符串:1111 1111 1010 0000 0111 1111 1111 1111
我正在寻找模式:0100 0000
那么在字符串中检测这种模式的最有效方法是什么?通过移动模式和字符串的位而不是对它们执行异或?
【问题讨论】:
标签: arrays search binary pattern-matching