乙個用作標誌的普通變數至少要用乙個位元組—8 位, 而在某些計算機系統中則可能是 16 位。 如果我們想在乙個很大的表中儲存很多標誌, 那麼 「被浪費」 的記憶體空間是很可觀的。在 c 語言中, 一種方法是用叫做位段的構造型別來定義乙個壓縮資訊的結構。
我們通常想保持某個狀態的flag,就可以只用乙個變數的某乙個bit位來儲存,這樣可以節省空間!
先舉個例子
通過位操作的方式將第四位置0:10轉換成二進位制就是0000 1010。
(1<
然後按位取反~(1<
value(也就是10)與其按位與運算,0000 1010&1111 0111,這樣就得到了0000 0010,這樣就只將第四位清零,而不影響其他位!
//---將10的第四位置零,通過位操作
int value=10;
int index=4;
value&=~(1<
利用bit位的方法,設定各種狀態的flag,以設定工廠模式為例
(1).比如判斷是否為工廠模式,我們先定義乙個word(unsigned int型別,即佔兩個位元組)位元組的flag—monitorflag,這個flag是乙個結構體成員變數。然後定義乙個巨集來標示這個結構體成員變數:#define monitorflags monitorsetting.monitorflag
typedef struct
//省略
//---定義乙個巨集標示這個結構體變數--monitorflags
#define monitorflags monitorsetting.monitorflag
(2)所以我們可以將這個變數monitorsetting.monitorflag的某乙個bit位作為工廠模式的標誌flag,這裡將第二位,即bit1(0x00002)作為工廠模式標誌位。
再定義乙個factorymodeflag等同於bit1,這樣是為了方便理解,見名知意,將其與monitorflags按位與&,通過判斷該第二位就知道是否為工廠模式。
當要置起工廠模式的flag時,monitorflags與bfactorymodebit(即bit1)相或運算,這樣可以得出該位的flag。
當要清掉工廠模式的flag時,,bfactorymodebit(即bit1)先按位取反,第二位就變成0了,然後monitorflags與其按位與,這樣就把第二位清零了而不影響其他位。
所以我們可以直接判斷factorymodeflag就可以判斷是否為工廠模式。
#define bfactorymodebit bit1 // factory mode
#define factorymodeflag (monitorflags&bfactorymodebit)
#define set_factorymodeflag() (monitorflags|=bfactorymodebit)
#define clr_factorymodeflag() (monitorflags&=~bfactorymodebit)
***這樣採用乙個變數各個bit位來存flag的好處是,節省空間,當我們需要將某種模式儲存到flash時,又不想影響其他變數就需要這種方式,因為flash無法位操作,只能塊操作!
一些資料結構型別
注意:int和系統大小有關,32位系統,4位元組,64位系統8位元組
C語言中位操作
0 0 0 0 1 0 1 0 0 1 1 1 0 0 0 0 1 1 1 0 1 1 1 1 1.不改變其他位的值的狀況下,對某幾個位進行設值。先對需要設定的位用 操作符進行清零操作,然後用 操作符設值。比如我要改變 gpioa 的狀態,可以先對暫存器的值進行 清零操作 gpioa crl 0xf...
C語言中的位操作
目錄 1.前言 2.數值在計算機中的表示 3.位運算 4.位段 正文 1.前言 為了節省記憶體空間,在系統軟體中常將多個標誌狀態簡單地組合在一起,儲存到乙個位元組 或字 中。語言是為研製系統軟體而設計的,所以她提供了實現將標誌狀態從標誌位元組中分離出來的位運算功能。所謂位運算是指,按二進位制位進行的...
C 語言中的位操作
在微控制器或是工業控制中,位操作是很常見的,利用微控制器實現跑馬燈的例項就可以通過位操作來實現。c 語言中也能夠實現位操作。微操作是針對資料的二進位制補碼形式的操作,位操作符主要有 位運算子含義 與 或 非 異或 左移 右移 與等 或等 異或等 左移等 右移等 可以用下邊的類似程式實現二進位制的輸出...