移位操作符:<<左移操作符 、 >>右移操作符
在使用它们之前,它们的操作数只能是整数,它们都是对整数的二进制操作
1、 <<左移操作符
操作原则:左边抛弃、右边补0
2、 >>右移操作符
操作原则:
右移运算分两种:
1. 逻辑移位
左边用0填充,右边丢弃
2. 算术移位
左边用原该值的符号位填充,右边丢弃
在大部分编译器中,执行的都是算术右移,因为算术右移保持原来的正负,保留符号位。
逻辑右移过于简单粗暴
位操作符:&(按位与)、|(按位或)、^(按位异或)
在使用它们之前,它们的操作数只能是整数,它们都是对整数的二进制操作
1 、 &(按位与):
计算法则:对应的二进制位上,有0则为0,全1则为1
例如:
int a = 3;
int b = 5;
int c = a & b;
//00000000000000000000000000000011 ———— a
//00000000000000000000000000000101 ———— b
//00000000000000000000000000000001 ———— c
//所以 a & b=1;
在计算机的计算都是按照补码进行计算的,
正数的原码、反码、补码都是一样的
而负数则要将原码准换为反码,再将反码准换为补码进行计算
有一点要注意的是,打印变量时,是用其原码打印的,所以如果结果是负数的补码,我们要算出负数的原码进行打印;
例如:
int a = 3;
int b = -5;
int c = a & b;
//00000000000000000000000000000011 ———— a
//10000000000000000000000000000101 ———— b
//11111111111111111111111111111010 ———— b的反码
//11111111111111111111111111111011 ———— b的补码
//00000000000000000000000000000011 ———— a
//11111111111111111111111111111011 ———— b的补码
//00000000000000000000000000000011 ———— c的补码(因为c的补码为正,正数的原码反码补码相同)
//所以 a & b=3
2、 |(按位或):
计算法则:对应的二进制位上,有1则为1,全0则为0
例如:
int a = 3;
int b = -5;
int c = a | b;
//00000000000000000000000000000011 ———— a
//10000000000000000000000000000101 ———— b
//11111111111111111111111111111010 ———— b的反码
//11111111111111111111111111111011 ———— b的补码
//00000000000000000000000000000011 ———— a
//11111111111111111111111111111011 ———— b的补码
//11111111111111111111111111111011 ———— c的补码
//10000000000000000000000000000100 ———— c的反码
//10000000000000000000000000000101 ———— c的原码
//所以 a | b=-5
计算出来的补码,我们要将其转换成原码
3、 ^(按位异或):
计算原则:对应的二进制位上,相同为0,相异为1
例如:
int a = 3;
int b = -5;
int c = a ^ b;
//00000000000000000000000000000011 ———— a
//10000000000000000000000000000101 ———— b
//11111111111111111111111111111010 ———— b的反码
//11111111111111111111111111111011 ———— b的补码
//00000000000000000000000000000011 ———— a
//11111111111111111111111111111011 ———— b的补码
//11111111111111111111111111111000 ———— c的补码
//10000000000000000000000000000111 ———— c的反码
//10000000000000000000000000001000 ———— c的原码
//所以a ^ b = -8
逻辑操作符:&&(逻辑与)、 ||(逻辑或)
1、 &&(逻辑与):
计算原则:同真为真,有假则假
#include<stdio.h>
int main()
{
int a = 0, b = 2;
int i = a && b;
printf("%d\n", i);
return 0;
}
因为a=0(为假),b=2(为真),所以 a && b 为假,结果为0
——————————————————————————————————————————
因为a=1(为真),b=2(为真),所以 a && b 为真,结果为1
——————————————————————————————————————————
因为a=0(为假),b=0(为假),所以 a && b 为假,结果为0
2、 ||(逻辑或):
计算原则:有真则真,全假则假
#include<stdio.h>
int main()
{
int a = 0, b = 2;
int i = a || b;
printf("%d\n", i);
return 0;
}
因为a=0(为假),b=2(为真),所以 a || b 为真,结果为1
——————————————————————————————————————————
因为a=1(为真),b=2(为真),所以 a || b 为真,结果为1
——————————————————————————————————————————
因为a=0(为假),b=0(为假),所以 a || b 为假,结果为0