1. 程式人生 > 其它 >位域操作

位域操作

typedef struct

uint32_t one:1
uint32_t two:2
uint32_t eight:8
uint32_t :15
uint32_t twenty_five:10;
}myarea;
位域操作,字面上可以看出就是進行位操作,也就是對幾個位元組中的bit進行賦值,這個主要作用就是可以更好利用儲存空間,方便位操作
有一點要注意就上面我們定義的是32位的,所以後面的最大位操作最大也不能超過32
下面就分析一下上面的例子
one佔1個bit
two佔緊跟後2個bit
eight佔8個
接下來無位名,代表填充15個bit不使用
賦值操作,例如想操作第一個bit
就這麼寫 myarea.one=1/0

C語言共同體
typedef union

uint8_t: name;
uint16_t: age;
uint32_t:class;
}myunion;
共同體就是型別變數共用一段儲存空間,空間大小以裡面變數最大的儲存空間為準
上面這個例子中就是class那個變數,所以該共同體佔用的大小就為4個位元組,特別需要注意就是共同體中變數同時只有一個可以有效。也就是你要操作,也只能一個變數的操作。

下面將共同體和上面的位域操作結合起來看一個例子

typedef struct

union PA

uint32_t:all;
struct all_b

uint32_t one:1
uint32_t two:2
uint32_t eight:8
uint32_t :15
uint32_t twenty_five:10;
};

union PB

uint32_t:all;
struct

uint32_t one:1
uint32_t two:2
uint32_t eight:8
uint32_t :15
uint32_t twenty_five:10;
};
}newarea;
這個例子講之前先說下這個例子來由,我們知道微控制器,比方說那32位微控制器來說好了,它的暫存器大多是32位的,有時候我們需要配置相應的位進行操作(位域操作),有時候我們又為了方便乾脆對整個暫存器賦值,為了這兩個賦值區分開來,也就是不要同時賦值,又為了共享儲存空間(union),這時我們就把union和位域操作結合在了一起。
下面落實到我們應用上來,比如我得給微控制器那個one位賦值:
#define PA0_BaseAddr 0x40000000
#define GPIO(*newarea)PA0_BaseAddr
操作PA埠暫存器某一位
GPIO->PA.all_b->one=0/1