位操作符
原码反码补码
一个数字转化为对应的二进制位即为原码(最高位为符号位),内存中存放的都是补码,运算也是通过补码来计算。补码由原码取反加一得到,打印时要将内存中的补码转化为原码打印
& 按(2进制)位与
运算规则:对应的二进制有0则为0,两个同时为1则为1
#include<stdio.h>
//按位与&
//对应的二进制位有0为0,两个都是1则为1
int main(){
int a = 3;
//00000000 00000000 00000000 00000011
int b = -5;
//10000000 00000000 00000000 00000101-原码
//11111111 11111111 11111111 11111010-反码
//11111111 11111111 11111111 11111011-补码
int c = a & b;
//00000000 00000000 00000000 00000011 -a
//11111111 11111111 11111111 11111011 -b
//00000000 00000000 00000000 00000011 -c
printf("%d", c); //3
}
| 按(2进制)位或
运算规则:对应的二进制有1则为1,两个同时为0则为0
#include<stdio.h>
//按位与|
//对应的二进制位有1为1,两个都是0则为0
int main(){
int a = 3;
//00000000 00000000 00000000 00000011
int b = -5;
//10000000 00000000 00000000 00000101-原码
//11111111 11111111 11111111 11111010-反码
//11111111 11111111 11111111 11111011-补码
int c = a | b;
//00000000 00000000 00000000 00000011 -a
//11111111 11111111 11111111 11111011 -b
//11111111 11111111 11111111 11111011 -c(补码)
//由于c的符号位是1,打印时要转化为原码打印
//10000000 00000000 00000000 00000101 -c(原码)
printf("%d", c); //-5
}
^按(二进制)位异或
运算规则:对应的二进制位相同则为0,相异则为1
#include<stdio.h>
//按位异或^
//对应的二进制位相同为0,相异为1
int main(){
int a = 3;
//00000000 00000000 00000000 00000011
int b = -5;
//10000000 00000000 00000000 00000101-原码
//11111111 11111111 11111111 11111010-反码
//11111111 11111111 11111111 11111011-补码
int c = a ^ b;
//00000000 00000000 00000000 00000011 -a
//11111111 11111111 11111111 11111011 -b
//11111111 11111111 11111111 11111000 -c(补码)
//由于c的符号位是1,打印时要转化为原码打印
//10000000 00000000 00000000 00001000 -c(原码)
printf("%d", c); //-8
}
^的应用-交换变量
^异或操作符的规则:
- a^a=0
- 0^a=a
- ^支持交换律
- a ^ b ^a=b
#include<stdio.h>
//如何在不创建临时变量的情况下交换两个变量的值
int main() {
int a = 3;
int b = 5;
printf("%d %d", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("%d %d", a, b);
return 0;
}
不建议使用,可读性差,效率低,且只能交换整数