一、位运算
1.按位与(&)
按位与运算符(&)是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1,否则为0 。参与运算的数以补码方式出现。
例如:3&2可写算式如下:00000011(3的二进制补码)&00000010(2的二进制补码)=00000010(2的二进制补码),可见3&2=2 。int main()
{
printf("%d", 3 & 2);
return 0;
}
输出结果:2
2.按位或运算符(|)
按位或运算符(|)是双目运算符。其功能是参与运算的两数各对应的二进位相或。只有对应的两个二进位有一个为1时,结果位就为1,否则为0 。参与运算的数以补码方式出现。
例如:3|2=00000011|00000010=00000011=3int main()
{
printf("%d", 3 | 2);
return 0;
}
输出结果:3
3.按位异或运算符(^)
按位异或运算符(^)是双目运算符。其功能是参与运算的两数各对应的二进位相异或。只有对应的两个二进位相异是,结果位就为1,否则为0 。参与运算的数以补码方式出现。
例如:3^2=00000011 ^ 00000010=00000001=1int main()
{
printf("%d", 3 ^ 2);
return 0;
}
输出结果:1
4.求反运算(~)
按位异或运算符(~)是单目运算符,具有右结合性(即表达式从右往左进行)。其功能是参与运算的数的各二进位按位求反。参与运算的数以补码方式出现。
例如:~ 9 =~ (00001001)=(11110110)
需要注意的是最后出现的数是补码的形式出现的,所以上例中11110110的原码为10001010=-10
int main()
{
printf("%d", ~9);
return 0;
}
输出结果:-10
5.左移运算(<<)
左移运算符(<<)是双目运算符。其功能是参与运算的数的各二进位全部左移若干位,高位舍弃,低位补0。
例如:1<<2=00000001<<2=00000100=4int main()
{
printf("%d",1<<2);
return 0;
}
输出结果:4
6.右移运算(>>)
右移运算符(>>)是双目运算符。其功能是参与运算的数的各二进位全部右移若干位,低位舍弃,高位补0 。对于负数来说,符号位的1不动。
例如:
8>>2=00001000>>2=00000010=2
-8>>2=10001000>>2=10000010=-2
int main()
{
printf("%d\n%d",8>>2,-8>>2);
return 0;
}
输出结果:
2
-2