C struct中的位域 bitfield

2022-07-12 13:45:20 字數 881 閱讀 4767

結構體的成員可以限制其位域,每個成員可以使用用比位元組還小的取值範圍,下面的結構體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語言又提供了一種資料結構,稱為 位域 或 位段 所謂 位域 是把乙個位元組中的二進位劃分為幾個不同的區域...