C# 点阵列(BitArray)

C# 集合 C# 集合

BitArray 是 C# 中用于表示一组位(bit)值的集合。

BitArray 属于 System.Collections 命名空间,主要用于处理二进制数据或进行位操作。

相比使用布尔数组(bool[]),BitArray 更加高效,因为它以紧凑的方式存储每个位。

BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示。

true 表示位是开启的(1),false 表示位是关闭的(0)。

当您需要存储位,但是事先不知道位数时,则使用点阵列。

您可以使用整型索引从点阵列集合中访问各项,索引从零开始。

BitArray 类的方法和属性

下表列出了 BitArray 类的一些常用的 属性:

属性名称类型描述
Countint获取 BitArray 中的位数(只读)。
Lengthint获取或设置 BitArray 中的位数(支持动态调整大小)。
IsReadOnlybool获取一个值,指示 BitArray 是否为只读(始终为 false)。
SyncRootobject获取一个对象,用于同步对 BitArray 的访问。
IsSynchronizedbool获取一个值,指示对 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");
        }
    }
}

当上面的代码被编译和执行时,它会产生下列结果:

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# 集合 C# 集合