位運算比較易混:
位運算之 C 與或非異或
與運算:&
二者都爲1爲1,不然爲0
1&1=1, 1&0=0, 0&1=0, 0&0=0
或運算:|
二者都爲0爲0,不然爲1
1|1 = 1, 1|0 = 1, 0|1 = 1, 0|0 = 0
非運算:~
1取0,0取1
~1 = 0, ~0 = 1
~(10001) = 01110
異或運算:^
二者相等爲0,不等爲1(易混淆)
1^1=0, 1^0=1, 0^1=1, 0^0=0
位移操做符:<<與>>
位運算是指按二進制進行的運算。在程序中,經常須要處理二進制位的問題。C/C++語言提供了6個位操做運算符。這些運算符只能用於整型操做數,即只能用於帶符號或無符號的char,short,int與long類型。
在實際應用中,建議用unsigned整型操做數,由於帶符號操做數可能由於不一樣機器結果不一樣。
c++和c的位操做運算符徹底相同,但c++中增長了bitset標準庫來支持位集操做,具體內容請參考http://book.51cto.com/art/200809/88698.htm
或者http://book.csdn.net/bookfiles/17/1001760.shtml,這些連接都是《C++ Primer中文版》中的內容,你們也能夠直接看書。
下面是C/C++位操做運算符列表,其中運算符優先級爲從上到下遞減,但<<,>>優先級相同。
C/C++位操做運算符
操做符 功能 用法
~ 位求反 ~expr
<< 左移 expr1 << expr2
>> 右移 expr1 >> expr2
& 位與 expr1 & expr2
^ 位異或 expr1 ^ expr2
| 位或 expr1 | expr2
代碼示例以下:
[cpp] view plaincopy
#include<iostream>
using namespace std;
int main(){
unsigned short x=3,y=5;
cout<<"~x="<<(unsigned short)~x<<endl;//位求反
cout<<"~x="<<~x<<endl;//位求反
cout<<"x&y="<<(x&y)<<endl;//位與
cout<<"x^y="<<(x^y)<<endl;//位異或
cout<<"x|y="<<(x|y)<<endl;//位或
cout<<"x<<1="<<(x<<1)<<endl;//位左移
cout<<"y>>1="<<(y>>1)<<endl;//位右移
return 0;
}
[cpp] view plain copy
#include<iostream>
using namespace std;
int main(){
unsigned short x=3,y=5;
cout<<"~x="<<(unsigned short)~x<<endl;//位求反
cout<<"~x="<<~x<<endl;//位求反
cout<<"x&y="<<(x&y)<<endl;//位與
cout<<"x^y="<<(x^y)<<endl;//位異或
cout<<"x|y="<<(x|y)<<endl;//位或
cout<<"x<<1="<<(x<<1)<<endl;//位左移
cout<<"y>>1="<<(y>>1)<<endl;//位右移
return 0;
}
運算結果以下:
~x=65532
~x=-4
x&y=1
x^y=6
x|y=7
x<<1=6
y>>1=2
代碼解釋以下:
short爲16位整數,故x,y的二進制表示以下:
x=3(00000000 00000011)
y=5(00000000 00000101)
~ 00000000 00000011
= 11111111 11111100(65532或者-4)(至於爲何一樣的二進制位表示的數不同,這與計算機的數值表示有關,具體緣由可搜索「補碼」)
00000000 00000011
& 00000000 00000101
= 00000000 00000001(1)
00000000 00000011
^ 00000000 00000101
= 00000000 00000110(6)
00000000 00000011
| 00000000 00000101
= 00000000 00000111(7)
00000000 00000011<<1
= 00000000 00000110(6)
00000000 00000101>>1
= 00000000 00000010(2)
實例參考:位運算符(一):C/C++位運算符 - jason的專欄 - 博客頻道 - CSDN.NET
http://blog.csdn.net/jason314/article/details/5719933