使用shift-right和bitwise-AND找到二进制数的模式?

时间:2009-05-04 04:44:43

标签: language-agnostic bit-manipulation

我正在尝试在程序集中编写一个函数,它将检测更长的二进制数是否包含更小的二进制模式。

例:
100111 是否包含 1001

当我读到这个问题时,我想我会用大数字及其较小的模式进行按位-AND,每次在循环中右移(逻辑)。

所以,在我的脑海中,我认为它会这样做:

100111 AND 1001 = 0  
Shift-right 1  
010011 AND 1001 = 0  
Shift-right 1  
001001 AND 1001 = 1 // Pattern FOUND!  

并重复此操作,直到数字被移动直到它为零或AND返回1.

但是,我认为我必须有一些困惑,因为在第一次循环运行时,我输入的大部分内容都会返回1。我对AND的使用感到困惑吗?

4 个答案:

答案 0 :(得分:5)

问题是“部分匹配”还会为您的AND检查返回非零值:

100111 AND 001001 = 000001

因此,如果任何位匹配,则此测试,但您要确保所有位相同。 AND的结果必须等于您正在搜索的模式:

x = 100111
if (x AND 1001 == 1001)
  print "found"

答案 1 :(得分:1)

你应该然后对搜索模式进行测试:

if ((TestPattern & SearchPattern) == SearchPattern)
{
   // then match
}

(其中&代表按位AND

答案 2 :(得分:0)

按位AND不按预期方式工作(从样本判断并忽略似乎暗示您使用按位AND作为位的逻辑AND的符号)。 AND仅考虑设置为1“的位。”例如,1111和1001 == 1001.

您需要使用XOR并与0进行比较以进行匹配(请记住掩码中您未与结果进行比较的位)。在您的示例中,当(N ^ 1001)& 1111 == 0000

答案 3 :(得分:0)

为了确保0和1位都匹配您的搜索模式,您需要执行以下操作:

if ((InputPattern AND SearchMask) == SearchPattern)
{
    // then match
}

SearchMask应为1位,长度等于SearchPattern。例如,您可以SearchMask == 1111, SearchPattern == 1001