a&b,a|b,a^b,这种表达式的值都是放在内存中计算的,
所以我们对它们的补码进行计算。
a&b,a|b,a^b,它们的操作数必须都是整数。
目录
按位与 &
&——按二进制位与
对应的二进制位有0则为0,两个同时为1则为1。
#include<stdio.h>
int main()
{int a=3;
//00000000000000000000000000000011——原码、反码、补码
int b=-5;
//10000000000000000000000000000101——原码
//11111111111111111111111111111010——反码
//11111111111111111111111111111011——补码
int c=a&b;
//00000000000000000000000000000011——a补码
//11111111111111111111111111111011——b补码
//00000000000000000000000000000011——c补码
printf("%d\n",c);
return 0;
}
按位或 |
|——按二进制位或
对应的二进制位有1则为1,两个同时为0则为0。
#include<stdio.h>
int main()
{int a=3;
//00000000000000000000000000000011——原码、反码、补码
int b=-5;
//10000000000000000000000000000101——原码
//11111111111111111111111111111010——反码
//11111111111111111111111111111011——补码
int c=a|b;
//00000000000000000000000000000011——a补码
//11111111111111111111111111111011——b补码
//11111111111111111111111111111011——c补码
//10000000000000000000000000000101——c原码
printf("%d\n",c);
return 0;
}
按位异或^
对应的二进制位相同为0,相异为1。
#include<stdio.h>
int main()
{int a=3;
//00000000000000000000000000000011——原码、反码、补码
int b=-5;
//10000000000000000000000000000101——原码
//11111111111111111111111111111010——反码
//11111111111111111111111111111011——补码
int c=a^b;
//00000000000000000000000000000011——a补码
//11111111111111111111111111111011——b补码
//11111111111111111111111111111000——c补码
//10000000000000000000000000001000——c原码
printf("%d\n",c);
return 0;
}
异或操作符有以下几个公式:
1.a^a=0 2.0^a=a 3.异或支持交换律
例题:
交换两个数的值
#include<stdio.h>
int main()
{int a=3;
int b=-5;
printf("%d %d\n",a,b);
a=a^b;
b=a^b;//a^b^b=a^0=a
a=a^b;//a^b^a=b^0=b
printf("%d %d\n",a,b);
return 0;
但是异或操作符只能针对整数的交换!