2016-07-14 30 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,那麼在字符串中的那一點上有匹配。