2012年5月22日 星期二

C語言的struct結構型態之位元欄位(Bit Fields)成員



C語言的 struct 結構型態之位元欄(Bit Fields)成員,可定義成各種不同長度的bit位元型態。例如你需要定義16 個可以記錄二進位的 00011011 四種數值,這時候您就可以使用 struct 結構型態之位元欄(Bit Fields),如此可以節省記憶體空間,且在程式可以以布林運算值直接取用,這樣作也能與硬體觀念中的Flag輕鬆配合使用,讓您的程式與系統及周邊硬體間,可直接以位元運算來做暫存器存取指定喔。





struct結構型態之位元欄位(Bit Fields)成員定義語法:

struct [struct_name]

{

struct_member_declarator

type-specifier [declarator]: constant-expression;

type-specifier [declarator]: constant-expression;

...

struct_member_declarator

}[structVars];





#include

#include

struct on_off

{

  unsigned light : 1;

  unsigned toaster : 1;

  int count;/* 4 bytes */

  unsigned ac : 4;

  //--------------------

  unsigned : 4;

  unsigned clock : 1;

  unsigned : 0;

  unsigned flag : 1;

}kitchen;

int main(int argc, char *argv[])

{

  printf(
"sizeof(kitchen)=%d\r\n" , sizeof(kitchen) );

  system("PAUSE");

return 0;

}





kitchen structure 變數有8個成員,共佔16 bytes 記憶體空間。記憶體配置方式如下:



















































kitchen成員




配置大小




light




1 bit




toaster




1 bit




(padding --
30 bits)




To the next int boundary




count




The size of
an int (4 bytes)




ac




4 bits




(unnamed
field)




4 bits




clock




1 bit




(padding --
23 bits)




To the next int boundary (unnamed field)




flag




1 bit




(padding --
31 bits)




To the next int boundary






要存取kitchen 結構之成員,你可以使用kitchen.”再加上成員名,如要存取 toaster,語法就是 kitchen.toaster

接下來是設定 1 light 欄位的語法:

  kitchen.light = 1;

當你設定一個超過位元欄位(Bit Fields)大小的值時,就要依系統而定囉。以下是設定2toaster 欄位,因為超過數值範圍,結果是以 LSB bit 0設定給 toaster 欄位:


  kitchen.toaster = 2; // LSB
bit 0
設定給 toaster 欄位





 





ref: reference
IBM : Declaring and Using Bit Fields in Structures





沒有留言:

張貼留言

FPGA Verilog 的學習經驗,提供給要入門的新手

今天簡單說說 FPGA Verilog 的學習經驗,提供給要入門的新手: 1.對自己寫的FPGA Verilog程式,所生成的數位電路要心中有數。 這一點個人認為很重要,就正如寫 C語言,心中要能生成對應的組合語言一樣,我是這樣要求自己的。 雖然 FPGA Verilog語言...