如何在.NET 7中使用BitArray

译文
开发 前端
事实表明,利用.NET 7的BitArray类对数据执行逐位操作能够提高性能。

译者 | 李睿

审校 | 孙淑娟

.NET 7中的BitArray类是一个健壮的数据结构,用于存储和操作数据位。BitArray中的每个元素只能保存一个表示为false或true的位(0或1),其中false表示位为off (0), true表示位为on(1)。BitArray可以存储标志或有效地对数据执行按位操作。

本文将讨论在C#中使用BitArray以及相关的代码示例。要使用本文提供的代码示例,应该在系统中安装Visual Studio 2022。

在Visual Studio中创建一个控制台应用程序项目

首先,在Visual Studio中创建一个.NET Core控制台应用程序项目。假设系统中已经安装了Visual Studio 2022,按照下面列出的步骤在Visual Studio中创建一个新的.NET Core控制台应用程序项目。

(1)启动Visual Studio IDE。

(2)点击“创建新项目”。

(3)在“创建新项目”窗口中,从显示的模板列表中选择“控制台应用程序(.NET Core)”。

(4)单击“下一步”。

(5)在接下来显示的“配置新项目”窗口中,指定新项目的名称和位置。

(6)单击“下一步”。

(7)在接下来显示的“附加信息”窗口中,选择“.NET Core预览版)”作为想使用的框架版本。

(8)单击“创建”。

在本文中,将使用.NET7控制台应用程序项目与BitArray一起工作。

什么是BitArray?

BitArray是系统中包含的类型。集合名称空间表示位值的紧凑数组。这些值表示为布尔值,即true和false。在这里,值true表示位是打开的,值false表示位是关闭的。

因为BitArray类位于系统中。集合命名空间,需要在代码中包含该命名空间的采用指令。BitArray类在系统中声明。集合命名空间如下所示:

public sealed class BitArray : ICloneable, System.Collections.ICollection

在.NET 7中创建BitArray

可以创建一个特定大小的BitArray,并用所有错误值填充它,例如下面给出的代码段所示:

var bitArray = new BitArray(10);

还可以传入一个布尔值列表,以创建特定大小的BitArray并设置值。

var bitArray = new BitArray(new bool[] {true, false, true});

一旦创建了BitArray,就可以使用索引器访问和操作每个位。索引器期望一个整数并返回或设置该位的值。

bitArray[0] = true //sets the first bit to true
bitArray[1] = false //sets the second bit to false
bitArray[0] //returns the value of the first bit (as a bool)

下面的代码片段可用于创建BitArray,设置其元素的值,然后检索和显示BitArray中特定索引的值。

BitArray = new BitArray(5);
bitArray [0] = true;
bitArray [1] = false;
bitArray [2] = true;
bitArray [3] = false;
bitArray [4] = false;
Console.WriteLine (bitArray.Get (2));
Console.WriteLine (bitArray.Get (4));

当执行上面的代码段时,值true和false将显示在控制台窗口中,如图1所示:

图1

在BitArray中操作位

可以使用BitArray的索引或使用BitArray类的Get和Set方法来操作BitArray中的位。要从BitArray中设置或检索多个位,可以使用SetAll()和GetAll()方法,如下面的代码片段所示:

bitArray.SetAll(false); //set all bits of the bit array to 0
bitArray.Set(0, true); //set first bit of the bit array to 1
bitArray.Set(1, false); //set the second bit of the bit array to 0
bool result = (bitArray[0] == 1); //verify if first bit is equal to 1

检查BitArray是否只读

如果需要检查BitArray是否是只读的,可以使用IsReadOnly属性。这一属性返回一个布尔值,指示BitArray是否只读。下面的代码片段展示了如何检查BitArray是否是只读的。

BitArray bitArray = new BitArray(new byte[] { 0, 1, 0, 1, 0 });
Console.WriteLine(bitArray.IsReadOnly);

当执行上述代码段时,文本“False”将显示在控制台窗口中。

BitArray中的Length和Count属性

BitArray的Length属性返回数组中的位数。Count属性返回BitArray中true和false值的计数。需要注意,Length属性总是返回数组中的总位数,即使所有位数都为假。换句话说,Length和Count属性将为BitArray显示相同的值。

下面的代码说明了如何获取BitArray的Length和Count。

var bitArray = new BitArray(new bool[] { true, false, true, false });
Console.WriteLine("Length: " + bitArray.Length);
Console.WriteLine("Count: " + bitArray.Count);

当执行上述代码时,输出将类似于图2所示。

图2

可能需要检查BitArray实例是否同步。这可以通过调用实例的IsSynchronized属性来完成,如果BitArray已同步,该属性将返回true,否则返回false。

在BitArray中执行AND, OR和NOT操作

