位運算

運算符的分類:

&: 叫做按位與運算符  
|:叫做按位或運算符
^:叫做按位異或運算符
~:叫做取反運算符
>>:叫做右移運算符
<<:叫做左移運算符
運算符呢,一共有這6種,作用下面介紹。


&:按位與運算符,是一個二目運算符。功能是將參與運算的兩個數按照各個對應的二進制位相與,其運算規則是:若兩個運算對象對應的二進制位爲1,則結果爲1,否則爲0

例如: 整數13和21進行按位與運算
     00001101 (13的二進制)
&   00010101 (21的二進制)
——————————————
     00000101 (即5的二進制)

所以13&21=5 即把00000101轉化爲10進制的5

說明:如果參加按位與運算的數爲負整數,則在計算機中,參與運算的數是以補碼的形式表現的
    00001001 (-9的二進制補碼)
&  00000101  5的補碼,正數的補碼是其本身)
——————————————
    00000001 (1的二進制補碼)

-9&5=1 即00000001轉化爲10進制數1

總結一下按位與運算的功能

1)如果想將一個數清零,即全部的二進制位爲0.只要找到一個數,使它各位的值符合以下條件:源數中爲1的位,新數中相應的位爲0(就是原來的二進制位中出現1的位置,然後找一個同樣位置爲0的二進制,或者各個位都爲0也可以),然後使兩個數進行&運算
例:原數爲 00101011,另找一個數,設爲10010100,這是一種方法,也可以找一個00000000,符合&運算規則的就可以
2)取一個數的指定位,如果想保留一個數的某些位,即屏蔽其他位,只需要找到一個數,在原數想保留的那幾位新數上相應位取值爲1,其他位取值爲0,然後兩個數進行&運算即可,例如:原數爲00111001,想取低4位(左端爲高,右端爲低,還記得麼)可以用00001111與原數進行&運算

    00111001
&  00001111
————————
    00001001
從結果可以得知,原數的前4位清零,後4爲保持不變

3)測試一個數中的任意一位是否爲1

如果想測試一個數的某一位是否爲1,只需要找到一個數,在原數想測試的那一位上,新數相應位取值爲1,其他位均爲0,然後與原數進行&運算即,如果計算結果不爲0,說明要測試的位爲1,否則說明要測試的數的那個位的值爲0

例如:原數 00111001,我想測試一下第5位是否爲1,我可以找一個這樣的數 00100000
      00111001
&   00100000
————————
      00100000
從結果可以看出我們測試的數據位爲1

以上即是按位與的運算,簡單的介紹了下,想熟知,請多練習

按位或

有了對按位與的瞭解,我們對於按位或上手就很快了

|:按位或運算符,它也是個二目運算符。功能是將參與運算的兩個數按照各個對應的二進制位相或,其運算規則是:若兩個運算對象的對應二進制位有一個是1,那麼結果爲1否則爲0.

還是對整數13和21進行按位或運算

     00001101  (13的二進制)
|    00010101  (21的二進制)
————————
     00011101  (29的二進制)

說明:如果參與運算的對象爲負數,則在計算機中參與運算的數是以補碼的方式出現

例如:     00001001   (-9的補碼)
             |  00000101 (5的補碼,正數的補碼是其本身)
          ——————————————————————
                00001101  (13的二進制補碼)

在C語言中,利用按位或的特點,常用來對一個數據中的某些位定值爲1,其餘位不變,即將置1的位與1進行按位或運算
,保持不變的位與0進行按位或運算

例如:原數爲:00111001,將此數的高四位不變,低四位置爲1,我們找一個按照規則說的那樣的數,前4位取0000,後四爲取1111(16進制的F)

    00111001
|   00001111
————————
    00111111
從結果可以看出,原數的前四位沒變,後四位變成了要求的那樣爲


按位異或運算

1)按位異或運算符^,是一個二目運算符。功能是將參與運算的兩個數按照各個對應的二進制位相異或,其運算規則是:若兩個運算對象的對應二進制位不相等,則結果的對應爲是1,否則爲0。一定要注意按位異或跟按位與的區別,一個是相等爲1(按位與1&1這種情況),一個是不相等的情況下爲1(按位異或)。

例如: 00001101  (13的二進制數)
         ^ 00010101 (21的二進制數)
——————————
            00011000  (24的二進制數)

說明:如果參加按位異或運算的對象爲負整數,則在計算機中參與運算的數是以補碼的方式出現。

