2009-12-07 65 views
1

我读遍了各地,人们都在逐个比特地讨论压缩对象。比如“前三位表示这样那样的话,接下来的两位代表这个和那个12位”读取/写入压缩的二进制数据

我明白为什么希望尽量减少内存使用量,但我想不出一种好的方法来实现这个。我知道我会把它打包成一个或多个整数(或多个),但我无法想象一个简单的方法来处理它。如果有一个类可以从一个任意长度的二进制字段中获取/设置任意位,那将是非常酷的,并且它会为我处理一些事情,而且我不需要去关注&和|和口罩等。

这种事情有没有标准模式?

回答

3

MSDN

BitArray类

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

例子:

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

BitArray允许您设置只有单个位,虽然。如果你想用更多的位编码值,可能没有办法绕过&和|以及掩码和东西:-)

+0

这似乎接近我所需要的。我总是可以编写自己的包装来填充更大的值。当我将性能与其他选择进行比较时,我会看到会发生什么。 – captncraig 2009-12-07 20:27:34

0

你在找什么叫做按位运算。例如,假设我们将要表示一个整数中最低有效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(有时更奇特的操作),您可以轻松地设置和清除任何个人位的价值较大。

+0

注意:我从来没有在C#中完成过这些工作,所以我的语法可能有点偏离。但它应该足以让你走。 – 2009-12-07 19:00:59

0

而不是使用工具包或平台特定的包装类我认为你最好咬下子弹并学习你的& s和| s和0x04s以及所有的按位运算符是如何工作的。总的来说,这是它为大多数项目所做的工作,并且操作速度非常快。这些操作在大多数语言中几乎完全相同,因此您不会依赖某些特定的工具包。

1

您可能想要查看.NET Framework中的BitVector32结构。它可以让你定义一个int段内的“段”,然后读取和写入这些段的值。

主要限制是它被限制在一个单一的32位整数;这可能会或可能不会成为问题,具体取决于您要做什么。正如dtb所提到的,BitArray可以处理任何大小的位字段,但是一次只能获取和设置一个位 - 不像BitVector32那样支持部分。

+0

+1。不知道BitVector32。 – dtb 2009-12-07 19:45:16