c语言位运算


在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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值