-3

ビットの配列があり、その配列で {0000000000000000000000110110110} を検索したい

そのような:

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

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

ビットが配列bitsarrにあるかどうかを検索します.C#言語を使用してそれを行うにはどうすればよいですか、私はそうします

{0000000000000000000000110110110} を 16 進数、整数、またはその他の型に変換する必要はありません

それはビットのままである必要があり、bitsarr でビットを検索するメソッドのみが必要ですか??

4

3 に答える 3

1

そのための方法は見つかりませんでした。

C# では、インスタンス化されたクラスにパブリック メソッドを「追加」するために、拡張メソッド ([1] を参照) を使用できます。

その場合、これを行うことができます:

namespace StackOverFlow
{
    static class Program
    {

        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);
        }
    }
}

ネット上でいくつかのマッチング アルゴリズムを見つけることができます。この回答の下部に 2 つのリンク [2,3] を追加しました。

特殊なケースとして、検索文字列が 32 ビットの場合、Dömölki-(Baeza-Yates)-Gonnet アルゴリズム [4,5,6,7] をお勧めします。

可能な文字セットには 2 つの要素 (0 と 1) が含まれているため、この変更は、32 ビット長のパターンを検索している場合にのみ有効です。

namespace StackOverFlow
{
    static class Program
    {

        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();
        }


    }
}

注: さらにテストが必要です。

(評判が10必要なので、ここにリンクを追加することはできません)

于 2013-10-25T21:32:24.290 に答える
0

これで試してください

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 は false、1 は true

注 2: BitArray は、ブール値の配列 (変換済みまたはなし) を使用してインスタンス化する必要があります。

于 2013-10-25T18:04:02.407 に答える