当前位置:首页 > C#编程 > C#/.net框架 > 正文内容

C#的位数组BitArray

Jorge2年前 (2022-05-09)C#/.net框架665

 

引言:

使用这个BitArray是为了方便操作位,在操作IO卡或者运动卡的IO函数的时候,往往返回一个short值,然后需要转二进制后对其中的位进行操作,这个时候BitArray就方便了。


C#位数组

一、引言


如果我们着重处理一个以位为单位的数据时,就可以考虑使用位数组。例如在很多PCI的IO卡中涉及很多的I位的读取以此判断各个开关量的状态,或者设置继电器输出状态时,就会频繁用到位的操作。


这种情况C#提供的BitArray类和BitVectro32类就会起到很大的作用。本篇文章先讲解BitArray类。


二、BitArray类基础


1、BitArray类在命名空间System.Collections中可以找到。


2、BitArray类可以重新设置大小,BitVector32不会,它是固定32位的。


3、BitArray类是一个引用类型,它包含一个int数组,其中每32位使用一个

新整数,所以它的长度是可变的。例如如果BitArray存储的是63位的数 据,就会被存在两个int数据组成的数组中。因为63=32(int)+31(int)其中第二个int只使用了31位。如果BitArray存储的是65位的数据,就会被存在三个int数据组成的数组中,其中第三个int只使用了其中的1位,因为65=32(int)+32(int)+1(int)。


三、BitArray类常用方法

C#
public sealed class BitArray : ICollection, IEnumerable, ICloneable{
    public BitArray(BitArray bits); //用已有的BitArray给新的BitArray初始化
    
    public BitArray(bool[] values); //用布尔数组初始化
    
    public BitArray(byte[] bytes);  //用字节数组初始化
    
    public BitArray(int length);    //初始化并设置位数值,此值会在使用中自动增长
    
    public BitArray(int[] values);  //用int数组初始化
    
    public BitArray(int length, bool defaultValue); //初始化并设置默认值
    
    public int Count { get; }   //位数组中现存的位的个数
    
    public bool IsReadOnly { get; } //确定位数组是否只读

    public bool IsSynchronized { get; } //是否同步对此BitArray的操作,用在线程安全上
    
    public int Length { get; set; }   //位数组的位数

    public object SyncRoot { get; }
    
    public bool this[int index] { get; set; } //索引器,利用索引读位值
    
    public BitArray And(BitArray value);  //按位与

    public object Clone();  //创建BitArray 的浅表副本。
    
    public void CopyTo(Array array, int index);  //将BitArray拷贝到其他数组中
    
    public bool Get(int index);    //按下标读取位值

    public IEnumerator GetEnumerator(); //返回循环访问BitArray 的枚举数

    public BitArray Not();  //按位非

    public BitArray Or(BitArray value);  //按位或
    
    public void Set(int index, bool value);  //按位设置值
    
    public void SetAll(bool value); //设置所有位为指定值

    public BitArray Xor(BitArray value);  //按位异或}

四、BitArray实例

C#
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Text.RegularExpressions;using System.Threading.Tasks;using System.Collections;using System.Diagnostics;using System.Collections.Specialized;namespace TESTT{
    class Program
    {
        static void DisplayBit(string tag,BitArray bits) //将位数组输出
        {
            if(tag!="")
                Console.Write(tag+":");
            foreach (bool b in bits)
            {
                Console.Write(b?1:0);  
            }
            Console.WriteLine();
        }
        static void Main(string[] args)
        {
            var bits = new BitArray(8);  //创建一个8位的位数组

            //设置全部位
            bits.SetAll(true);
            DisplayBit("设置全部为true后",bits);

            //设置指定位
            bits.Set(1,false);
            DisplayBit("设置下标1为false后",bits);

            //按索引器设置
            bits[5] = false;
            DisplayBit("设置下标5为false后", bits);

            //Not取反运算
            bits.Not();
            DisplayBit("bits取反后", bits);

            //更改位数组的长度
            bits.Length = 16;
            bits[9] = true;
            DisplayBit("设置下标9为false后", bits);

            //新建
            var bits2 = new BitArray(bits);
            bits2[0] = true;
            bits2[2] = true;
            bits2[4] = true;
            bits2[6] = true;
            bits2[8] = true;
            bits2[10] = true;
            bits2[12] = true;

            //Or或运算
            DisplayBit("", bits);
            Console.Write(" or");
            DisplayBit("", bits2);
            Console.Write("=");
            bits.Or(bits2);
            DisplayBit("", bits);

            //And运算
            DisplayBit("", bits);
            Console.Write(" and");
            DisplayBit("", bits2);
            Console.Write("=");
            bits.And(bits2);
            DisplayBit("", bits);

            //Xor运算
            DisplayBit("", bits);
            Console.Write(" xor");
            DisplayBit("", bits2);
            Console.Write("=");
            bits.Xor(bits2);
            DisplayBit("", bits);

            Console.ReadKey();
        }
    }
  }




————————————————

版权声明:本文为CSDN博主「夏威夷紫菜」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/weixin_40786497/article/details/104166424


扫描二维码推送至手机访问。

版权声明:本文由7点博客发布,如需转载请注明出处。

本文链接:http://6dot.cn/?id=95

标签: .NET.NET框架
分享给朋友:

“C#的位数组BitArray” 的相关文章

计算代码执行时间,可以精确到十亿分之一秒

计算代码执行时间,可以精确到十亿分之一秒

注:.Net的Stopwatch类可以精确到1/10000毫秒, 有没有更精确的计时吗?见下面的代码。暂时没试过效果,大家可以试下。计算某个代码片段的执行时间,精确到CPU执行一条指令所用的时间(十亿分之一秒),可用于精确计算某个算法的执行时间。 代码:C#using Syste...

C#:多进程开发,控制进程数量

C#:多进程开发,控制进程数量

正在c#程序优化时,如果多线程效果不佳的情况下,也会使用多进程的方案,如下:C#System.Threading.Tasks.Task task=System.Threading.Tasks.Task.Factory.StartNew(     &...

关于C#项目引用的一点经验

关于C#项目引用的一点经验

关于项目引用,有几种:(一)这种是引用系统的程序集(二)下面这种是引用你自己的项目“解决方案”(三)最后一种是浏览本机上的项目的dll。对于工程中有几十个项目的软件来说,虽然使用(二)是很方便。但是会编译速度奇慢,而且随着项目越多越慢。貌似他run之前都会把所有项目都试图更新一下。勇哥宿舍的电脑,实...

c#——表达式树在LINQ动态查询

c#——表达式树在LINQ动态查询

一般如果逻辑比较简单,只是存在有的情况多一个查询条件,有的情况不需要添加该查询条件简单方式这样操作就可以了C#public IQueryable<FileImport> DynamicChainedSyntax (IQueryable<FileImport&g...

C# 查询运算符测试

C# 查询运算符测试

测试一下全部的查询运算符。每天测试一部分,代码会持续更新中……C#using System;using System.Collections;using System.Collections.Generic;using System.Linq;using&nb...

C# 异步和等待,async/await

C# 异步和等待,async/await

 首先,重点是:异步将从根本上改变大多数代码的编写方式。是的,我相信 async/await 会比 LINQ 产生更大的影响。理解异步将在短短几年内成为基本必需品。关键字介绍让我们直接开始吧。我将使用一些稍后将阐述的概念——请继续阅读第一部分。异步方法看起来像这样:public ...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。