我读遍人们谈论的点点规模对位的压缩对象的地方。喜欢的东西“的前三个位代表如此这般,则接下来的两个代表此和12位为”

我明白为什么它希望尽量减少内存使用情况,但我想不出来实现一个很好的方式。我知道我会打包成一个或多个整数(或多头,等等),但我不能想象一个简单的方法与它合作。这将是很酷如果有,哪儿能找到/从任意长度的二进制字段设置任意位的一类,它会照顾的事情对我来说,我也不会去与和混日子的和|' S和掩模和这样。

是否有这种事情的标准模式?

有帮助吗?

解决方案

MSDN

  

BitArray类

     

管理的位值,这被表示为布尔值,其中true表示该位是上的紧凑阵列(1)和假指示位为关闭(0)。

示例:

BitArray myBitArray = new BitArray(5);
myBitArray[3] = true; // set bit at offset 3 to 1

BitArray允许用户设置仅单个位,虽然。如果你想与更多的位编码值,有可能是周围及瞎没有办法的和|的和面具和东西: - )

其他提示

您可能要检查出 BitVector32 结构在.NET Framework。它可以让你定义“部分”,其是一个int内的比特的范围,则读取和写入值的那些部分。

的主要限制是,它的限制为一个32位的整数;这取决于你想要做什么,这可能是也可能不是一个问题。作为DTB提到,BitArray可以处理任何大小的位字段,但你只能得到和一次设置单个位 - 存在对部分在BitVector32不支持

什么你正在寻找被称为位运算。

例如,假设我们要表示的整数的至少显著24位的RGB值,而R是比特23-16,G为位15-8,和B是7-0位。

可以R SET为0和255之间的任何值,而不会影响其它位是这样的:

void setR(ref int RGBValue, int newR)
{
  int newRValue = newR << 16; // shift it left 16 bits so that the 8 low-bits are now in position 23-16
  RGBValue = RGBValue & 0x00FF; // AND it with 0x00FF so that the top 16 bits are set to zero
  RGBValue = RGBValue | newRValue;   // now OR it with the newR value so that the new value is set.
}

通过使用按位AND和OR(偶尔更奇特的操作)可以很容易地设置和清除较大的值的任何单独的比特。

而不是使用工具或平台特定的包装类,我想你最好还是咬咬牙,学习你的&S和| S和0x04s以及如何将所有的位运算符的工作。总的来说这是其大多数项目如何做的,而操作是非常快的。在操作上大多数语言几乎相同,所以你不会被卡住依赖于一些特定的工具包。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top