C#集合之位數(shù)組的用法
如果需要處理的數(shù)字有許多位,就可以使用BitArray類(lèi)和BitVector32結(jié)構(gòu)。BitArray類(lèi)位于System.Collection,BitVector32結(jié)構(gòu)位于System.Collection.Specialized。
這兩種類(lèi)型最重要的區(qū)別是,BitArray類(lèi)可以重新設(shè)置大小,如果事先不知道需要的位數(shù),就可以使用BitArray類(lèi)。BitVector32結(jié)構(gòu)是基于棧的,因此比較快。BitVector32結(jié)構(gòu)僅包含32位,它們存儲(chǔ)在一個(gè)整數(shù)中。
1.BitArray類(lèi)
BitArray類(lèi)是一個(gè)引用類(lèi)型,它包含一個(gè)int數(shù)組,其中每32位使用一個(gè)新整數(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類(lèi)。BitVector32結(jié)構(gòu)效率較高,因?yàn)樗且粋€(gè)值類(lèi)型,在整數(shù)棧上存儲(chǔ)位。一個(gè)整數(shù)可以存儲(chǔ)32位。如果需要更多的位,可以使用多個(gè)BitVector32值或BitArray類(lèi)。

//對(duì)CreateMask方法的第一個(gè)調(diào)用來(lái)訪(fǎng)問(wèn)第一位的一個(gè)掩碼
//調(diào)用CreateMask后,bit1被設(shè)置為1。再次調(diào)用CreateMask方法,把第一個(gè)掩碼作為參數(shù)傳遞給CreateMask方法,返回來(lái)第二位的一個(gè)掩碼(是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個(gè)片段。第一個(gè)片段需要12位,有16進(jìn)制0xfff定義。
//第一次調(diào)用CreateSection方法直接受0xfff,為最前面的12位分配內(nèi)存。
//第二次調(diào)用CreateSection方法,將第一個(gè)片段和偏移量傳遞
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],把一個(gè)BitVector32.Section類(lèi)型的值傳遞給BitVector32結(jié)構(gòu)的索引器,會(huì)返回一個(gè)int。IntToBinaryString方法將這個(gè)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ù)組的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C#訪(fǎng)問(wèn)SqlServer設(shè)置鏈接超時(shí)的方法
這篇文章主要介紹了C#訪(fǎng)問(wèn)SqlServer設(shè)置鏈接超時(shí)的方法,涉及CommandTimeout屬性的相關(guān)設(shè)置技巧,非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2015-06-06
在C#中使用OpenCV(使用OpenCVSharp)的實(shí)現(xiàn)
這篇文章主要介紹了在C#中使用OpenCV(使用OpenCVSharp)的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
在Unity中實(shí)現(xiàn)簡(jiǎn)單的偽時(shí)間同步
這篇文章主要介紹了在Unity中實(shí)現(xiàn)簡(jiǎn)單的偽時(shí)間同步,為什么說(shuō)是偽同步呢,因?yàn)閮H僅是獲取的數(shù)據(jù)庫(kù)所在服務(wù)器的系統(tǒng)時(shí)間,分享給大家,有需要的小伙伴可以參考下2015-03-03
Silverlight將圖片轉(zhuǎn)換為byte的實(shí)現(xiàn)代碼
這篇文章主要介紹了Silverlight將圖片轉(zhuǎn)換為byte的實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-11-11
C#連接Oracle數(shù)據(jù)庫(kù)的實(shí)例方法
C#連接Oracle數(shù)據(jù)庫(kù)的實(shí)例方法,需要的朋友可以參考一下2013-04-04
給c#添加SetTimeout和SetInterval函數(shù)
Javascript中的SetTimeout和SetInterval函數(shù)很方便,把他們移植到c#中來(lái)。2008-03-03

