2016-07-14 52 views
0

我一直在做一些研究,甚至看看按位操作,但我想知道如果任何人都可以提供他们的意见,以确定是否一个二进制数字模式在更大的二进制数中的任何地方匹配。说,例如,下列:最好的方法来确定如果二进制数字模式适合较大的二进制数

我有以下几点:001011 ,需要看是否确切的模式内的任何地方匹配:010100101100

提前感谢大家!

+0

'bool found =“010100101100”.Contains(“001011”);'不是最快的,但可能是最简单的方法 –

+0

非常clevel @DmitryBychenko。谢谢! –

+0

请选择一个答案 – Kariem

回答

0

有几种方法。哪一个是最好 - 这是你自己决定的。有些C#例子:也许,最简单的一个:只要使用string的模式

bool found = "010100101100".Contains("001011"); 

按位:如果你有一个整数

private static bool Search(int toFind, 
          int source, 
          int toFindLength, 
          int sourceLength = 32) { 
    for (int i = 0; i <= sourceLength - toFindLength; ++i) 
    if (((source >> i) & toFind) == toFind) 
     return true; 

    return false; 
} 

... 

string stSource = "010100101100"; 
string stToFind = "001011"; 

int source = Convert.ToInt32(stSource, 2); 
int toFind = Convert.ToInt32(stToFind, 2); 

bool found = Search(toFind, source, stToFind.Length, stSource.Length); 
0

检查这个基于Python按位解决方案的工作。它假定一个32位整数。

import math 
x = int("010100101100",2) 
y = int("1011",2) 

highest1x = int(math.log(x,2)) 
highest1y = int(math.log(y,2)) 
mask = int(math.pow(2,highest1y+1)-1) 

for i in range(0,int(32 - highest1x)): 
    z = y^x 
    if (z & mask == 0): 
      print "found" 
    y = y << 1 
    mask = mask << 1 

主要的想法是,两个相同的位模式之间的XOR将产生0.1

所以我们不停变动小的位模式,并沿大一个面具,每次XOR ,,然后AND与掩码XOR的结果隔离我们感兴趣的位。如果它们是0,那么在字符串中的那一点上有匹配。