现在位置: 首页 > C# 教程 > 正文

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将指定索引处的位设置为指定值(truefalse)。
SetAll(bool value)void将所有位设置为指定值(truefalse)。
Get(int index)bool获取指定索引处的位的值。
Clone()object创建当前 BitArray 的浅表副本(复制)。
CopyTo(Array array, int index)voidBitArray 的内容复制到指定的数组,从指定索引开始。
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# 集合