例如:    00001001  (-9的二進制補碼)
           ^  00000101   (5的二進制補碼,整數的補碼是其本身)
————————————
              00001100    (12的二進制補碼)

在C語言中,按位異或運算可以實現一下3種功能:
(1)使制定的位翻轉,其他位保持不變
如果想使一個數中的某些指定的位翻轉,只需要找一個數,在原數需要翻轉新數位上的相應位取值爲1,在原數需要保持不變的位上新數相應的位取值爲0.然後兩個數進行按位異或運算。

例如:原數爲01111010,使其低4爲翻轉,我們找一個數,按照定義的來,這個數可以是00001111,然後我們把這兩個數進行按位異或運算

    01111010  
^   00001111
————————
    01110101

結果可以看出,原數的前4位沒變,後四位去反了,也就是翻轉了。

(2)清零

根據按位異或的特點,相同的位進行異或運算結果爲0,不相等的位異或運算結果爲1
所以可以對一個數跟自己進行按位異或運算

例如:原數爲 01111010,可以將這個數跟自己進行按位異或運算

    01111010
^   01111010
____________
    00000000

結果如上

(3)交換兩個數的值,不用臨時變量

對兩個變量進行數據交換時,可以採用按位異或運算的功能來實現

例如: a=3,  b=4 將a,b的值進行交換,可以用一下賦值語句來實現

a=a^b;  (a的二進制爲:00000011)
b=b^a;  (b的二進制爲:00000100)
a=a^b;

按位取反運算符

按爲取反運算符~,是一個單目運算符。功能是將參與運算的數的每一個二進制位進行取反,其運算規則爲:將運算對象中的各個二進制位的值取反,0取1,1取0。

例如 9的取反運算如下

    ~00001001
————————
      11110110

左移運算符

左移運算符是一個二目運算符,運算符左邊是移位對象,右邊是整型表達式(表達式的結果只能爲正數),代表左移的位數。功能是將參與運算的數按照各個對應的二進制位向左移動若干位,其運算規則是:將運算對象中的各個二進制位向左移動指定的位數,左移時左端高位的部分捨棄,右端空出的低位用0填充。

例如  int a=6;

a<<2;
運算過程 00000110 (十進制爲6)
左移2位  00011000 (十進制爲24)

從結果可以看出,左移1位相當於位對象乘2,左移n位相當於移位對象乘以2的n次方因爲左移比乘法運算快的多,有些C語言編譯程序自動將乘2的運算左移1位來實現,將乘2的n次方的運算,左移n位。


右移運算符

右移運算符>>,是一個二目運算符,運算符左邊是移位對象,右邊是整型表達式(表達式的結果只能爲正數),代表右移的位數。功能是將參與運算的數按照各對應的二進制位向右移動若干位,其運算規則是:將運算對象中的各個二進制位向右移動指定的位數,右移時右端的低位移出的二進制數被捨棄,左端高位補入的二進制數分兩種情況進行處理。
(1)對於無符號的整數,在進行右移時,左端高位補入的二進制數爲0

例如  unsigned char a = 'A',b;
         b>>2;
運算過程:01000001(十進制數65)
                  00010000(十進制16)


(2) 對於有符號的數,在右移時符號位將隨同移動

如果符號位爲0(即正數),則右移時左端高位補0;如果符號位爲1(即負數),則右移時左端高位補1.最高位補0或是補1取決於編譯系統的規定,但需要注意的是,負數在計算機均用補碼錶示。

例如  int a=-071411,b;
         b=a>>2;

運行結果:

1000110100000000(a的二進制補碼)
1110001101000000(a>>2後的b的補碼)
1001110011000000 (b的二進制原碼)
在C語言的位運算中,左端高位補1以保持負號的方法被稱爲“算數右移”,左端高位補0的方法稱爲“邏輯右移”。右移和左移相反,在進行右移時,如果右端低位移出的部分不包含有效的二進制數1,則每右移1位相當於移位對象除2


不同長度的位運算

不同長度的數據在進行位運算時,對象可以是整型和字符型數據,當兩個運算數類型補同時,其位數也會補同。遇到這種情況,系統會自動進行如下處理:

(1)先將兩個運算數的右端對齊
(2)在將位數短的一個運算數往高位擴充,即:無符號數和正整數左側用0補全,而負數左側用1補全;然後對位數相同的兩個運算數在按位進行位運算


這次就先總結這麼多,以後慢慢的將其他的資源補上來.....
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章