C# 点阵列(BitArray)
BitArray 是 C# 中用于表示一组位(bit)值的集合。
BitArray 属于 System.Collections 命名空间,主要用于处理二进制数据或进行位操作。
相比使用布尔数组(bool[]),BitArray 更加高效,因为它以紧凑的方式存储每个位。
BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示。
true 表示位是开启的(1),false 表示位是关闭的(0)。
当您需要存储位,但是事先不知道位数时,则使用点阵列。
您可以使用整型索引从点阵列集合中访问各项,索引从零开始。
BitArray 类的方法和属性
下表列出了 BitArray 类的一些常用的 属性:
| 属性名称 | 类型 | 描述 |
|---|---|---|
Count | int | 获取 BitArray 中的位数(只读)。 |
Length | int | 获取或设置 BitArray 中的位数(支持动态调整大小)。 |
IsReadOnly | bool | 获取一个值,指示 BitArray 是否为只读(始终为 false)。 |
SyncRoot | object | 获取一个对象,用于同步对 BitArray 的访问。 |
IsSynchronized | bool | 获取一个值,指示对 BitArray 的访问是否同步(线程安全)。 |
Item[int index] | bool | 获取或设置指定索引处的位的值(通过索引器访问)。 |
属性访问:
BitArray bits = new BitArray(8); // 创建 8 位的 BitArray,所有位默认为 false Console.WriteLine(bits.Length); // 输出:8 bits.Length = 10; // 修改长度为 10,新增的位默认为 false
下表列出了 BitArray 类的一些常用的 方法:
| 方法名称 | 返回类型 | 描述 |
|---|---|---|
And(BitArray) | BitArray | 按位与操作,对两个 BitArray 对应位进行与运算,就地修改当前实例并返回当前实例本身。 |
Or(BitArray) | BitArray | 按位或操作,对两个 BitArray 对应位进行或运算,就地修改当前实例并返回当前实例本身。 |
Xor(BitArray) | BitArray | 按位异或操作,对两个 BitArray 对应位进行异或运算,就地修改当前实例并返回当前实例本身。 |
Not() | BitArray | 按位取反操作,将当前实例的每个位取反,就地修改并返回当前实例本身。 |
Set(int index, bool value) | void | 将指定索引处的位设置为指定值(true 或 false)。 |
SetAll(bool value) | void | 将所有位设置为指定值(true 或 false)。 |
Get(int index) | bool | 获取指定索引处的位的值。 |
Clone() | object | 创建当前 BitArray 的浅表副本(复制)。 |
CopyTo(Array array, int index) | void | 将 BitArray 的内容复制到指定的数组,从指定索引开始。 |
Equals(object obj) | bool | 确定指定对象是否等于当前 BitArray。 |
GetEnumerator() | IEnumerator | 返回一个枚举器,用于循环访问 BitArray 中的位。 |
方法使用:
BitArray bits = new BitArray(8, false); // 创建 8 位的 BitArray,初始值全部为 false bits.Set(0, true); // 设置第 0 位为 true Console.WriteLine(bits.Get(0)); // 输出:True bits.SetAll(true); // 将所有位设置为 true
实例
下面的实例演示了点阵列(BitArray)的使用:
BitArray 中索引 0 对应二进制数的最低位,按索引正序遍历得到的位串与日常书写顺序相反,因此下面的实例采用逆向遍历输出。
And()、Or()、Xor() 等方法会就地修改调用它们的实例并返回自身,所以每次运算前都用复制构造函数
new BitArray(ba1)创建副本。
数值 13 的两种位顺序对照
日常书写顺序(高位在前):
0
位7
0
位6
0
位5
0
位4
1
位3
1
位2
0
位1
1
位0
BitArray 索引顺序(索引 0 对应最低位):
1
索引0
0
索引1
1
索引2
1
索引3
0
索引4
0
索引5
0
索引6
0
索引7
同一个数值 13,按索引正序遍历 BitArray 得到的是 1 0 1 1 0 0 0 0,与日常书写顺序正好相反,因此实例中采用逆向遍历输出。
实例
using System;
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
// 初始化两个 BitArray,用于存储二进制位
BitArray ba1 = new BitArray(new byte[] { 60 }); // 60 = 00111100
BitArray ba2 = new BitArray(new byte[] { 13 }); // 13 = 00001101
// 输出 ba1 和 ba2 的内容
Console.WriteLine("Bit array ba1 (60):");
PrintBitArray(ba1);
Console.WriteLine("Bit array ba2 (13):");
PrintBitArray(ba2);
// 进行 AND 操作并输出结果
// And/Or/Xor 会就地修改调用它们的实例,运算前先创建 ba1 的副本
BitArray baAnd = new BitArray(ba1);
baAnd.And(ba2); // 60 & 13 = 12
Console.WriteLine("Bit array after AND operation (12):");
PrintBitArray(baAnd);
// 进行 OR 操作并输出结果
BitArray baOr = new BitArray(ba1); // 再次复制原始的 ba1
baOr.Or(ba2); // 60 | 13 = 61
Console.WriteLine("Bit array after OR operation (61):");
PrintBitArray(baOr);
// 进行 XOR 操作并输出结果
BitArray baXor = new BitArray(ba1); // 继续复制原始的 ba1
baXor.Xor(ba2); // 60 ^ 13 = 49
Console.WriteLine("Bit array after XOR operation (49):");
PrintBitArray(baXor);
Console.ReadKey();
}
// 逆向遍历,使输出符合"高位在前"的书写习惯
static void PrintBitArray(BitArray bitArray)
{
for (int i = bitArray.Length - 1; i >= 0; i--)
{
Console.Write($"{(bitArray[i] ? 1 : 0)} ");
}
Console.WriteLine("\n");
}
}
}
using System.Collections;
namespace CollectionsApplication
{
class Program
{
static void Main(string[] args)
{
// 初始化两个 BitArray,用于存储二进制位
BitArray ba1 = new BitArray(new byte[] { 60 }); // 60 = 00111100
BitArray ba2 = new BitArray(new byte[] { 13 }); // 13 = 00001101
// 输出 ba1 和 ba2 的内容
Console.WriteLine("Bit array ba1 (60):");
PrintBitArray(ba1);
Console.WriteLine("Bit array ba2 (13):");
PrintBitArray(ba2);
// 进行 AND 操作并输出结果
// And/Or/Xor 会就地修改调用它们的实例,运算前先创建 ba1 的副本
BitArray baAnd = new BitArray(ba1);
baAnd.And(ba2); // 60 & 13 = 12
Console.WriteLine("Bit array after AND operation (12):");
PrintBitArray(baAnd);
// 进行 OR 操作并输出结果
BitArray baOr = new BitArray(ba1); // 再次复制原始的 ba1
baOr.Or(ba2); // 60 | 13 = 61
Console.WriteLine("Bit array after OR operation (61):");
PrintBitArray(baOr);
// 进行 XOR 操作并输出结果
BitArray baXor = new BitArray(ba1); // 继续复制原始的 ba1
baXor.Xor(ba2); // 60 ^ 13 = 49
Console.WriteLine("Bit array after XOR operation (49):");
PrintBitArray(baXor);
Console.ReadKey();
}
// 逆向遍历,使输出符合"高位在前"的书写习惯
static void PrintBitArray(BitArray bitArray)
{
for (int i = bitArray.Length - 1; i >= 0; i--)
{
Console.Write($"{(bitArray[i] ? 1 : 0)} ");
}
Console.WriteLine("\n");
}
}
}
当上面的代码被编译和执行时,它会产生下列结果:
Bit array ba1 (60): 0 0 1 1 1 1 0 0 Bit array ba2 (13): 0 0 0 0 1 1 0 1 Bit array after AND operation (12): 0 0 0 0 1 1 0 0 Bit array after OR operation (61): 0 0 1 1 1 1 0 1 Bit array after XOR operation (49): 0 0 1 1 0 0 0 1

C# 集合