C#集合之位數(shù)組的用法
如果需要處理的數(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)文章
在C#中使用OpenCV(使用OpenCVSharp)的實現(xiàn)
這篇文章主要介紹了在C#中使用OpenCV(使用OpenCVSharp)的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11Silverlight將圖片轉(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