C語言中的位操作

一、二進制整數

大家都清楚,計算中是以二進制數來表示的。那麼爲什麼在計算機中,一個字節等於8位呢?這又是怎麼得出來的呢?
百度知道上的答案如下:“所謂字節,原意就是用來表示一個完整的字符的。最初的計算機性能和存儲容量都比較差,所以普遍採用4位BCD編碼(這個編碼出現比計算機還早,最早是用在打孔卡上的)。BCD編碼表示數字還可以,但表示字母或符號就很不好用,需要用多個編碼來表示。後來又演變出6位的BCD編碼(BCDIC),以及至今仍在廣泛使用的7位ASCII編碼。不過最終決定字節大小的,是大名鼎鼎的System/360。當時IBM爲System/360設計了一套8位EBCDIC編碼,涵蓋了數字、大小寫字母和大部分常用符號,同時又兼容廣泛用於打孔卡的6位BCDIC編碼。System/360很成功,也奠定了字符存儲單位採用8位長度的基礎,這就是1字節=8位的由來。”

二、掩碼

掩碼:是某些位設爲開(1)而某些位設爲關(0)的位組合
c中的“&”按位與符號通常跟掩碼一起使用。正面看個例子:

#define MASK 2 /* 0000 0010*/
int main(){
int flags = 1;
flags = flags & MASK;
return 0;
}

注意:flags = flags & MASK這條語句將使flags的二進制值除位1之外的所有位都將被置爲0,因爲它的其它位在&位與運行符與0組合下都等於0;因爲掩碼中的0覆蓋了flags中的相應的位,因此該過程也稱爲“使用掩碼”。

2.1:用運算符打開位,關閉位

在硬件中,我們針對端口編程時,經常會置某個端口爲高電平或低電平,即某位置爲1或0,而其它位保持不變,這時我們可以使用“位或”來實現置1,使用&來實現置0。

2.1.1:置1

例如:MASK其位1設爲1.我們就可以用“|”來實現flags中的位1設爲1,並保留其他所有位不變。

flags |= MASK;

2.1.2:置0

同上,如果MASK其位1還是設爲1,那麼我們可以用如下的方法來讓flags中位1置爲0.
先把MASK的所有位取反,使其位1置爲0,其他所有位置爲1,然後再複用“&”位與運算符,來得到結果。

flags = flags & (~MASK);

2.2:用運算符實現“轉置位”

轉置(toggling)一個位表示如果該位爲1,則置爲0,反之則反之。
比如:b 的值爲0,它的二進制數爲0000 0000,則通過轉置使b==1,

b = 1 ^ b;

三、移位運算符

移位運算符能夠提供快捷、高效的(依賴於硬件)對2的冪的乘、除法。
注:正面表格所示只針對 unsigned無符號數。

Tables Are
number << n number乘以2的n次冪
number >> n number除以2的n次冪

下面用移位運算符來實現取顏色值:
(RGB:分別對應低位,高位)

#define BYTE_MASK oxff
unsigned long color = 0x002a162f;
unsigned char blue,green,red;
red = color & BYTE_MASK;
green = (color >> 8) & BYTE_MASK;
blue = (color >> 16) & BYTE_MASK;
發佈了73 篇原創文章 · 獲贊 26 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章