您的位置:首页 > 编程语言 > C#

C#BitVector32结构操作说明

2016-06-05 16:14 776 查看
原文链接:https://www.mgenware.com/blog/?p=22

BitVector32结构体位于System.Collections.Specialized命名空间内,相对.NET中另外一个位容器BitArray,他的优点是速度快,占用空间小,并可以存储小数字。他内部用一个32位的整数来存储数据,因此只能存储32位的比特数据。

首先BitVector32本质上用一个32位的数来表示数据,那么初始化BitVector32结构时必须制定一个最初值,用户可以传入一个int或者另一个已经存在的BitVector32来构造一个新的BitVector32.

BitVector32的Data属性返回一个int用来表示内部数据,如果用来显示BitVector32的内容,这个Data是没有意义的,因为他是十进制化的结果,这时候用BitVector32的ToString方法就可以返回有用的文字说明。

BitVector32 bits = new BitVector32(0xF);
//初始化BitVector32:设置低4位为1  0x 00 00 00 00 00 00 00 0F
Console.WriteLine(bits.Data);
//(十六进制)0xF 等于 (二进制)1111 等于 (十进制)15 所以输出15
Console.WriteLine(bits.ToString());
//输出:BitVector32{00000000000000000000000000001111} (看得出来:后四位是1)


 

接下来就是最重要的位操作了。

BitVector32结构体提供索引器(Indexer)可以直接通过bool对象操作BitVector32结构,索引器参数是int,这个int可不是指第几位的意思(BitArray中的索引器是第几位),而是需要一个位掩码(位屏蔽),通过这个BitVector32通过这个位掩码来操作内部比特位,来看看Reflector下BitVector32索引器的源码

struct BitVector32
{
//data 就是 BitVector32的Data属性的对应字段
public bool this[int bit]
{
get
{
return ((this.data & bit) == ((ulong)bit));
//通过数据和掩码的与操作,来将其他位清0,保留掩码的设置位
//如果操作后的结果等于掩码,很显然这是操作位就是1,返回true
//否则的话,返回false
}
set
{
if (value)
{
this.data |= (uint)bit;
//数据 = 数据 OR 掩码,将指定位设置成1
}
else
{
this.data &= (uint)~bit;
//数据 = 数据 AND 掩码取反,将指定位设置成0
//C# 取反位操作运算符:~
}
}
}

}


上面代码我加了注释,可以看到,BitVector32的位操作就是利用普通位掩码的操作。

 

好了那么用BitVector32索引器操作其实就是定义好位掩码,接着取回信息或者赋值就可以了。

//注意using System.Collections.Specialized;

int mask1 = 1;
//掩码代表最后一位:二进制表示:0...0001
int mask2 = 4;
//掩码代表倒数第三位:二进制表示:0...0000100

BitVector32 bits = new BitVector32(-1);
//-1补码:1...1111
//设置BitVector32全部为1
Console.WriteLine(bits);

Console.WriteLine("设置最后一位和倒数第三位位0");
bits[mask1] = bits[mask2] = false;
Console.WriteLine(bits);

Console.WriteLine("设置倒数第三位为1");
bits[mask2] = true;
Console.WriteLine(bits);


 

输出:

BitVector32{11111111111111111111111111111111}
设置最后一位和倒数第三位位0
BitVector32{11111111111111111111111111111010}
设置倒数第三位为1
BitVector32{11111111111111111111111111111110}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c# BitVector32