欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#集合之位數(shù)組的用法

 更新時間:2022年04月12日 10:06:39   作者:Ruby_Lu  
這篇文章介紹了C#集合之位數(shù)組的用法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

如果需要處理的數(shù)字有許多位,就可以使用BitArray類和BitVector32結(jié)構(gòu)。BitArray類位于System.Collection,BitVector32結(jié)構(gòu)位于System.Collection.Specialized。
這兩種類型最重要的區(qū)別是,BitArray類可以重新設(shè)置大小,如果事先不知道需要的位數(shù),就可以使用BitArray類。BitVector32結(jié)構(gòu)是基于棧的,因此比較快。BitVector32結(jié)構(gòu)僅包含32位,它們存儲在一個整數(shù)中。

1.BitArray類

BitArray類是一個引用類型,它包含一個int數(shù)組,其中每32位使用一個新整數(shù)。

示例:

    static void BitArrayDemo()
        {
          var bits1 = new BitArray(8);
          bits1.SetAll(true);
          bits1.Set(1, false);
          bits1[5] = false;
          bits1[7] = false;
          Console.Write("initialized: ");
          DisplayBits(bits1);
          Console.WriteLine();
           //int i =      Convert.ToInt32(bits1);


          DisplayBits(bits1);
          bits1.Not();
          Console.Write(" not ");
          DisplayBits(bits1);
          Console.WriteLine();

          var bits2 = new BitArray(bits1);
          bits2[0] = true;
          bits2[1] = false;
          bits2[4] = true;
          DisplayBits(bits1);
          Console.Write(" or ");
          DisplayBits(bits2);
          Console.Write(" : ");
          bits1.Or(bits2);
          DisplayBits(bits1);
          Console.WriteLine();


          DisplayBits(bits2);
          Console.Write(" and ");
          DisplayBits(bits1);
          Console.Write(" : ");
          bits2.And(bits1);
          DisplayBits(bits2);
          Console.WriteLine();

          DisplayBits(bits1);
          Console.Write(" xor ");
          DisplayBits(bits2);
          bits1.Xor(bits2);
          Console.Write(" : ");
          DisplayBits(bits1);
          Console.WriteLine();
        }
        
        static void DisplayBits(BitArray bits)
        {
          foreach (bool bit in bits)
          {
            Console.Write(bit ? 1 : 0);
          }
        }

2.BitVector32結(jié)構(gòu)

如果事先知道需要的位數(shù),就可以使用BitVector32結(jié)構(gòu)代替BitArry類。BitVector32結(jié)構(gòu)效率較高,因為它是一個值類型,在整數(shù)棧上存儲位。一個整數(shù)可以存儲32位。如果需要更多的位,可以使用多個BitVector32值或BitArray類。

    //對CreateMask方法的第一個調(diào)用來訪問第一位的一個掩碼
      //調(diào)用CreateMask后,bit1被設(shè)置為1。再次調(diào)用CreateMask方法,把第一個掩碼作為參數(shù)傳遞給CreateMask方法,返回來第二位的一個掩碼(是2)
      
      var bits1 = new BitVector32();
      int bit1 = BitVector32.CreateMask();     //1
      int bit2 = BitVector32.CreateMask(bit1); //2
      int bit3 = BitVector32.CreateMask(bit2); //4
      int bit4 = BitVector32.CreateMask(bit3); //8
      int bit5 = BitVector32.CreateMask(bit4); //16

      bits1[bit1] = true;
      bits1[bit2] = false;
      bits1[bit3] = true;
      bits1[bit4] = true;
      Console.WriteLine(bits1);

輸出:

    //除了用CreateMask方法創(chuàng)建掩碼之外,還可以自己定義掩碼,也可以一次設(shè)置多位。
    //十六進(jìn)制abcdef與二進(jìn)制1010 1011 1100 1101 1110 1111相同
    bits1[0xabcdef] = true;
    Console.WriteLine(bits1);

輸出:

    //也可以把32位分別放在不同的片段中
      bits1[0xabcdef] = true;
      Console.WriteLine(bits1);


      int received = 0x79abcdef;

      var bits2 = new BitVector32(received);
      Console.WriteLine(bits2);
      //創(chuàng)建6個片段。第一個片段需要12位,有16進(jìn)制0xfff定義。
      //第一次調(diào)用CreateSection方法直接受0xfff,為最前面的12位分配內(nèi)存。
      //第二次調(diào)用CreateSection方法,將第一個片段和偏移量傳遞
      BitVector32.Section sectionA = BitVector32.CreateSection(0xfff);
      BitVector32.Section sectionB = BitVector32.CreateSection(0xff, sectionA);
      BitVector32.Section sectionC = BitVector32.CreateSection(0xf, sectionB);
      BitVector32.Section sectionD = BitVector32.CreateSection(0x7, sectionC);
      BitVector32.Section sectionE = BitVector32.CreateSection(0x7, sectionD);
      BitVector32.Section sectionF = BitVector32.CreateSection(0x3, sectionE);
    //bits2[sectionA],把一個BitVector32.Section類型的值傳遞給BitVector32結(jié)構(gòu)的索引器,會返回一個int。IntToBinaryString方法將這個int表示
      Console.WriteLine("Section A: " + IntToBinaryString(bits2[sectionA], true));
      Console.WriteLine("Section B: " + IntToBinaryString(bits2[sectionB], true));
      Console.WriteLine("Section C: " + IntToBinaryString(bits2[sectionC], true));
      Console.WriteLine("Section D: " + IntToBinaryString(bits2[sectionD], true));
      Console.WriteLine("Section E: " + IntToBinaryString(bits2[sectionE], true));
      Console.WriteLine("Section F: " + IntToBinaryString(bits2[sectionF], true));

      
    static string IntToBinaryString(int bits, bool removeTrailingZero)
    {
      var sb = new StringBuilder(32);

      for (int i = 0; i < 32; i++)
      {
        if ((bits & 0x80000000) != 0)
        {
          sb.Append("1");
        }
        else
        {
          sb.Append("0");
        }
        bits = bits << 1;
      }
      string s = sb.ToString();
      if (removeTrailingZero)
        return s.TrimStart('0');
      else
        return s;
    }

輸出:

到此這篇關(guān)于C#集合之位數(shù)組的文章就介紹到這了。希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論