2009-12-07 68 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