如果需要处理的数字有许多位,C# 7为此提供了二进制字面量和数字分隔符。处理二进制数据时,还可以使用BitArray类和BitVector32结构。BitArry类位于名称空间System.Collections中,BitVector32结构位于名称空间System.Collections.Specialized中。这两种类型最重要的区别是,BitArray类可以重新设置大小,如果事先不知道需要的位数,就可以使用BitArray类,它可以包含非常多的位。BitVector32结构是基于栈的,因此比较快。BitVector32结构仅包含32位,它们存储在一个整数中。
BitArray类
BitArray类是一个引用类型,它包含一个int数组,其中每32位使用一个新整数。这个类的成员如下表所示。
注:按位运算符,它可以用于数字类型(如byte、short、int和long)。BitArray类具有类似的功能,但是可以用于不同数量的位,而不是用于C#类型。
BitArraySample使用如下名称空间:
System
System.Collections
System.Text
扩展方法GetBitFormat()遍历BitArray,根据位的设置情况,在控制台上显示1或0。为了获得更好的可读性,每4位添加一个分隔符:
using System;
using System.Collections;
using System.Text;
namespace 处理位的集合
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
}
}
public static class BitArrayExtensions
{
public static string GetBitsFormat(this BitArray bits)
{
var str = new StringBuilder();
for (int i = bits.Length - 1; i >= 0; i--)
{
str.Append(bits[i] ? 1 : 0);
if (i != 0 && i % 4 == 0)
{
str.Append("_");
}
}
return str.ToString();
}
}
}
说明BitArray类的示例创建了一个包含9位的数组,其索引是0~8。SetAll()方法把这9位都设置位true。接着Set()方法把对应于1的位设置为false。除了Set()方法之外,还可以使用索引器,例如,下面的第5个和第7个索引:
static void Main(string[] args)
{
var bits1 = new Bit