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 的新實例,該實例包含從指定的字節數組復制的位值。位格式
下面創建一個字節數組,里面包含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)。
獲取 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