概念
如果需要處理很多位,就可以使用位數組。數組中每一位只能是0或1,即假或真。
BitArray的使用
BitArray是引用類型,長度是可以伸縮的,當不確定位的長度時可以使用。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace ConsoleApplication36
{
class Program
{
static void Main(string[] args)
{
BitArray bits = new BitArray(8);
bits.SetAll(true);
bits.Set(1, false);
bits[3] = false;
Console.WriteLine("使用set和索引器:");
Console.WriteLine(Convert.ToString(bits));
Console.WriteLine("使用NOT取反:");
bits.Not();
Console.WriteLine(Convert.ToString(bits));
BitArray bits1 = new BitArray(new bool[] { true, true, false, false, true, true, false, false });
BitArray bits2 = new BitArray(new bool[] { true, false, false, true, true, true, false, false });
Console.WriteLine("\n執行bits1.And(bits2)前: \nbits1={0}\nbits2={1}", Convert.ToString(bits1), Convert.ToString(bits2));
Console.WriteLine("執行bits1.And(bits2)後: \nbits1={0}", Convert.ToString(bits1.And(bits2)));
bits1 = new BitArray(new bool[] { true, true, false, false, true, true, false, false });
bits2 = new BitArray(new bool[] { true, false, false, true, true, true, false, false });
Console.WriteLine("\n執行bits1.Or(bits2)前: \nbits1={0}\nbits2={1}", Convert.ToString(bits1), Convert.ToString(bits2));
Console.WriteLine("執行bits1.Or(bits2)後: \nbits1={0}", Convert.ToString(bits1.Or(bits2)));
bits1 = new BitArray(new bool[] { true, true, false, false, true, true, false, false });
bits2 = new BitArray(new bool[] { true, false, false, true, true, true, false, false });
Console.WriteLine("\n執行bits1.Xor(bits2)前: \nbits1={0}\nbits2={1}", Convert.ToString(bits1), Convert.ToString(bits2));
Console.WriteLine("執行bits1.Xor(bits2)後: \nbits1={0}", Convert.ToString(bits1.Xor(bits2)));
}
}
public partial class Convert
{
public static string ToString(BitArray bits)
{
StringBuilder sb = new StringBuilder();
foreach (bool item in bits)
{
sb.Append(item ? 1 : 0);
}
return sb.ToString();
}
}
}
輸出結果:
從代碼可以看出:
1. 使用部分類partial,爲Convert提供擴展方法,可以支持BitArray轉string
2. BitArray類可以使用SetAll、Set、和索引器等進行位賦值
3. 位與運算And (兩個同時爲1時結果爲1)
4. 位或運算Or(其中只要有一個爲1結果就爲1)
5. 位異或運算Xor(兩個同時爲1時結果爲0)
BitVector32的使用
BitVector32是值類型,因此處理速度比BitArray快,但是長度固定爲32位。
掩碼
static void Main(string[] args)
{
Console.WriteLine("掩碼的規律:");
Console.WriteLine("BitVector32.CreateMask():{0}",BitVector32.CreateMask());
Console.WriteLine("BitVector32.CreateMask(1):{0}", BitVector32.CreateMask(1));
Console.WriteLine("BitVector32.CreateMask(2):{0}", BitVector32.CreateMask(2));
Console.WriteLine("BitVector32.CreateMask(3):{0}", BitVector32.CreateMask(3));
Console.WriteLine("BitVector32.CreateMask(4):{0}", BitVector32.CreateMask(4));
Console.WriteLine("BitVector32.CreateMask(5):{0}", BitVector32.CreateMask(5));
Console.WriteLine("BitVector32.CreateMask(6):{0}", BitVector32.CreateMask(6));
Console.WriteLine("BitVector32.CreateMask(7):{0}", BitVector32.CreateMask(7));
Console.WriteLine("BitVector32.CreateMask(8):{0}", BitVector32.CreateMask(8));
}
輸出結果:
可以看出,結果都是傳遞的參數*2
規律如下:
- 把10進制參數轉換爲2進制
- 2進制向左移一位,最後一位補0
- 得到二進制掩碼,返回一個10進制
16進制 10進制 2進制轉換
static void Main(string[] args)
{
Console.WriteLine("16進制:a");
int number = 0xa;
Console.WriteLine("10進制:{0}",number);
BitVector32 bits=new BitVector32();
bits[number]=true;
Console.WriteLine("2進制:{0}", bits.ToString());
}