位運算

位運算

程序中的所有數在計算機內存中都是以二進制的形式儲存的。位運算說穿了,就是直接對整數在內存中的二進制位進行操作。比如,and運算本來是一個邏輯運算符,但整數與整數之間也可以進行and運算。舉個例子,6的二進制是11011的二進制是1011,那麼6 and 11的結果就是2,它是二進制對應位進行邏輯運算的結果(0表示False1表示True,空位都當0處理)。

位運算種類

C語言中提供了六種位運算,具體運算符如下:


 位與運算

位於運算符號:&,這是一個雙目運算符,功能是把兩個參與運算的操作數按照二進制位與,規則是都爲1的時候爲1,有一個爲0就爲0.參與運算的數是以補碼出現的。

例如:4&5就可以寫成下面的形式:

00000100

&

00000101 = 00000100 = 4

位與運算的一個主要用途就是把某些位清零或者保留某些位,比如我們需要把某一個數保留低八位,前面的都清零,我們知道我們需要這樣的一個二進制數:

0000 0000 0000 0000 0000 0000 1111 1111

那麼以這個二進制爲補碼的十進制數是多少呢?算一算是255.

我們給出一個數640

它的二進制補碼爲:

0000 0000 0000 0000 0000 0010 0100 0000

那麼結果該爲:128  0000 0000 0000 0000 0000 0000 0100 0000

那麼我們來看一個例子,創建bin_and.c編輯如下:

 

 

 位或運算

位或運算的運算符爲“|”,方法是參與運算的操作數對應的位上的二進制相或,規則是有1就爲1,全零才爲0,同樣操作數依然是以補碼運算的。

 

例如:

255 | 640

0000 0000 0000 0000 0000 0000 1111 1111

|

0000 0000 0000 0000 0000 0010 0100 0000

=

0000 0000 0000 0000 0000 0010 1111 1111

=767

 

功能顯然是可以補1,我們看例子把上面的計算用程序實現一下,創建bin_or.c編輯如下:

 

 異或、求反、左移、右移

下面的運算和上面的大同小異,在這裏我們簡單介紹:

位異或運算符號:^  參與運算的操作數對應爲相同時爲1,不同時爲0,同樣以補碼形式

位求反運算符號:~ 這是一個單目運算符 具有右結合性,功能對操作數按位取反,同樣以補碼形式

位左移運算符:<< 這也是單目運算,是將操作數的所有位向左移

位右移運算符:>> 這也是單目運算,是將操作數的所有位向右移

我們來看一個例子,我們拿一個數255我們先把它取反

0000 0000 0000 0000 0000 0000 1111 1111

取反後;

1111 1111 1111 1111 1111 1111 0000 0000

= -256

我們再把它向右移5位,結果應爲

0000 0111 1111 1111 1111 1111 1111 1000

-8

我們創建文件bin_mv.c編輯如下:

 

 

位域

位域是指信息在存儲時,並不需要佔用一個完整的字節, 而只需佔幾個或一個二進制位。例如在存放一個開關量時,只有01 兩種狀態, 用一位二進位即可。爲了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱爲位域位段。所謂位域是把一個字節中的二進位劃分爲幾 個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個字節的二進制位域來表示。

與結構定義相仿,其形式爲:

struct 位域結構名

  { 位域列表 };

  其中位域列表的形式爲: 類型說明符 位域名:位域長度

  例如:

  struct bs

{int a:8;int b:2;int c:6;};

在這裏這個我們也不多說了,有興趣的朋友可以來信我們交流。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章