1.移位操作符
移位操作符有左移操作符(<<)和右移操作符(>>)两种。
注:移位操作符的操作数只能是整数。
1.1左移操作符
移位规则:左边抛弃、右边补0。
代码示例:
#include<stdio.h>
int main()
{
int num = 10;
int n = num << 1; //左移一位
printf("%d\n", num);
printf("%d\n", n);
return 0;
}
如图:
1.2右移操作符
右移操作符有逻辑右移和算术右移两种,因此运算规则也分为两种。
逻辑右移:左边用0填充,右边丢弃。
算术右移:左边用原该值的符号位填充,右边丢弃。
代码示例:
#include<stdio.h>
int main()
{
int num = 10;
int n = num >> 1; //右移一位
printf("%d\n", num);
printf("%d\n", n);
return 0;
}
如图:
逻辑右移1位演示
算术右移1位演示
对于移位运算符,不要移动负数位,这个标准未定义
如:
int num = 10;
num >> -1; //这个是错误的
2.位操作符:&、|、^、~
(1)& ---- 按位与:对应的二进制位进行与运算,只要有0即为0,两个同时为1才为1
(2)| ---- 按位或:对应的二进制位进行或运算,只要有1即为1,两个同时为0才为0
(3)^ ---- 按位异或:对应的二进制位进行运算,相同为0,相异为1
(4)~ ---- 按位取反:全部位取反,1变0,0变1,包括符号位
以上四个位操作符的操作数必须是整数
异或操作符的特点:a^a=0 a^0=a 异或操作符支持交换律
3.操作符的属性:优先级、结合性
3.1优先级
优先级是指在一个表达式中如果存在多个运算符,哪个运算符应该先执行。各种运算符的优先级是不一样的。
3.2结合性
如果两个运算符的优先级是相同的,优先级无法确定先计算哪个,就要根据结合性来计算。大部分的运算符是左结合(从左到右执行),少数运算符是右结合(从右到左执行),如赋值运算符(=)。
优先级表格: