C#位数组BitVector32

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();
        }
    }
  
}

发布了50 篇原创文章 · 获赞 0 · 访问量 853

猜你喜欢

转载自blog.csdn.net/weixin_40786497/article/details/104169454