1. 程式人生 > >結構體中的位域

結構體中的位域

位域  有些資訊在儲存時,並不需要佔用一個完整的位元組, 而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有01 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,C語言又提供了一種資料結構,稱為位域位段。所謂位域是把一個位元組中的二進位劃分為幾個不同的區域,並說明每個區域的位數。每個域有一個域名,允許在程式中按域名進行操作。 這樣就可以把幾個不同的物件用一個位元組的二進位制位域來表示。一、位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:  struct 位域結構名  { 位域列表 };

  其中位域列表的形式為: 型別說明符 位域名:位域長度  例如:

struct bs
{
 int a:8;
 int b:2;
 int c:6;
};

  位域變數的說明與結構變數說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:

struct bs
{
 int a:8;
 int b:2;
 int c:6;
}data;

  說明databs變數,共佔兩個位元組。其中位域a8位,位域b2位,位域c6位。對於位域的定義尚有以下幾點說明:  1. 一個位域必須儲存在同一個位元組中,不能跨兩個位元組。如一個位元組所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:

struct bs
{
 unsigned a:4
 unsigned :0 /*
空域*/
 unsigned b:4 /*從下一單元開始存放*/
 unsigned c:4
}

  在這個位域定義中,a佔第一位元組的4位,後4位填0表示不使用,b從第二位元組開始,佔用4位,c佔用4位。  2. 由於位域不允許跨兩個位元組,因此位域的長度不能大於一個位元組的長度,也就是說不能超過8位二進位。  3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:

struct k
{
 int a:1
 int :2 /*2位不能使用*/
 int b:3
 int c:2
};

  從以上分析可以看出,位域在本質上就是一種結構型別, 不過其成員是按二進位分配的。  二、位域的使用  位域的使用和結構成員的使用相同,其一般形式為: 位域變數名·
位域名 位域允許用各種格式輸出。

main(){
 struct bs
 {
  unsigned a:1;
  unsigned b:3;
  unsigned c:4;
 } bit,*PBit;
 bit.a=1;
 bit.b=7;
 bit.c=15;
 printf("%d,%d,%d/n",bit.a,bit.b,bit.c);
 PBit=&bit;
 PBit->a=0;
 PBit->b&=3;
 PBit->c|=1;
 printf("%d,%d,%d/n",PBit->a,PBit->b,PBit->c);
}

  上例程式中定義了位域結構bs,三個位域為a,b,c。說明了bs型別的變數bit和指向bs型別的指標變數PBit。這表示位域也是可以使用指標的。  程式的91011三行分別給三個位域賦值。( 應注意賦值不能超過該位域的允許範圍)程式第12行以整型量格式輸出三個域的內容。第13行把位域變數bit的地址送給指標變數PBit。第14行用指標方式給位域a重新賦值,賦為0。第15行使用了複合的位運算子"&=", 該行相當於: PBit->b=PBit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進位制值為3)。同樣,程式第16行中使用了複合位運算"|=", 相當於: PBit->c=PBit->c|1其結果為15。程式第17行用指標方式輸出了這三個域的值。
 

相關推薦

C語言利用共用結構實現操作

編寫過51(MCU)程式的同學都知道51架構的MCU支援位操作,這是一個很方便的特性,在讀取/修改暫存器某位的值時非常方便快捷。但其他架構的MCU大多都不支援該特性,即不支援位操作,所在在對暫存器中某一位進行操作的時候都是and/or兩個操作共同使用,在編寫程式時非常麻煩。

iOS使用結構,大小端資料轉換

如何在iOS中使用結構體資料型別 在定義結構體時,如果不涉及到OC中的物件時,可以直接將結構體當作成員變數屬性使用,一旦在結構中定義了OC中的物件,編譯會報錯,提示“ARC時禁止在結構體中定義OC的物件”,主要原因在於ARC無法管理結構體中的OC物件的生命週期以

結構

C 結構體 C 陣列允許定義可儲存相同型別資料項的變數,結構是 C 程式設計中另一種使用者自定義的可用的資料型別,它允許您儲存不同型別的資料項。 結構用於表示一條記錄,假設您想要跟蹤圖書館中書本的動態,您可能需要跟蹤每本書的下列屬性: Title Author

C語言結構

有些資訊在儲存時,並不需要佔用一個完整的位元組, 而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,C語言又提供了一種資料

C語言結構冒號()用法

