我正在尝试在程序集中编写一个函数,它将检测更长的二进制数是否包含更小的二进制模式。
例:
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的使用感到困惑吗?
答案 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
。