在嵌入式程式設計的時候,比如對晶元的某個暫存器的某一位置位或清零,可以使用位掩碼
比如 reg是某個8位暫存器
1/*將reg第5位置位
*/2 reg |= (1
<<5
); 34/*
將reg第2和6位置位
*/5 reg |= (1
<<2) |(1
<<6);
/*將reg第5位清零
*/reg &= ~(1
<<5
); /*
將reg第2和6位清零
*/reg &= ~( (1
<<2) | (1
<<6) ) ;
其實上面的 1<< 5 就是0b000100000,,1<< 2 就是0b00000100 ,1<< 6 就是0b01000000
從而進一步使用巨集定義
#define bit2_mask 0b00000100#define bit5_mask 0b00100000
#define bit6_mask 0b01000000
從而程式變為
/*將reg第5位置位
*/reg |=bit5_mask; /*
將reg第2和6位置位,兩段**效果一樣
*/reg |= bit2_mask |bit6_mask;
reg |= bit2_mask +bit6_mask; /*
將reg第5位清零
*/reg &= ~bit5_mask;
/*將reg第2和6位清零,兩段**效果一樣
*/reg &= ~(bit2_mask |bit6_mask) ;
reg &= ~(bit2_mask + bit6_mask) ;
其中的bitx_mask就稱為位掩碼
掩碼還可以用於:
1.取出乙個變數/暫存器中特定位數的值(高位/低位)
/*一般寫法
*//*
取出變數的高位和低位
*/uchar_var = 0x34
;uchar_var >>= 4;/*
取出變數的高位
*/uchar_var
<<= 4;/*
取出變數的低位
*/
/*使用位掩碼
*//*
取出變數的高位和低位
*/#define h4_mask 0b11110000
#define l4_mask 0b00001111 uchar_var = 0x34
; uchar_var_l = uchar_var & l4_mask;/*
取出變數高位
*/uchar_var_h = (uchar_var & h4_mask) >> 4;/*
取出變數低位
*/
2.作為判斷條件
#define bit3_mask 0b00001000#define bit2_mask 0b00000100
#define bit1_mask 0b00000010if( (uchar_var & bit3_mask) != 0 )/*
bit3是否置位
*/if( (uchar_var & bit2_mask) == 0 )/*
bit2是否清零
*/
C語言位域 位段
有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如開關只有通電和斷電兩種狀態,用0和1表示足以,也就是用乙個二進位。所以c語言又提供了一種資料結構,稱為位域或 位段。位域在應用開發中較少使用,你可以暫時跳過,遇到相關問題再回來溫習。所謂 位域 是把乙個位元組中的二進位...
C語言位域 位段
有些資訊在儲存時,並不需要占用乙個完整的位元組,而只需佔幾個或乙個二進位制位。例如開關只有通電和斷電兩種狀態,用0和1表示足以,也就是用乙個二進位。所以c語言又提供了一種資料結構,稱為位域或位段。位域在應用開發中較少使用,你可以暫時跳過,遇到相關問題再回來溫習。所謂 位域 是把乙個位元組中的二進位劃...
C語言位操作
在電腦程式中,資料的位是可以操作的最小資料單位,理論上可以用 位運算 來 完成所有的運算和操作。一般的位操作是用來控制硬體的,或者做資料變換使用,但是,靈活的位操作可以有效地提高程式執行的效率。c語言提供了位運算的功 能,這使得c語言也能像組合語言一樣用來編寫系統程式。位運算子c語言提供了六種位運算...