在C#

时间:2016-08-03 14:16:01

标签: c# .net bit

  约瑟夫·阿尔巴哈里和本·阿尔巴哈里(奥莱利)在果壳中的C#6.0。

     

版权所有2016 Joseph Albahari和Ben Albahari,978-1-491-92706-9。

在第312页介绍了BitArrays作为.NET提供的集合类型之一:

  

BitArray

     

BitArray是一个动态大小的压缩bool值集合。   它比一个简单的bool数组和一个更高的内存效率   generic bool列表,因为它对每个值只使用一位,   而bool类型则为每个值占用一个字节。

当您只对二进制值感兴趣时,有可能声明一个位集合而不是使用字节,但是如果声明单个位字段呢?

像:

public class X
{
    public [bit-type] MyBit {get; set;}
}

.NET不支持吗?

关于触摸的现有帖子,主题是关于设置单个位,最终是字节变量。我问,一旦.NET想到支持使用位变量,如果它还支持声明非集合这样的变量。

2 个答案:

答案 0 :(得分:3)

所以你的问题是.NET是否支持这个。答案是否定的。

为什么呢?从根本上说,有这样一个功能是可能的。但需求非常低。最好将开发人员的时间投入其他地方。

如果要在字节粒度以下使用内存,则需要自己构建。 BitArray不是运行时固有的。它操纵一些更大类型的位(我认为它是基于int)。你可以做同样的事情。

BitVector32是一个内置结构,可用于单独寻址32位。

答案 1 :(得分:1)

正如您在.Net reference中所看到的,BitArray在内部将值存储在Array int

public BitArray(int length, bool defaultValue) {
    ...
    m_array = new int[GetArrayLength(length, BitsPerInt32)];
    m_length = length;

    int fillValue = defaultValue ? unchecked(((int)0xffffffff)) : 0;
    for (int i = 0; i < m_array.Length; i++) {
        m_array[i] = fillValue;
    }

    _version = 0;
}

因此,使用BitArray分配的最少内容已经是引用的整个int,如果将数据存储在其中则更多。这也是有意义的,因为用于寻址任何内容的存储器已经在数据字中。这些 - 取决于架构 - 至少已经有4个字节。

您当然可以为要存储的单个位定义自己的类型,但这也至少需要一个字节 - 如果不是完整的字和由于作为引用类型的字节 - 就这样做。操作系统根据内存地址将内存分配给程序,内存地址通常用于寻址字节,因此任何不足都不是完全有用的。

需要存储大量的二进制值,甚至可以通过首先使用类型来弥补已经丢失的空间,因此这种存储位技术的唯一真正有用的应用就是当你使用它时得到了很多,所以你可以获得8:1的内存比率。