位运算专题一:位与、位或、位反

位运算只用于所有的整型!!(char,short,int,long int,long long,unsigned char,unsigned short......),浮点值均不适用!!!

位运算有哪些呢?& 位与,| 位或,~ 位反,^ 异或,<< 左移,>> 右移,接下来介绍前三个,剩余的在下一篇介绍!

1. & 位与

先来回忆逻辑与:&&两边操作数非零即为真!再进行与运算。(C语言中0='\0'=NULL=false)

而位与则是:将操作数转为二进制表达形式后,以补码的形式进行相与运算。

(1)分析如下代码:

#include<stdio.h>
int main() {
	char a = 5;
	char b = -5;
	char c = 0;
	c = a && b; //逻辑与,结果为1
	printf("%d && %d = %d\n",a,b,c);
	c = a & b; //位与,结果为1
	printf("%d & %d = %d\n", a, b, c);
	return 0;
}

对于c=a&&b; //a=5,b=-5,非0即为真(true),1&&1=1,结果为1。

对于c=a&b; //a=5=0000 0101,b=-5=1000 0101(原码)=1111 1011(补码),再进行位与:0000 0101&1111 1011=0000 0001=1,结果也为1。

(2)分析下列代码:

#include<stdio.h>
int main() {
	int a = 5, b = 7;
	if(a>10&&++b){}
	printf("b=%d\n", b); //b=7
	if (a > 10 & ++b) {}
	printf("b=%d\n", b); //b=8
	return 0;
}

对于a>10&&++b:逻辑与运算(特点:0(false)&&任意值=0,故当第一个表达式值为0时,计算机就会偷懒不进行计算第二个表达式;同理逻辑或:1(true)||任意值=1,第二个表达式也不会被计算),故a>10=0(false),第二个表达式将不被运行。故b的值不变,b=7。

对于a>10&++b:位与运算,a>10=0(false)=0000 0000 0000 0000 0000 0000 0000 0000,++b先执行b+=1=8=0000 1000,在进行扩充(有符号数扩充符号位)并使用补码进行与运算(相同为1,相异为0)为:0000 0000 0000 0000 0000 0000 0000 1000,故0&8=0000 0000 0000 0000 0000 0000 0000 0000=0,b=8。

(3)位与运算可以将二进制数的某一位 置为0而其他位保持不变也可以将某一位保持不变,其他位 置为0

例如:若有定义char a = 0xAA; //即a=1010 1010,现想将a变为1010 0010,由于1 与 任何数的结果仍为那个数,故可以令a&(0b1111 0111)或a&(0xF7);当然也可以用还未提到的左移右移取反,令a&~(1<<3):1<<3=0000 0001(1)左移3位,即后面补3个0:0000 0001000=0000 1000(截取低八位),再进行取反~:1111 0111即可。

再如:有定义char a = 0xAA; //即a=1010 1010,现想将其变为0000 1000,由于0 与 任何数结果为0,故令a&(0b0000 1000)或a&(0x08)即可。

2. ~ 位反

位反运算符很容易理解:对于整型数的二进制补码形式进行按位取反(逻辑值:0->1,1->0)即可。

但应注意的是:位反运算符为单目运算符,其不会改变原值!!!单目运算符中只有++(自增运算符),--(自减运算符)可以作用并改变原变量的值

如:定义char a=0x89; //即a=1000 1001,再定义char ch=~a; //则ch=0111 0110,但a的值仍为1000 1001。

3. | 位或

先来回忆逻辑或:||两边操作数非零即为真!再进行或运算。

而位或则是:将操作数转为二进制表达形式后,以补码的形式进行相或运算。

做法类似位与运算,就不举例了。

(1)位或运算可以将二进制数的某一位 置为1而其他位保持不变。

例如:char a=0x89; //即a=1000 1001,要将其变为1001 1001,由于1 或 任何数的结果均为10或任何数的结果仍为那个数,故令a|(0b0001 0000)或a|(0x10)或a|(1<<4)=a|(1左移四位=0000 0001右边添加4个0=0000 0001 0000截取低八位=0001 0000)即可。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值