位域出現的原因是由於某些資訊的儲存表示只需要幾個bit位就可以表示而不需要一個完整的位元組,同時也是為了節省儲存空間和方便處理。   typedef struct  bit_struct {     int &n

結構定義變數時,出現冒號+數字的形式(定義)

該種形式出現於結構體或共用體的定義中,是位域定義的標準形式。其使用方式為struct name{type var_name : n;};含義為,在結構體name彙總,成員變數var_name佔用空間為n位。n為正整數,其值必須小於type型別佔用的位數。比如type如果是int,佔4位元組32位,那麼n必須是

結構

位域  有些資訊在儲存時,並不需要佔用一個完整的位元組, 而只需佔幾個或一個二進位制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省儲存空間,並使處理簡便,C語言又提供了一種資料結構,稱為“位域”或“位段”。所謂“位域”是把一個位元組中的二進位劃分為幾個不同的區域,並說明每個區域

結構

z指定的位數決定了結構體變數d的大小,當z:29時,佔用4個位元組,共32位;當z:32時,需要使用8個位元組,佔用35位,自動補齊。一個int型佔用4個位元組。 #include <iostream> #include <stdio.h> usi

linux程序task_struct結構的state

談到task_struct結構體,可以說她是linux核心原始碼中最複雜的一個結構體了,成員之多,佔用記憶體之大。 鑑於她的複雜,我們不能簡單的褻瀆,而是要深入“窺探”. 下面先介紹這些複雜成員中的一員,state域 struct task_struct {    volatile long state

Linux環境task_struct結構的各個欄的含義

task_struct結構體 欄位介紹 Linux核心通過一個被稱為程序描述符的task_struct結構體來管理程序, task_struct是Linux中的【程序控制塊PCB結構】的具體資料結構 這個結構體包含了一個程序所需的所有資訊。它定義在linu

unity利用反射遍歷類或者結構的每一個欄屬性 、型別 、值

C#利用反射遍歷類或者結構體中的每一個欄位的屬性 型別 值 using System.Collections; using System.Collections.Generic; using U

結構定義

在工作中,經常遇到按位(bit)定義結構體 的情況。由於一個位元組有8個位,這時,程式設計師往往對bit的位置產生困惑。現在給出一個例子,來說明位的定義次序。 #pragma pack(push,1) typedef struct ST_TEST { unsigned

task_struct結構介紹--Linux的PCB

(1) volatile long states; 表示程序的當前狀態: ? TASK_RUNNING:正在執行或在就緒佇列run-queue中準備執行的程序,實際參與程序排程。 ? TASK_INTERRUPTIBLE:處於等待佇列中的程序,待資源有效時喚醒,也可由其它程序通過訊號(signal)或定時中

在C語言結構添加成員函數

我們 pau 打印 log print class 控制 stdio.h 語言   我們在使用C語言的結構體時,經常都是只定義幾個成員變量,而學過面向對象的人應該知道,我們定義類時,不只是定義了成員變量,還定義了成員方法,而類的結構和結構體非常的相似,所以,為什麽不想想如何

c語言的特殊符號(結構

結合 特殊 value -s height 間接尋址 出現 span size  在“結構”中出現的->運算符成為“右箭頭選擇”,可以用new_node->value = 10;來代替(*new_code).value = 10;即運算符->是運算符*和運

golang 結構的匿名接口

imp -i pil win CA git Go mean others golang 結構體中的匿名接口 代碼示例 golang 中,可以給結構體增加匿名field,可參考 unknwon 大神的書。 匿名字段和內嵌結構體 但,golang同時也可以給結構體定義一個匿名i

C語言中free()函數釋放struct結構的規律

void poi inf clu main 圖片 刪除 動態分配 不同 並不是什麽新鮮的事情,不過值得註意。首先我們知道,在使用struct來定義並聲明一個變量時,將會自動劃分出一個連續的儲存空間(雖然根據某些對齊原則會出現內存間隙,但是大體上來說還是連續的)這一塊連續空間

OpencvMat結構元素的獲取與賦值

【OpenCV3影象處理】Mat中元素的獲取與賦值 ( 對比.at<>()函式 和 .ptr<>()函式) 2017年04月12日 10:08:55 閱讀數:7542 標籤: opencvopencv3 更多 個人分類:&nbs

結構運算子的過載

C++中,結構體是無法進行==,>,<,>=,<=,!=這些操作的,這也帶來了很多不方便的地方,尤其是在使用STL容器的時候,如果我們可以往語句中傳入結構體,一些事情將會變得很簡單。 比如二分查詢,binary_crearch只能對陣列進行查詢,如果是結構

C++組合(聚合)與C結構包含函式

C++組合(聚合)與C結構體中包含函式 今天突然想到C++的聚合,以前一直沒有注意,今天想到就寫下來,做個筆記; C++的類與我們的C語言中的結構體特別像,但是有有些不太一樣,這裡不多累贅了不能,大家學過的都知道。 C++組合(聚合) 我們知道的都是C++的類的物件,