返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C#集合之位数组的用法
  • 699
分享到

C#集合之位数组的用法

2024-04-02 19:04:59 699人浏览 安东尼
摘要

如果需要处理的数字有许多位,就可以使用BitArray类和BitVector32结构。BitArray类位于System.Collection,BitVector32结构位于Syst

如果需要处理的数字有许多位,就可以使用BitArray类和BitVector32结构。BitArray类位于System.Collection,BitVector32结构位于System.Collection.Specialized。
这两种类型最重要的区别是,BitArray类可以重新设置大小,如果事先不知道需要的位数,就可以使用BitArray类。BitVector32结构是基于栈的,因此比较快。BitVector32结构仅包含32位,它们存储在一个整数中。

1.BitArray类

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

示例:

    static void BitArrayDemo()
        {
          var bits1 = new BitArray(8);
          bits1.SetAll(true);
          bits1.Set(1, false);
          bits1[5] = false;
          bits1[7] = false;
          Console.Write("initialized: ");
          DisplayBits(bits1);
          Console.WriteLine();
           //int i =      Convert.ToInt32(bits1);


          DisplayBits(bits1);
          bits1.Not();
          Console.Write(" not ");
          DisplayBits(bits1);
          Console.WriteLine();

          var bits2 = new BitArray(bits1);
          bits2[0] = true;
          bits2[1] = false;
          bits2[4] = true;
          DisplayBits(bits1);
          Console.Write(" or ");
          DisplayBits(bits2);
          Console.Write(" : ");
          bits1.Or(bits2);
          DisplayBits(bits1);
          Console.WriteLine();


          DisplayBits(bits2);
          Console.Write(" and ");
          DisplayBits(bits1);
          Console.Write(" : ");
          bits2.And(bits1);
          DisplayBits(bits2);
          Console.WriteLine();

          DisplayBits(bits1);
          Console.Write(" xor ");
          DisplayBits(bits2);
          bits1.Xor(bits2);
          Console.Write(" : ");
          DisplayBits(bits1);
          Console.WriteLine();
        }
        
        static void DisplayBits(BitArray bits)
        {
          foreach (bool bit in bits)
          {
            Console.Write(bit ? 1 : 0);
          }
        }

2.BitVector32结构

如果事先知道需要的位数,就可以使用BitVector32结构代替BitArry类。BitVector32结构效率较高,因为它是一个值类型,在整数栈上存储位。一个整数可以存储32位。如果需要更多的位,可以使用多个BitVector32值或BitArray类。

    //对CreateMask方法的第一个调用来访问第一位的一个掩码
      //调用CreateMask后,bit1被设置为1。再次调用CreateMask方法,把第一个掩码作为参数传递给CreateMask方法,返回来第二位的一个掩码(是2)
      
      var bits1 = new BitVector32();
      int bit1 = BitVector32.CreateMask();     //1
      int bit2 = BitVector32.CreateMask(bit1); //2
      int bit3 = BitVector32.CreateMask(bit2); //4
      int bit4 = BitVector32.CreateMask(bit3); //8
      int bit5 = BitVector32.CreateMask(bit4); //16

      bits1[bit1] = true;
      bits1[bit2] = false;
      bits1[bit3] = true;
      bits1[bit4] = true;
      Console.WriteLine(bits1);

输出:

    //除了用CreateMask方法创建掩码之外,还可以自己定义掩码,也可以一次设置多位。
    //十六进制abcdef与二进制1010 1011 1100 1101 1110 1111相同
    bits1[0xabcdef] = true;
    Console.WriteLine(bits1);

输出:

    //也可以把32位分别放在不同的片段中
      bits1[0xabcdef] = true;
      Console.WriteLine(bits1);


      int received = 0x79abcdef;

      var bits2 = new BitVector32(received);
      Console.WriteLine(bits2);
      //创建6个片段。第一个片段需要12位,有16进制0xfff定义。
      //第一次调用CreateSection方法直接受0xfff,为最前面的12位分配内存。
      //第二次调用CreateSection方法,将第一个片段和偏移量传递
      BitVector32.Section sectionA = BitVector32.CreateSection(0xfff);
      BitVector32.Section sectionB = BitVector32.CreateSection(0xff, sectionA);
      BitVector32.Section sectionC = BitVector32.CreateSection(0xf, sectionB);
      BitVector32.Section sectionD = BitVector32.CreateSection(0x7, sectionC);
      BitVector32.Section sectionE = BitVector32.CreateSection(0x7, sectionD);
      BitVector32.Section sectionF = BitVector32.CreateSection(0x3, sectionE);
    //bits2[sectionA],把一个BitVector32.Section类型的值传递给BitVector32结构的索引器,会返回一个int。IntToBinaryString方法将这个int表示
      Console.WriteLine("Section A: " + IntToBinaryString(bits2[sectionA], true));
      Console.WriteLine("Section B: " + IntToBinaryString(bits2[sectionB], true));
      Console.WriteLine("Section C: " + IntToBinaryString(bits2[sectionC], true));
      Console.WriteLine("Section D: " + IntToBinaryString(bits2[sectionD], true));
      Console.WriteLine("Section E: " + IntToBinaryString(bits2[sectionE], true));
      Console.WriteLine("Section F: " + IntToBinaryString(bits2[sectionF], true));

      
    static string IntToBinaryString(int bits, bool removeTrailingZero)
    {
      var sb = new StringBuilder(32);

      for (int i = 0; i < 32; i++)
      {
        if ((bits & 0x80000000) != 0)
        {
          sb.Append("1");
        }
        else
        {
          sb.Append("0");
        }
        bits = bits << 1;
      }
      string s = sb.ToString();
      if (removeTrailingZero)
        return s.TrimStart('0');
      else
        return s;
    }

