天天看點

C中的位運算

    • 按位與 &
    • 按位或 |
    • 異或 ^
    • 取反 ~
    • 左移運算符 <<
    • 右移運算符 >>

按位與 &

參加運算的兩個數制,按二進制進行 與運算。如果兩個相應的二進位數為1,剛該位的結果為 1 否則為 0

1 & 1 = 1;
0 & 0 = 0;
0 & 1 = 0;
1 & 0 = 0;

3 = 00000011
5 = 00000101
3&5=00000001 = 1;
           

如果參加 & 是負數(-3 & -5),則以補碼形式表示為二進制數。然後按位進行 與 運算。 計算補碼的方式見這篇部落格

按位或 |

倆個相應的二進位隻要有一個為1 則該位的結果就是1

| 0 = 0;
 | 0 = 1;
 | 1 = 1;
 | 1 = 1;
           

異或 ^

若參加運算的兩個二進位同号,則結果為0,異号則為1。

^  = ;
 ^  = ;
 ^  = ;
 ^  = ;

a = a ^ b;  //可以用來交換a b的值
b = b ^ a;
a = a ^ b;
           

取反 ~

用來對二進制取反 即0變1 1變1

左移運算符 <<

用來将一個數的二進位全部左移若幹位

左移一位相當于該數乘2

a = ;
a =  ;
a = a<<;
=>=   ==>a=
//整體左移位  右補
           

右移運算符 >>

将二進制位右移2位 移到右端的低位被舍棄

在右移時,需要注意符号位問題。對無符号數,右移時左邊高位移入 0。對于有符号的值,如果原來符号位為 0 (該數為正),則左邊也是移入 0,如果符号位原來為 1(該數為負),則左邊移入的 0 還是 1 ,要取決于所用的計算機系統。移入 0 稱為 邏輯右移,即簡單右移。移入 1 稱為 算術右移

右移一位相當于該數除以2

a =  >> ;(八進制表示)
a =   >> ;
a =  
           

不同長度的資料進行位運算時,如 a & b 而 a 為 long型,b 為 int 型。 系統會将二者按右端對齊;如果 b 為正數,則左側 16 位補滿 0。若 b 為負數,左端應補滿 1。如果 b 為無符号整數型,則左側補滿 0。

參考:

http://www.cnblogs.com/qkhhxkj/archive/2011/06/29/2093894.html