C#位数组BitVector32
一、引言
前面的位数组BitArray的篇章我们介绍过基本知识以及BitArray的基本知识,今天来介绍BitVector32。
首先BitArray是个长度可以变的位数组,适用于事先不知道位长的情况。本篇介绍的BitVector32的长度是固定为32个位。
由于BitVector32结构的效率比较高,因为它是一个值类型,在整数栈上存储,所以它的效率比较快,这也是他的一个重要优点。
二、BitVector32结构的基础
1、BitVector32在System.Collections.Specialized命名空间内找到。
2、BitVector32的长度固定为32位不可更改,如果想要更多的数据就需要重新的定义BitVector32。
3、BitVector32是个结构它存储在栈上,而BitArray是个类,它是引用类型。
三、BitVector32常用方法
namespace System.Collections.Specialized
{
public struct BitVector32 //首先它是是个结构,存储在栈上
{
public BitVector32(BitVector32 value); //用现有的来初始化
public BitVector32(int data); //以指定int值初始化
public int Data { get; } //返回当前BitVector32变量的值
public int this[BitVector32.Section section] { get; set; }//以索引方式获取或设置指定片段上的值
public bool this[int bit] { get; set; } //按照掩码来访问或设置值,注意bit是[掩码]不是[下标]
public static int CreateMask(); //创建第一个屏蔽,即值为1
public static int CreateMask(int previous); //按照指定值创建屏蔽
public static BitVector32.Section CreateSection(short maxValue); //创建一个片段并指定最大值
public static BitVector32.Section CreateSection(short maxValue, BitVector32.Section previous); //在指定的片段后面再创建一个片段并制定最大值。
public override bool Equals(object o); //相等判断
public override int GetHashCode(); //返回哈希代码
public override string ToString(); //重写ToString()方法
public static string ToString(BitVector32 value); //将位数组以字符串输出
public struct Section //BitVector32片段结构
{
public static bool operator !=(BitVector32.Section a, BitVector32.Section b); //重写!=操作符
public static bool operator ==(BitVector32.Section a, BitVector32.Section b); //重写==操作符
public short Mask { get; } //获取隔离掩码
public short Offset { get; } //获取从 BitVector32 的起始处开始的此节的偏移量。
public bool Equals(BitVector32.Section obj); //片段相等判断
public override bool Equals(object o); //相等判断
public override int GetHashCode();
public override string ToString();
public static string ToString(BitVector32.Section value);
}
}
}
四、BitVector32的实例
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Collections;
using System.Diagnostics;
using System.Collections.Specialized;
namespace TESTT
{
class Program
{
static void Main(string[] args)
{
//新建
var bits = new BitVector32(0X23); //新建并赋值0x23,不设置默认为0
//bits:00000000000000000000000000100011
Console.WriteLine(bits.ToString());
//掩码读取位
//所谓掩码就是用0屏蔽不关心的位,用1凸显关心的位
Console.WriteLine(bits[0]); //
Console.WriteLine(bits[1]); //读取第1位->1-true
Console.WriteLine(bits[2]); //读取第2位->1-true
Console.WriteLine(bits[3]); //读取第1位和第2位->1、1-true
Console.WriteLine(bits[4]); //读取第3位->0-false
Console.WriteLine(bits[5]); //读取第1位和第3位->0、1->false
Console.WriteLine(bits[0x23]); //读取第1、2、6位->1、1、1->true
Console.WriteLine(bits[0x13]); //读第1、2、5位->1、1、0->false
//综上所列,读取的掩码位数为1的话,就返回该位的值,
//读取的掩码为1位以上的话,例如3、5、0x13\0x23的话,就返回对应位值的相与结果
//创建要读取的掩码,实际上就是从1开始的2倍数列。1、2、4、8、16、32。。。
int bit1 = BitVector32.CreateMask(); //创建掩码1、0001
int bit2 = BitVector32.CreateMask(bit1); //创建掩码2、0010
int bit3 = BitVector32.CreateMask(bit2); //创建掩码4、0100
int bit4 = BitVector32.CreateMask(bit3); //创建掩码8、1000
int bit5 = BitVector32.CreateMask(bit4); //创建掩码16、10000
bits[bit1] = true; //通过掩码设置第1位
bits[bit2] = false;//通过掩码设置第2位
bits[bit3] = true; //通过掩码设置第3位
bits[bit4] = false;//通过掩码设置第4位
bits[bit5] = true; //通过掩码设置第5位
Console.WriteLine(bits);
//创建多位掩码
//0xabcdef=00000000101010111100110111101111
bits[0xabcddf] = true;
Console.WriteLine(bits); //00000000101010111100110111111111
//创建片段,可以将32个位按照需求分为多个片段,这样便可以访问具体片段的值
/*
* 下面参数中第一个参数oxfff指的是当前片段所要存储的最大数据。其目的有两个
* 1、限制片段的最大值,保证存储数据的规范
* 2、根据最大值可以分配合适的最小空间
* 例如0xfff表示111111111111它就表示要占用12个位,所以片段划分就是12个位
*/
BitVector32.Section sectionA = BitVector32.CreateSection(0xfff); //创建片段
/*
* 相同的原理0xff表示11111111,共需要8个位,所以该片段分配8个位
*/
BitVector32.Section sectionB = BitVector32.CreateSection(0xff,sectionA); //创建片段,占8位
BitVector32.Section sectionC = BitVector32.CreateSection(0xf,sectionB); //创建片段,占4位
BitVector32.Section sectionD = BitVector32.CreateSection(0x7,sectionC); //创建片段,占3位
BitVector32.Section sectionE = BitVector32.CreateSection(0x7,sectionD); //创建片段,占3位
BitVector32.Section sectionF = BitVector32.CreateSection(0x3,sectionE); //创建片段,占2位
//此时bits:00 000 000 1010 10111100 110111111111
//输出每个
Console.WriteLine(sectionA); //输出Section{0xfff,0x0}
Console.WriteLine(bits[sectionA]); //3583->110111111111
Console.WriteLine(bits[sectionB]); //188->10111100
Console.WriteLine(bits[sectionC]); //10->1010
Console.WriteLine(bits[sectionD]); //0->000
Console.WriteLine(bits[sectionE]); //0->000
Console.WriteLine(bits[sectionF]); //0->00
Console.ReadKey();
}
}
}