簡體   English   中英

如何在C ++中存儲位數組?

[英]How to store a bit-array in C++?

在C ++中存儲位數組的最佳方法是什么(沒有Boost,只是標准容器),例如,表示卷分配位圖?

我認為std::vector<bool>是一個好主意,但顯然它是邪惡和棄用的 ,所以有更好的選擇嗎?

也:

如果我在內存中有一個字節數組,我該如何將它們復制到推薦的容器中?
(我無法為vector<bool>找出這個。)

只是張貼這6個年后為后人:像說的評論者之一,我來到了,它是完全正常使用的結論std::vector<bool>作為自己的特殊類型。 你唯一需要注意的是不要把它當成標准的bool容器,因為它不是。

一個char數組,然后由0x1屏蔽將作為一個位數組。

例:

char bitarray[4]; // since 4*8 this array actually contains 32 bits

char getBit(int index) {
    return (bitarray[index/8] >> 7-(index & 0x7)) & 0x1;
}

void setBit(int index, int value) {
    bitarray[index/8] = bitarray[index/8] | (value & 0x1) << 7-(index & 0x7);
}

當然這些操作通常比較慢,但如果記憶是一個問題,這是一個不錯的方式。 我為此選擇了char,以減少所需的班次。 但是整數可能仍然更快。

對於vanilla C ++,有std :: bitset。

Bitset非常類似於vector(也稱為bit_vector):它包含一組位,並提供對每個位的恆定時間訪問。 bitset和vector之間有兩個主要區別。 首先,不能更改位集的大小:bitset的模板參數N(指定位集中的位數)必須是整數常量。 其次,bitset不是Sequence; 事實上,它根本不是STL容器。

Matt Austern有一篇關於它的使用的好文章。

另外 :如果您的字節數組(位數組?)適合無符號長整數,那么您可以直接將其分配給std :: bitset:

unsigned long myByteArray = 0xABCD;
std::bitset<32> bitten( myByteArray );

功能強大的C /С++位陣列庫: https//github.com/noporpoise/BitArray

我認為你鏈接到的網站上的一些觀點順便說一下是不正確的。 在幾乎每台計算機上,一個字母的大小實際上是一個字節(與字符相同),因為計算機只能在一個字節內寫入一個字節而不是一個字節(如果可以,那么你只能擁有目前有八分之一的尋址空間帶字節)

我只需要為您的向量使用一個字節,因為它可以讓其他閱讀代碼的人更好地了解應用程序的內存占用情況。

Ram在現代計算機中非常豐富,因此您可以使用更大的整數類型,但實際上您不能小於一個字節。

要將數據從一個容器復制到另一個容器,請首先為容器創建一個迭代器

vector :: iterator myItr = myVector.begin()

並使用while循環或for循環遍歷向量,直到myItr到達myVector.end()。

例如

for(vector<bool>::iterator myItr = myVector.begin(); myItr<myVector.end(); ++myItr)
{
   otherContainer.append(*myItr);
}

只要您的位數組具有固定大小, std :: bitset就可以。
作為旁注,還有std :: dynamic_bitset,但我並非100%確定它已成為標准。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM