BitArray類的使用--(轉換二進制數的內部實現過程)


BitArray類用來處理位集合。

它和ArrayList十分類似,可以動態調整大小,可以在需要的時候添加二進制位而不用擔心數組越界的問題。(所以本質它也是集合里套一個數組,可能是線性數組)

什么是位集合?

----位集合是可以用來有效表示Boolean值的集合。注意:表示True/False的集合,不是0、1集合

 

另:

對常規數的二進制的顯示或存儲(如1):

0 0 0 0 0 0 0 1

而對於在BitArray里的存儲,它是如下格式:

True False False False False False False False

它的順序是相反的,而且用布爾值很難便捷讀懂,但實際上,我們應當把數值當作1和0這樣直觀的顯示出來,並且順序也要進行處理

解決方法:

BitArray里顯示的格式是逆序的,並且每一位都用布爾值顯示,我們無法改變BitArray類所用的內部代碼,但我們可以編寫外部代碼,使它能夠更加友好的便於理解的常規的方式顯示出來。

舉例

使用BitArray的其中一種構造方法:

 

BitArray(Byte[])

初始化 BitArray 的新實例,該實例包含從指定的字節數組復制的位值位格式

 

下面創建一個字節數組,里面包含5個字節型的數值:1和2和3和4和5

 1 using System;
 2 using System.Collections;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Text;
 6 using System.Threading.Tasks;
 7 
 8 namespace 二進制數
 9 {
10     class BinNumber
11     {
12         static void Main(string[] args)
13         {
14             int bits;
15             string[] binNumber = new string[8];//
16             int binary;
17             byte[] ByteSet = new byte[] { 1, 2, 3, 4, 5 };//定義一個字節型數組,存5個字節型數值:1,2,3,4,5,6
18             BitArray BitSet = new BitArray(ByteSet);//這里一定要注意,這里的每一個字節型數值是以位的形式每一位用Boolean值逆序存儲在BitArray(1字節對應8位)
19             bits = 0;//bits是計數器,到8了就又歸為初始值0;為的是方便知道操作完了一個字節型數值(1字節正好占8位)
20             binary = 7;//binary是二進制數組下標索引;初始值為7,這是因為BitArray里存儲的數據和常規二進制數據的順序是相反的
21             Console.WriteLine("BitSet里包含的元素數"+BitSet.Count);//40,因為數據在BitArray里是以位的形式存儲的,5個字節型數值,一個字節占8位,所以共占40位!!!不是5!!!
22             for (int i = 0; i <= BitSet.Count - 1; i++)//遍歷40個位,每個位存boolean值True/False
23             {
24                 Console.WriteLine("BitSet.Get("+i+")" + BitSet.Get(i));
25                 if (BitSet.Get(i) == true)
26                     binNumber[binary] = "1";//如果該位存儲的true值,則轉成1;
27                 else
28                     binNumber[binary] = "0";//如果該位存儲的false值,則轉成0;
29                 bits++;      //計數+1
30                 binary--;    //eg.第8位(下標7)存好,則將下標向左移1位存下一輪將位布爾值轉成的二進制0/1
31 
32                 if ((bits % 8) == 0)//當計數器為8時,表示一個字節型的數值已經表示完全了
33                 {
34                     binary = 7;//將存儲字節型數值的二進制形式的String型數組的下標歸初始
35                     bits = 0;
36                     for(int j=0;j<=7;j++)
37                         Console.Write(binNumber[j]);
38                     Console.WriteLine();         
39                 }
40             }
41             Console.ReadKey();
42         }
43     }
44 }

  利用Get方法 可以獲取到存儲在BitArray里的每一位的位值(True/False)。

Get(Int32)

獲取 BitArray 中特定位置處的位值。

BitSet.Get(i):i是整型參數,該方法的返回值是該位所存儲的True或False的位值!!!

所以在獲取到該位的位值時需要判斷True or False,對True值就寫入1,False值就寫入0;這樣就可以轉換成常規的二進制形式0,1形式。


上面代碼的執行結果圖


其實用BitArray它已經把常規的數值按照二進制的位數存儲,只是存的內容不是二進制的0,1;而是True ,False.要做的就是把順序理好,把每一位的Boolean值改成0,1。

===========================================================================================================
另:取整型數組來試一試,整型數組是4字節,32位
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            int bits = 0;
            int index = 31;
            string[] s = new string[32];
            int[] a = new int[] {2,3,2,7, 2147483647};
            BitArray BA = new BitArray(a);

            Console.WriteLine("BA的大小:" + BA.Count);

            for(int i=0;i<BA.Count;i++)
            {
               Boolean b = BA.Get(i);
               if (b == true)
                   s[index] = "1";
               else
                   s[index] = "0";
               bits++;
               index--;
               if (bits % 32 == 0)
               {
                   bits = 0;
                   index = 31;
                   for (int j = 0; j <=31; j++)
                       Console.Write(s[j]);
                   Console.WriteLine();
               }

            }
            Console.ReadKey();
         }
    }
}
 
        

 附:BitArray相關API
https://msdn.microsoft.com/zh-cn/library/system.collections.bitarray.aspx

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM