目录
位运算符是二进制位的运算
1.按位与( & )
有0则为0,同时为1则为1
计算规则:对应的二进制位进行按位与运算
3 & -5
0000 0000 0000 0000 0000 0000 0000 0011 -- 3的补码 (正数的原码补码反码都一样)
1000 0000 0000 0000 0000 0000 0000 0101 -- -5的原码
1111 1111 1111 1111 1111 1111 1111 1010 -- -5的反码
1111 1111 1111 1111 1111 1111 1111 1011 -- -5的补码
0000 0000 0000 0000 0000 0000 0000 0011 -- 3的补码
0000 0000 0000 0000 0000 0000 0000 0011
计算 -5的补码 & 3的补码 结果== 3
2.按位或( | )
有1则为1,同时为0则为0
计算规则:对应的二进制位进行按位或运算
3 | -5
0000 0000 0000 0000 0000 0000 0000 0011 -- 3的补码 (正数的原码补码反码都一样)
1000 0000 0000 0000 0000 0000 0000 0101 -- -5的原码
1111 1111 1111 1111 1111 1111 1111 1010 -- -5的反码
1111 1111 1111 1111 1111 1111 1111 1011 -- -5的补码
0000 0000 0000 0000 0000 0000 0000 0011 -- 3的补码
1111 1111 1111 1111 1111 1111 1111 1011
计算 -5的补码 | 3的补码 结果== -5
3.按位异或( ^ )
相同位为0,相异位为1
计算规则:对应的二进制位进行异或运算
3 ^ -5
0000 0000 0000 0000 0000 0000 0000 0011 -- 3的补码 (正数的原码补码反码都一样)
1000 0000 0000 0000 0000 0000 0000 0101 -- -5的原码
1111 1111 1111 1111 1111 1111 1111 1010 -- -5的反码
1111 1111 1111 1111 1111 1111 1111 1011 -- -5的补码
0000 0000 0000 0000 0000 0000 0000 0011 -- 3的补码
1111 1111 1111 1111 1111 1111 1111 1000 取反
1000 0000 0000 0000 0000 0000 0000 0111 加1
1000 0000 0000 0000 0000 0000 0000 1000
计算 -5的补码 ^ 3的补码 结果== -8
4.按位取反( ~ )
0变1,1变0
计算规则:对应的二进制位进行取反运算
1
0000 0000 0000 0000 0000 0000 0000 0001 -- 1的补码
1111 1111 1111 1111 1111 1111 1111 1110 -- 得到补码
1000 0000 0000 0000 0000 0000 0000 0001 -- 取反
1000 0000 0000 0000 0000 0000 0000 0010 -- 加1
计算 ~1 结果== -2
5.面试变态题
不能创建临时变量(第三变量),实现两个数的交换
第一种解法
#include<stdio.h>
int main()
{
int a = 5;
int b = 3;
printf("a=%d b=%d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("a=%d b=%d\n", a, b);
return 0;
}
//这种写法有种缺陷:a和b如果非常大,求和后的结果超过整型的最大值
第二种解法
#include<stdio.h>
int main()
{
int a = 5;
int b = 3;
printf("a=%d b=%d\n", a, b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a=%d b=%d\n", a, b);
return 0;
}
运算法则:
n ^ n = 0
n ^ 0 = n
移位操作符( << >> )
1. 左移操作符 ( << )
移位规则:左边抛弃 、右边补0
代码展示:
#include<stdio.h>
int main()
{
int a = 5;
int b = a<< 1;
printf("a=%d\n", a);
printf("b=%d\n", b);
return 0;
}
2.右移操作符( >> )
移位规则:⾸先右移运算分两种
1. 逻辑右移:左边⽤0填充,右边丢弃
2. 算术右移:左边⽤原该值的符号位填充,右边丢弃
代码展示:
#include<stdio.h>
int main()
{
int a = 5;
int b = a >> 1;
printf("a=%d\n", a);
printf("b=%d\n", b);
return 0;
}