結構體的成員可以限制其位域,每個成員可以使用用比位元組還小的取值範圍,下面的結構體s1中,四個成員每個成員都是2bit的值(0~3),整個結構體佔據的空間依然是4個位元組,但是第乙個位元組中表示了四個成員,後續三個位元組沒有用到。
struct s1;
s1.a = 1;
s1.b = 1;
s1.c = 1;
s1.d = 1;
| 低位 ------>>>>>>> 高位 |
| byte 0 || byte 1 || byte 2 || byte 3 |
| 10101010 || 00000000 || 00000000 || 00000000 |
位域限制對於一些非位元組對齊的變數,比較有用。有些標誌位使用幾個個bit就可以表示,這時可以用位域限制。我們以藍芽mesh中的network-pdu為例說明。
ivi只佔了1 bit,nid佔了7bit。我們可以直接用1個位元組表示,然後通過移位運算來表示ivi及nid。也可以使用位域,這樣表示更加直接,與正常的結構體成員一樣。
// 使用位域
struct net_pdu;
net_pdu.ivi = 1;
net_pdu.nid = 123;
// 使用掩碼
struct net_pdu;
net_pdu.ivi_nid |= (1<<7);
net_pdu.ivi_nid = (123) | ((1<<7)&(net_pdu.ivi_nid));
結構體中的位域
位域 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區...
結構體中的位域
位域 有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域,並說明每個區...
結構體中的位域
結構體中的位域 位域有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如在存放乙個開關量時,只有0和1 兩種狀態,用一位二進位即可。為了節省儲存空間,並使處理簡便,c語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域...