2013-10-25 4 views
-3

어레이의 비트를 찾아 그 배열 {00000000000000000000000110110110}를 검색 할비트 어레이가 비트

되도록 :

BitArray bitsarr = new BitArray(150); //array of bits 

the bits is {00000000000000000000000110110110} its 32 bits ,i want to 

됨 비트 bitsarr 여부, 어떻게 배열 찾으면 {00000000000000000000000110110110}을 변환 할 16 진수 또는 ineger 또는 다른 종류의

에만 필요 비트를 유지해야 필요가 없다는 C# 언어를 사용 할 수있는, 내가

을 bitsarr에서 비트를 검색하는 방법 ?? 1이

static bool findbits(BitArray bits, bool[] bitstofind) 
    { 
    IEnumerator e = bits.GetEnumerator(); 
    List<bool> bitsc = new List<bool>(); 
    while (e.MoveNext()) 
     bitsc.Add((bool)e.Current); 
    for (int i = 0; i + bitstofind.Length < bitsc.Count; i++) 
     if (bitsc.GetRange(i, bitstofind.Length).ToArray().SequenceEqual(bitstofind)) return true; 
    return false; 
    } 

참고로

+1

당신은 정말 "검색 비트"에 의해 당신이 무슨 뜻인지 불분명으로 –

+0

는 {00000000000000000000000110110110가}이 내가 원하는 조금있다이 질문을 명확히 할 필요가 (내가 10 평판을 필요로하기 때문에, 여기에 링크를 추가 할 수 없습니다) 검색하려면 – user2898387

답변

0

보십시오 : 0이 하나가 참, 거짓

주 2 : BitArray는 (변환 또는 아니오) bools의 배열

1

당신을 사용하지 인스턴스화해야 몇 가지 간단한 비트 연산을 사용하여 비트 배열에서 비트 패턴을 검색 할 수 있습니다. 예를 들어, 2 비트에서 XOR을 사용하면 일치하는 경우 0을 반환하고 그렇지 않으면 1을 반환합니다. 시프트 연산 (< <)을 사용하여 비트를 왼쪽으로 시프트하고 패턴의 다음 비트를 검사 할 수 있습니다.

0

나는 그 방법을 찾지 못했습니다.

C#에서는 공용 메서드를 인스턴스화 된 클래스에 "추가"하기 위해 확장 메서드 ([1] 참조)를 사용할 수 있습니다.

이 경우 당신은이 작업을 수행 할 수 있습니다

네임 스페이스에 유래 당신은 여러 매칭 알고리즘을 찾을 수 있습니다

{ 정적 클래스 프로그램 {

public static bool Find(this System.Collections.BitArray text, System.Collections.BitArray pattern) 
    { 
     //... implement your search algorithm here... 
    } 


    static void Main(string[] args) 
    { 
     System.Collections.BitArray bitsarr = new System.Collections.BitArray(150); 

     bool result = bitsarr.Find(new System.Collections.BitArray(new bool[]{true, true, false, true})); 
     Console.WriteLine("Result: {0}", result); 
    } 


} 

} net,이 답변의 맨 아래에 두 개의 링크 [2,3]를 추가했습니다.

특별한 경우에 검색된 문자열이 32 비트 인 경우 Dömölki- (Baeza-Yates) -Gonnet 알고리즘 [4,5,6,7]을 사용하는 것이 좋습니다.

가능한 문자 집합에는 2 개의 요소 (0과 1)가 포함되어 있으므로이 수정은 32 비트의 긴 패턴을 검색하는 경우에만 사용할 수 있습니다.

네임 스페이스에 유래 { 정적 클래스 프로그램 {

public static bool IsFound(this System.Collections.BitArray text, System.Collections.BitArray pattern) 
    { 
     uint B = 0; 
     for (ushort i = 0; i < pattern.Length; i++) 
     { 
      if (pattern[i]) 
      { 
       uint num = 1; 
       B |= num << i; 
      } 
     } 
     return IsFound(text, B); 
    } 

    public static bool IsFound(this System.Collections.BitArray text, uint B) 
    { 
     uint nB = ~B; 
     uint D = 0; 
     const uint end = ((uint)1) << 31; 
     for (int i = 0; i < text.Length; i++) 
     { 
      uint uD = (D << 1) + 1; 
      D = uD & (text[i] ? B : nB); 
      if ((D & end) > 0) 
      { 
       return true; 
      } 
     } 
     return false; 
    } 

    static void Main(string[] args) 
    { 
     System.Collections.BitArray bitsarr = new System.Collections.BitArray(150); 

     //Tests: 
     bitsarr[0] = true; 
     bitsarr[1] = true; 
     bitsarr[2] = false; 
     bitsarr[3] = true; 

     bitsarr[50] = true; 
     bitsarr[51] = true; 
     bitsarr[52] = true; 
     bitsarr[53] = false; 
     bitsarr[54] = false; 
     bool result = bitsarr.IsFound(new System.Collections.BitArray(new bool[]{true, true, false, true})); 
     Console.WriteLine("Result: {0}, expected True", result); 
     result = bitsarr.IsFound(new System.Collections.BitArray(new bool[] { true, true, true, true })); 
     Console.WriteLine("Result: {0}, expected False", result); 
     result = bitsarr.IsFound(new System.Collections.BitArray(new bool[] { true, true, true, false })); 
     Console.WriteLine("Result: {0}, expected True", result); 
     result = bitsarr.IsFound(new System.Collections.BitArray(new bool[] { false, true, true, true })); 
     Console.WriteLine("Result: {0}, expected True", result); 
     result = bitsarr.IsFound(new System.Collections.BitArray(new bool[] { false, true, true, true })); 
     Console.WriteLine("Result: {0}, expected True", result); 
     Console.ReadKey(); 
    } 


} 

}

참고 : 추가 검사가 필요합니다.

+0

링크 : [1] http://msdn.microsoft.com/en-us/library/vstudio/bb383977.aspx [2] http://en.wikipedia.org/wiki/String_searching_algorithm [3] http://en.wikipedia.org/wiki/Approximate_string_matching [4] Dömölki- (Baeza-Yates) - Gonnet 알고리즘 : http://users-cs.au.dk/cstorm/courses/StrAlg_f 12/slides/Shift-and-OR.pdf [5] 비트 맵 알고리즘 : http://en.wikipedia.org/wiki/Bitap_algorithm [6] Shift-And 알고리즘 http://www.cs.helsinki .fi/u/tpkarkka/opetus/11s/spa/lecture04.pdf [7] http://users-cs.au.dk/cstorm/courses/StrAlg_f12/slides/Shift-and-OR.pdf –

관련 문제