C#集合之位數(shù)組的用法
如果需要處理的數(shù)字有許多位,就可以使用BitArray類和BitVector32結(jié)構(gòu)。BitArray類位于System.Collection,BitVector32結(jié)構(gòu)位于System.Collection.Specialized。
這兩種類型最重要的區(qū)別是,BitArray類可以重新設置大小,如果事先不知道需要的位數(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被設置為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)建掩碼之外,還可以自己定義掩碼,也可以一次設置多位。
//十六進制abcdef與二進制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進制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ù)組的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在C#中使用OpenCV(使用OpenCVSharp)的實現(xiàn)
這篇文章主要介紹了在C#中使用OpenCV(使用OpenCVSharp)的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-11-11
Silverlight將圖片轉(zhuǎn)換為byte的實現(xiàn)代碼
這篇文章主要介紹了Silverlight將圖片轉(zhuǎn)換為byte的實現(xiàn)代碼,需要的朋友可以參考下2015-11-11
給c#添加SetTimeout和SetInterval函數(shù)
Javascript中的SetTimeout和SetInterval函數(shù)很方便,把他們移植到c#中來。2008-03-03

