C语言中提供六种位运算
说明:
(1)"~"为单目运算符,其余均为双目运算符,优先级高低顺序:
按位求反~ 移位 按位与& 按位异或^ 按位或|
(2)运算量只能是整型或字符型数据,不能是实型(浮点型)
(3)参与运算时,操作数都必须转换成二进制形式,然后再执行按位运算
1.按位与运算(&)
格式:x&y
规则:对应位均为1时才为1,否则为0(全1为1)
0&0=0,0&1=0,1&0=0,1&1=1
#include <stdio.h>
int main()
{
printf("%d, %d\n", 9 & 5, -9 & 5);
return 0;
}
运行结果:1,5
2.按位或运算(|)
格式:x|y
规则:对应位均为0时才为0,否则为1(一1为1)
0|0=0,0|1=1,1|0=1,1|1=1
#include <stdio.h>
int main()
{
printf("%d, %d\n", 9 | 5, -9 | 5);
return 0;
}
运行结果:13,-9
3.按位异或(^)
格式:x^y
规则:对应位相同时为0,不同时为1
0^0=0,0^1=1,1^0=1,1^1=0
#include <stdio.h>
int main()
{
printf("%d, %d\n", 9 ^ 5, -9 ^ 5);
return 0;
}
运行结果:12,-14
4.按位取反(~)
格式:~x
规则:各位翻转,即原来为1的位变成0,原来为0的位变成1
~0=1,~1=0
#include <stdio.h>
int main()
{
printf("%d, %d\n", ~9, ~- 9);
return 0;
}
运行结果:-10,8
5.按位左移(<<)
格式:x<<位数
规则:使操作数的各位左移,低位补0,高位溢出
补充:如果左移出的位不是1,则左移操作相当于乘法操作,左移一位相当于原数乘以2,左移n位,则相当于原数乘以2的n次幂
#include <stdio.h>
int main()
{
printf("%d, %d\n", 9 << 3, (-9) << 3);
return 0;
}
运行结果:72,-72
6.按位右移(>>)
格式:x>>位数
规则:使操作数的各位右移,移出的低位舍弃,高位遵循如下规则:
1)对无符号数和有符号中的正数,补0;
2)有符号数中的负数,取决于所使用的系统:补0的称为“逻辑右移”,补1的称为“算术右移”(TC系统)。
逻辑右移:左边用0填充
算术右移:左边用原该值的符号位填充,右边丢弃
补充:右移操作相当于除法操作,右移一位相当于原数除以2,右移n位,则相当于原数除以2的n次幂
#include <stdio.h>
int main()
{
printf("%d, %d\n", 9 >> 3, (-9) >> 3);
return 0;
}
运行结果:1,-2