我读到了人们谈论逐点压缩对象的地方。像“前三位代表这样的东西,然后接下来的两个代表这个和12位代表”
我理解为什么最好尽量减少内存使用量,但我想不出一个实现它的好方法。我知道我会将它打包成一个或多个整数(或多头,无论如何),但我无法想象一个简单的方法来使用它。如果有一个类我可以从任意长度的二进制字段中获取/设置任意位,这将是非常酷的,它会照顾我的事情,而且我不必去讨论& s和|和面具等。
这种事情是否有标准模式?
答案 0 :(得分:3)
来自MSDN:
BitArray Class
管理一个紧凑的位值数组,表示为布尔值,其中true表示该位为on(1),false表示该位为off(0)。
示例:
BitArray myBitArray = new BitArray(5);
myBitArray[3] = true; // set bit at offset 3 to 1
BitArray允许您仅设置单个位。如果你想用更多的位编码值,那么可能无法用&和s和掩码和东西进行混淆: - )
答案 1 :(得分:1)
您可能想要查看.NET Framework中的BitVector32结构。它允许您定义“部分”,这些部分是int中的位范围,然后读取和写入这些部分的值。
主要限制是它仅限于一个32位整数;这取决于你想要做什么,这可能是也可能不是问题。正如dtb所提到的,BitArray可以处理任何大小的位字段,但是你一次只能获得和设置一个位 - 不像BitVector32那样支持各个部分。
答案 2 :(得分:0)
您正在寻找的内容称为按位操作。
例如,假设我们将在整数的最低有效24位中表示RGB值,其中R为23-16位,G为15-8位,B为7-0位。
您可以将R设置为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(偶尔使用更奇特的操作),您可以轻松设置和清除任何较大值的单个位。
答案 3 :(得分:0)
我认为你最好不要使用工具包或平台特定的包装类,而是学习你的&amp; s和| s和0x04以及所有按位运算符的工作方式。总的来说,它是如何为大多数项目完成的,而且操作非常快。在大多数语言中,操作几乎完全相同,因此您不会依赖某些特定的工具包。