一、二進制整數
大家都清楚,計算中是以二進制數來表示的。那麼爲什麼在計算機中,一個字節等於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;