输出:

到此这篇关于C#集合之位数组的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: C#集合之位数组的用法

本文链接: https://lsjlt.com/news/145692.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C#集合之位数组的用法
    如果需要处理的数字有许多位,就可以使用BitArray类和BitVector32结构。BitArray类位于System.Collection,BitVector32结构位于Syst...
    99+
    2024-04-02
  • C#集合之不变集合的用法
    如果对象可以改变其状态,就很难在多个同时运行的任务中使用。这些集合必须同步。如果对象不能改变器状态,就很容易在多个线程中使用。Microsoft提供了一个新的集合库:Microsof...
    99+
    2024-04-02
  • C#集合之并发集合的用法
    .NET 4 开始,在System.Collection.Concurrent中提供了几个线程安全的集合类。线程安全的集合可防止多个线程以相互冲突的方式访问集合。为了对集合进行线程安...
    99+
    2024-04-02
  • C#集合之集(set)的用法
    包含不重复元素的集合称为“集(set)”。.NET Framework包含两个集HashSet<T>和SortedSet<T>,它们都...
    99+
    2024-04-02
  • C#集合之可观察集合的用法
    如果需要集合中的元素何时删除或添加的信息,可以使用ObservableCollection<T>类。这个类是为WPF定义的,这样UI就可以得知集合的变化。这个类在程序集W...
    99+
    2024-04-02
  • C#集合之栈的用法
    栈(Stack)和队列是非常类似的一个容器,只是栈是一个后进先出(LIFO)的容器。栈用Push()方法在栈中添加元素,用Pop()方法获取最近添加的一个元素: Stack<...
    99+
    2024-04-02
  • C#集合之列表的用法
    目录1.创建列表2.添加元素3.插入元素4.访问元素5.删除元素6.搜索7.排序8.类型转换9.只读集合.NET Framework为动态列表List提供泛型类List<T&g...
    99+
    2024-04-02
  • C#集合之队列的用法
    队列是其元素按照先进先出(FIFO)的方式来处理的集合。队列使用System.Collections.Generic名称空间中的泛型类Queue<T>实现。在内部,Que...
    99+
    2024-04-02
  • C#集合之链表的用法
    LinkedList<T>是一个双向链表,其元素会指向它前面和后面的元素。这样,通过移动到下一个元素可以正向遍历链表,通过移动到前一个元素可以反向遍历链表。 链表在存储...
    99+
    2024-04-02
  • C#集合之字典的用法
    字典表示一种复杂的数据结构,这种数据结构允许按照某个键来访问元素。字典也称为映射或散列表。字典的主要特性是能根据键快速查找值。也可以自由添加和删除元素,这有点像List<T&g...
    99+
    2024-04-02
  • C#集合之有序列表的用法
    如果需要基于键对所需集合排序,就可以使用SortedList<TKey,TValue>类。这个类按照键给元素排序。这个集合中的值和键都可以使用任何类型。定义为键的自定义类...
    99+
    2024-04-02
  • C#集合之有序列表怎么用
    本文小编为大家详细介绍“C#集合之有序列表怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#集合之有序列表怎么用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。如果需要基于键对所需集合排序,就可以使用Sor...
    99+
    2023-06-30
  • Java集合类之TreeSet的用法详解
    目录上节回顾TreeSet集合概述和特点构造方法方法摘要Demo自然排序Comparable的使用比较器排序Comparator的使用上节回顾 LinkedHashSet集合概述及特...
    99+
    2024-04-02
  • Java C++题解leetcode902最大为N的数字组合数位DP
    目录题目要求阅读理解思路:数位DPJavaC++总结题目要求 题目链接 阅读理解 思路:数位DP Java class Solution { public int a...
    99+
    2022-11-13
    Java C++ 最大为N的数字组合 Java C++ 数位DP
  • java集合与数组的区别
    数组数组是java语言内置的数据类型,他是一个线性的序列,所有可以快速访问其他的元素,数组和其他语言不同。(推荐学习:java课程)当你创建了一个数组时,他的容量是不变的,而且在生命周期也是不能改变的,还有JAVA数组会做边界检查,如果发现...
    99+
    2020-07-07
    java教程 java
  • C语言实现通用数据结构之通用集合(HashSet)
    这是在通用链表的基础上实现的集合,关于链表的实现参见:C语言实现通用数据结构之通用链表 注意集合中只存储了指针,没有储存实际的数据。 对于新的数据类型来说,需要自定义HashCode...
    99+
    2024-04-02
  • php中数组是一组什么的集合
    php中数组是一组有序数据的集合,数组中的每个成员被称为元素,每个元素由一个特殊的标识符来区分,该标识符称为键名(或下标)。PHP数组根据键名的不同,可分为两种:1、以数字作为键名的索引数组;2、以字符串或字符串、数字混合为键名的关联数组。...
    99+
    2022-06-14
    php php数组
  • PHP数组交集和并集与集合论的关系
    在 php 中,数组交集使用 array_intersect() 函数,提取公共元素创建新数组;并集使用 array_merge() 函数,合并多个数组元素到新数组。这与集合论中交集和并...
    99+
    2024-05-03
    php 集合论
  • Java常用集合之Set和Map的用法详解
    目录常用Set集合Set集合的特点HashSet创建对象常用方法遍历常用Map集合Map集合的概述HashMap创建对象常用方法遍历HashMap的key去重原理常用Set集合 Se...
    99+
    2024-04-02
  • Python学习之集合的常用方法总结
    目录什么是集合?集合与列表的区别集合的创建方法集合的增删改add函数update函数remove函数clear函数del方法删除集合关于集合的重要说明获取两个集合交、并、差集的函数d...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作