在C語言的 struct 結構型態之位元欄(Bit Fields)成員,可定義成各種不同長度的bit位元型態。例如你需要定義16 個可以記錄二進位的 00、01、10、11 四種數值,這時候您就可以使用 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 -- | To the next int boundary |
count | The size of |
ac | 4 bits |
(unnamed | 4 bits |
clock | 1 bit |
(padding -- | To the next int boundary (unnamed field) |
flag | 1 bit |
(padding -- | To the next int boundary |
要存取kitchen 結構之成員,你可以使用”kitchen.”再加上成員名,如要存取 toaster,語法就是 kitchen.toaster 。
接下來是設定 1 給light 欄位的語法:
kitchen.light = 1;
當你設定一個超過位元欄位(Bit Fields)大小的值時,就要依系統而定囉。以下是設定2給toaster 欄位,因為超過數值範圍,結果是以 LSB bit 0設定給 toaster 欄位:
kitchen.toaster = 2; //以 LSB
bit 0設定給 toaster 欄位
ref: reference
IBM : Declaring and Using Bit Fields in Structures
沒有留言:
張貼留言