目录
1、按位与( & )
2、按位或( | )
3.按位异或( ^ )
C语言中的位操作符有以下:
&
|
^//按位与
//按位或
//按位异或位运算符是计算两者之间的补码,然后得到的是计算后补码转化为的原码进行输出表示
注:他们的操作数必须是整数。
1、按位与( & )
以下为简单举例:
#include<stdio.h>
int main()
{
int a = 3;
int b = -5;
int c = a | b;
return 0;
}
对于以上代码的运算,在下面进行拆分讲解。分别先列出a和b的原码,然后计算得到补码(原码取反+1)
000000000000000000000011 a原码
000000000000000000000011 a补码(正数的补码是他本身)
100000000000000000000101 b原码
111111111111111111111111010 b反码
111111111111111111111111011 b补码
在得到二者补码后将补码进行按位与运算。即对应位置都为1才为1,有一个是0即为0,具体运算如下:
000000000000000000000011 a补码
111111111111111111111111011 b补码
000000000000000000000011 c补码
在经过从补码变为原码的过程:
111111111111111111111111101 c原码
所以a和b按位与最终得到的c二进制为111111111111111111111111101。
2、按位或( | )
举例:
#include<stdio.h>
int main()
{
int a = 3;
int b = -5;
int c = a | b;
printf("%d\n",c);
return 0;
}
与按位与一样,按位或同样是先计算出a和b的补码然后将补码进行计算,然后得到的补码再转换为原码才是真正c的值
000000000000000000000011 a原码
000000000000000000000011 a补码(正数的补码是他本身)
100000000000000000000101 b原码
111111111111111111111111010 b反码
111111111111111111111111101 b补码
按位或的计算方法是两个二进制序列对应位置有1则为1,得到补码然后再转化为原码
000000000000000000000011 a补码
111111111111111111111111011 b补码
111111111111111111111111011 c补码
在经过从补码变为原码的过程:(负数取反,符号位不变)
100000000000000000000101 c原码
所以得到的按位或计算得到的值为100000000000000000000101。
运算结果显示:
3.按位异或( ^ )
依旧用实例来进行讲解
#include<stdio.h>
int main()
{
int a = 3;
int b = -5;
int c = a ^ b;
printf("%d\n",c);
return 0;
}
000000000000000000000011 a原码
000000000000000000000011 a补码(正数的补码是他本身)
100000000000000000000101 b原码
111111111111111111111111010 b反码
111111111111111111111111101 b补码
按位异或运算遵循的原则是,相同位为0,相异位为1,详细运算如下:
000000000000000000000011 a补码
111111111111111111111111011 b补码
111111111111111111111111000 c补码
在经过从补码变为原码的过程:(负数取反,符号位不变)
100000000000000000001000 c原码
所以得到的c的原码为100000000000000000001000。
运算结果为:
4.结语
如有遗漏或问题请直接指出,感谢阅读。