在c語言中,可以通過 "&"," |"," ^"," ~"," <<"," >>",分別表示與,或,異或,非,左移,右移。對數進行按位運算時,可以直接使用,而不必把數轉換成二進制,例如求兩個int數的按位異或後的結果可以寫成
int a,b,c;
c=a^b;
值得注意的是位運算符和其他運算符之間的優先關係,使用以下代碼:
#include<stdio.h>
void main(){
int a=1,b=2,c=3;
// a:001 b:010 c:011
printf("位運算與邏輯運算\n");
printf("%d %d\n",(a|b)==2,a|b==2);
printf("%d %d\n",(a&b)==0,a&b==0);
printf("%d %d\n",(a^b)<4,a^b<4);
printf("%d %d\n",~a>0,~(a>0));
printf("%d %d\n",a>>1>1,a>>(1>1));
printf("%d %d\n",a<<1<1,a<<(1<1));
printf("位運算與算術運算\n");
printf("%d %d\n",a>>1+1,(a>>1)+1);
printf("%d %d\n",a<<1+1,(a<<1)+1);
printf("%d %d\n",~a+b,~(a+b));
printf("%d %d\n",a|b+c,(a|b)+c);
printf("%d %d\n",a&b+c,(a&b)+c);
printf("%d %d\n",a^b+c,(a^b)+c);
}
輸出爲:
位運算與邏輯運算
0 1
1 0
1 0
0 -2
0 1
0 1
位運算與賦值運算
0 1
4 3
0 -4
5 6
1 3
4 6
Press any key to continue
可以看出:
位運算符"&"," |"," ^"優先級低於邏輯運算符,也低於算術運算符
但是" <<"," >>"優先級高於邏輯運算符,低於算術運算符
" ~"優先級高於邏輯運算符,也高於算術運算符
總結:
位運算符"&"," |"," ^" 低於 邏輯運算符 低於 " <<"," >>" 低於算術運算符 低於 " ~"
由於優先級判斷比較複雜難記,所以需要養成加上括號的習慣,避免出現不必要的錯誤!
例如
#include<stdio.h>
void main(){
int m,a[101]={0},nim,result;
while(1){
nim = 0;
result =0;
scanf("%d",&m);
if(m==0)
break;
for(int i=1; i<=m; i++){
scanf("%d",&a[i]);
nim = nim^a[i];
}
if(nim ==0){
printf("0\n");
break;
}
for(int j=1; j<=m; j++){
if((nim^a[j])<a[j])
result++;
}
printf("%d\n",result);
}
}
21行中,開始因爲沒加括號,導致錯誤的出現,需要注意
位運算好的文章集錦:
http://www.matrix67.com/blog/archives/263
http://www.matrix67.com/blog/archives/264
http://www.matrix67.com/blog/archives/266
http://www.matrix67.com/blog/archives/268
http://topic.csdn.net/t/20041019/00/3468250.html
http://blog.csdn.net/sandy1983/article/details/4562668
http://blog.csdn.net/sandy1983/article/details/4565977
http://blog.csdn.net/sandy1983/article/details/4562573
http://wenku.baidu.com/view/a3c70f641ed9ad51f01df2f1.html