转:C#数据结构和算法学习系列八----BitArray类
BitArray 类是按照紧密格式来表示位集合。虽然我们能把位集合存储在常规数组内,但是如果采用专门为位集合设计的数据结构就能够创建更加有效的程序。 BitArray 类用来处理位集合。位集合可以用来有效地表示Boolean(布尔)值的集合。BitArray和ArrayList 十分类似,这是因为可以对BitArray 进行动态地大小调整,而且在需要时添加二进制位而不用担心数组越界的问题。
1.使用BitArray 类。通过实例化BitArray 对象就可以创建BitArray,并且同时会把希望在数组内的二进制位的数量传送给构造器。如下
BitArray BitSet = new BitArray(32);
这个BitArray 的32 个位都被设置为False(假值)。如果想要它们成为True(真值),那么可以像下列这样实例化数组:
BitArray BitSet = new BitArray(32, true);
构造器可以按照许多种不同的方式进行重载,但是这里将只会介绍一种构造器方法。可以用Byte(字节)值的数组来实例化BitArray。例如:
byte[] ByteSet = new byte[] { 1, 2, 3, 4, 5 };
BitArray BitSet = new BitArray(ByteSet);
BitSet BitArray 现在包含了字节值为1、2、3、4 和5 的二进制位。二进制位存储在BitArray
中,而且最高有效位(索引为0)在最左侧的位置上。当按惯例从右向左读二进制
数的时候,这样做可能会在使人犯糊涂。例如,下面这个八位的BitArray 的内容就等价为数值1:
True False False False False False False False
当然,较为常见的方式是把二进制数的最高有效位放置在右侧,就像下面这样:
0 0 0 0 0 0 0 1
这就需要自行编写代码来改变二进制数值(而不是Boolean 值)的显示和二进制位的顺序。如果BitArray 里面有Byte(字节)值,那么当循环遍历数组的时候每个Byte(字
节)值的每一位都将显示出来。下面这个简单的程序段就循环遍历了Byte(字节)值的BitArray:
- <strong><span style="font-size:13px;"> byte[] ByteSet = new byte[] {1, 2, 3, 4, 5};
- BitArray BitSet = new BitArray(ByteSet);
- for (int bits = 0; bits <= BbitSet.Count-1; bits++)
- Console.Write(BitSet.Get(bits) + " ");
- </span></strong>
利用Get 方法可以检索到存储在BitArray 中的分离的位。此方法会取走一个整数参数,即希望检索到的值的索引,然后此方法返回的值将是表示成True 或False 的位值。
为了显示来自BitSet BitArray 的位值,这里会把Get 方法用在先前的代码段内。如果存储在BitArray
中的数据确实是二进制数值(换句话说,数值应该被当作0和1 显示出来),那么就需要一种方法来按照正确的顺序显示数值实际的1
和0,其中正确的顺序就是指从右边开始而不是从左边开始。虽然无法改变BitArray 类所用的内部代码,但是我们可以编写外部代码来获得希望的输出。
下面这段程序创建了一个有5 个Byte(字节)值(即1、2、3、4 和5)的BitArray,并且每个字节都按照正确的二进制形式显示出来:
- using System;
- using System.Collections;
- class chapter6
- {
- static void Main()
- {
- int bits;
- string[] binNumber = new string[8];
- int binary;
- byte[] ByteSet = new byte[] { 1, 2, 3, 4, 5 };
- BitArray BitSet = new BitArray(ByteSet);
- bits = 0;
- binary = 7;
- for (int i = 0; i <= BitSet.Count - 1; i++)
- {
- if (BitSet.Get(i) == true)
- binNumber[binary] = "1";
- else
- binNumber[binary] = "0";
- bits++;
- binary--;
- if ((bits % 8) == 0)
- {
- binary = 7;
- bits = 0;
- for (int ji = 0; ji <= 7; ji++)
- Console.Write(binNumber[ji]);
- Console.WriteLine();
- }
- }
- }
- }
BitArray 用来存储位的集合。尽管位通常会用0 和1 来表示,但是BitArray 类会把这些数值替换成True(1)值或False(0)值的形式存储起来。BitArray 在需要存储一组Boolean(布尔)型数值时是很有用的,可是在需要处理位时它甚至会更加有用,这是因为人们可以很容易地在位值和Boolean(布 尔)型数值之间进行前后移动。