下面的代码清单显示了如何在两个BitArray实例上按位执行AND操作。位与运算如果两个操作数都为true,则返回true (或1),否则返回false。位OR操作如果其中一个或两个操作数都为true则返回true,否则返回false。

var bitArray1 = new BitArray(new bool[] { true, false, true, false, true });
var bitArray2 = new BitArray(new bool[] { true, false, true, true, true });
bitArray1.Set(0, true);
bitArray1.Set(1, false);
bitArray1.Set(2, true);
bitArray1.Set(3, true);
bitArray1.Set(4, false);
bitArray2.Set(0, true);
bitArray2.Set(1, true);
bitArray2.Set(2, false);
bitArray2.Set(3, true);
bitArray2.Set(4, false);
bitArray1.And(bitArray2);
Console.WriteLine("Displaying the elements of bitArray1 after AND operation");
for (int i = 0; i < bitArray1.Count; i++)
{
    Console.Write(bitArray1[i] + "\t");
}

当执行上述代码时,bitArray1的每个元素的值将在AND操作之后显示出来。

图3

要在两个Bitarray上执行按位OR操作,只需将AND操作符替换为前面示例中的OR操作符。换句话说,用bitArray1.Or(bitArray2)替换bitArray1.And(bitArray2)。

var bitArray1 = new BitArray(new bool[] { true, false, true, false, true });
var bitArray2 = new BitArray(new bool[] { true, false, true, true, true });
bitArray1.Set(0, true);
bitArray1.Set(1, false);
bitArray1.Set(2, true);
bitArray1.Set(3, true);
bitArray1.Set(4, false);
bitArray2.Set(0, true);
bitArray2.Set(1, true);
bitArray2.Set(2, false);
bitArray2.Set(3, true);
bitArray2.Set(4, false);
bitArray1.Or(bitArray2);
Console.WriteLine("Displaying the elements of bitArray1 after OR operation");
for (int i = 0; i < bitArray1.Count; i++)
{
    Console.Write(bitArray1[i] + "\t");
}

对BitArray执行NOT操作会将所有true元素更改为false,反之亦然。下面的代码片段将把BitArray1的元素从{true, false, false, true, false}更改为{false, true, true, false, true}。

bitArray1.Not ();

BitArrays的常见用例

BitArray有许多常见的用例,例如用于执行对图像的按位操作。图像中每个像素的颜色由一定数量的位来定义。改变像素的颜色需要操纵组成它的比特。使用BitArray,可以很容易地操作数组中的各个位。

BitArray也常用于处理网络数据包。数据包包含大量的数据,根据协议的不同,这些数据可能被格式化为位或字节。可以使用BitArray轻松地提取和操作每个包中包含的位。

还可以在应用程序中使用BitArray来表示布尔值。通过这样做,可以减少内存和存储需求。BitArray占用的空间是bool类型的1/8,因为BitArray对每个值只存储1位。此外,一个字节只能保存8个值,一个整数只能保存32个值,而BitArray可以保存任意数量的布尔值。如果要存储大量的数据,这种差异可能会非常显著。

最后,当涉及到处理一个巨大的集合时,一旦开始从内存中获取数据,BitArray和位处理的优势就会变得很明显。例如,包含10000项的BitArray和包含10000项的List在性能上会有显著差异。List需要的内存读取量是BitArray的8倍。

原文标题:How to use BitArray in .NET 7​,作者:Joydip Kanjilal

责任编辑:华轩 来源: 51CTO
相关推荐

2021-03-09 07:27:40

Kafka开源分布式

2021-03-17 09:45:31

LazyCacheWindows

2021-02-02 16:19:08

Serilog日志框架

2021-02-06 21:40:13

SignalR通讯TypeScript

2021-01-07 07:39:07

工具接口 Swagger

2021-03-10 09:40:43

LamarASP容器

2021-01-28 22:39:35

LoggerMessa开源框架

2009-01-19 09:14:31

.NETMySQLMySql驱动包

2021-02-28 20:56:37

NCache缓存框架

2021-02-03 13:35:25

ASPweb程序

2021-01-31 22:56:50

FromServiceASP

2021-03-03 22:37:16

MediatR中介者模式

2021-02-07 17:29:04

监视文件接口

2019-09-04 19:32:56

HiveFlink大数据

2017-03-09 13:26:33

2010-11-18 08:46:27

ASP.NET MVC

2009-02-05 14:02:46

SmtpMail发送邮件ASP.NET

2022-08-01 08:00:00

开发工具跟踪侦听器

2019-08-26 09:20:29

Windows 10虚拟桌面Windows

2009-03-30 10:34:03

ASP.NETMySQL
点赞
收藏

51CTO技术栈公众号