簡體   English   中英

C ++ bool數組為bitfield?

[英]C++ bool array as bitfield?

假設我需要在結構中存儲8個bool,但是我想一起使用它們只有1個字節,那么我可以這樣做:

struct myStruct {
    bool b1:1;
    bool b2:1;
    bool b3:1;
    bool b4:1;
    bool b5:1;
    bool b6:1;
    bool b7:1;
    bool b8:1;
};

有了這個我可以做的事情

myStruct asdf;
asdf.b3=true;
asdf.b4=false;
if(asdf.b1)
    ...

到目前為止這是正確的嗎? (我實際上並不知道,我之前從未使用過bitfields)

好的 - 但是也可以創建一個8個bool的靜態數組,這樣它們只能使用8位但是我仍然可以通過索引來加入它們嗎?

就像是

struct myStruct {
public:
    bool b[8]:8;
};

也許? (有了這個,我得到一個錯誤C2033)

謝謝您的幫助!

我建議使用std::bitset這樣你就可以簡單地聲明:

std::bitset<8> asdf;

並與[]一起使用。

asdf[0] = true;
asdf[3] = false;

您是否寧願使用byte數據類型一次保存所有內容? 然后你只需要使用邏輯ANDOR來獲取/放入內容。 不需要struct

出於各種原因,我認為這不是一個好主意 - 你基本上試圖復制vector<bool>的行為,這已被證明不是一個好主意 如果您只是為了節省內存而嘗試這樣做,我不會打擾。 訪問各種bool並從位字段中提取它們的開銷可能比你保存的小內存高很多,除非你受到內存限制的極大限制。

要回答你的直接問題,如果你想做bool / bitfield事情,你將不得不使用你的第一種方法。

通常,當你必須處理硬件寄存器並試圖建模硬件寄存器或實際訪問硬件寄存器之后,使其看起來像存儲器位置並疊加位字段時,合法和可接受的用途是bitfield / bit twiddling方法寄存器上的結構。

您可以讓編譯器按照您的意願執行操作,但遺憾的是它不是必需的。 例如,即使一個接受上述內容的好編譯器也可能最終為myStruct對象分配一個完整的32位字。

如果您有選項,並且您希望對類型以及它們的對齊和分配方式進行控制,那么您應該考慮使用Ada。 例如,以下在Ada中工作得很好:

type Bit_Set is array (1..8) of Boolean;
for Bit_Set'size use 8;

High_Mask : constant Bit_Set := (1..7 => false, 8 => true);

...現在你有一個單字節的位掩碼,以及與它一致的運算符“和”,“或”,“xor”等。

暫無
暫無

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

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