上一期给大家讲解了移位操作符,这一期给大家带来的是位操作符的讲解
首先大家在学习位操作符之前要明确:位操作符也是针对二进制位计算的!!!(关于二进制讲解请参考:http://t.csdn.cn/RI7Vv)
大家需要先了解位操作符有哪几种:
&---按位与(按二进制与)
|---按位或(按二进制或)
^---按位异或(按二进制异或)
注意:移位操作符的操作数只能是整数。
不同的位操作符有不同的运算规则,下面分别给大家讲解三个位操作符的运算规则以及案例。
一、&---按位与
运算规则:内存中对应的二进制位有0则为0,两个同时为1才为1。
话不多说,咱们直接上代码讲解,我们直接上代码讲解,还是刚刚的例子,知道了运算规则,大家可以算算最终结果,再往下对答案。
int main()
{
int a = 3;
int b = -5;
int c = a & b;
printf("c=%d\n", c);
return 0;
}
a因为是整数,所以a的二进制中原码、反码、补码都是一致,故内存中a的补码如下图:
b是负数,所以b的二进制中原码、反码、补码需要计算(请参考:http://t.csdn.cn/RI7Vv)计算步骤如下图:
分别得到了a、b的补码,根据按位与运算规则,即可求得c的补码,如下图:
由于最终c的补码是正数,正数的原码、反码、补码都是一致,所以c的补码也是原码,故最后可以计算出c的值为3。你算对了吗?
二、|---按位或
运算规则:内存中对应的二进制位有1则为1,两个同时为0才为0
同样的,我们直接上代码讲解,还是刚刚的例子,知道了运算规则,大家可以算算最终结果,再往下对答案。
int main()
{
int a = 3;
int b = -5;
int c = a | b;
printf("c=%d\n", c);
return 0;
}
由于变量都没变,所以求a、b补码的过程我们就略过,直接上图:
求出c的补码后,发现最高位为1,则c是个负数,负数的原码需要计算,计算过程如下图:
求出c的原码后,即可计算出c值,最终c值为-5。你算对了吗?
三、^---按位异或
运算规则:内存中对应的二进制位相同为0,不同为1。
我们直接上代码讲解,还是刚刚的例子,知道了运算规则,大家可以算算最终结果,再往下对答案
int main()
{
int a = 3;
int b = -5;
int c = a ^ b;
printf("c=%d\n", c);
return 0;
}
同样的,由于变量都没变,所以求a、b补码的过程我们就略过,老规矩直接上图:
求出c的补码后,发现最高位为1,则c是个负数,负数的原码需要计算,上面我们求c的原码是用取反、加1,这次我们用减1、取反来计算,过程如下图:
求出c的原码后,即可计算出c值,最终c值为-8。你算对了吗?
位操作符讲完了,给大家出道题目,有兴趣可以自行尝试下哦
//不能创建临时变量(第三个变量),实现两个整数的交换
解法一:
int main()
{
int a = 3;
int b = 5;
printf("%d %d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("%d %d\n", a, b);
return 0;
}
缺点:数字太大时容易溢出。
解法二:
int main()
{
int a = 3;
int b = 5;
printf("%d %d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d\n", a, b);
return 0;
}
嘿嘿,看到这个解法,大家可能没想到异或操作符还能这么用吧?
以代码为例,给大家介绍下异或操作符的特点:
1、a^a=0
2、a^0=a
3、异或操作符支持交换律
那么上面的代码就可以看成:
int main()
{
int a = 3;
int b = 5;
printf("%d %d\n", a, b);
a = a ^ b;
b = a ^ b;//a^b^b=a
a = a ^ b;//a^b^a=b
printf("%d %d\n", a, b);
return 0;
}
看到这里,相信你理解这道面试题该怎么做了吧!
结语:
位操作符的内容就此告一段落,希望各位读者阅读后都能有所收获,如果喜欢本篇博客的可以点赞+关注+收藏!!!同时也欢迎各路大神如果在阅读过程中发现文章有错误也可私信指正错误,我们下一篇博客再见~~~