运算符
位运算符
说明:按位(bit)来进行运算操作的运算符
语法: ~(按位取反) &(按位与) |(按位或) ^(按位异或) <<(左移) >>(右移)
~:按位取反
说明:单目运算符,数据的每一个bit位取反,也就是二进制数位上的1变0,0变1
举例:
unsigned char ret = ~0x05;// 0000 0101 --> 1111 1010
printf("%d\n",~5); // -
&:按位与
语法: a & b
说明:首先将参与计算的操作数转换为二级制,然后按照每一位进行对齐,处理结果如下:
1&1:1 110 &100:100
总结:如果我们前后两个操作数对其位置上的二进制数字都是1,其结果是1,否则结果都是0
|:按位或
语法: a | b
说明:首先将参与计算的操作数转换为二进制,然后按照每一位进行对齐,处理结果如下:
1|1:1 110 |100:110
总结:如果我们前后两个操作数对其位置上的二进制数字只要有1,其结果是1,否则结果都是0
^:按位异或
语法:a ^ b
说明:首先将参与计算的操作数转换为二进制,然后按照每一位进行对齐,处理结果如下:
1^1:0
1^0:1
0^0:0
0^1:1
总结:不同为真,相同为假
<<:左移,按bit位往左偏移
1.无符号移动:(数据变大)
语法:操作数 << 移动位数(bit位)
unsigned int a = 3 << 3
printf(”%d\n”,a); //24
2.有符号的左移:(数据变小)
语法:操作数 << 移动位数(bit位)
int a = -3 << 3
printf(”%d\n”,a); //-24
>>:右移,按bit位往右偏移
1.无符号移动:(数据变小)
语法:操作数 >> 移动位数(bit位)
unsigned int a = 3 << 3
printf(”%d\n”,a); //0
2.有符号的右移:(数据变大)
语法:操作数 >> 移动位数(bit位)
int a = -3 >> 3
printf(”%d\n”,a); //-1
注意:
1.再进行移位运算的时候,凡是被移出去的位统统丢弃,凡是空出来的统统补0,移位运算针对的是无符号整数。
2.如果非要进行有符号的运算,那么左移的时候,空出来的补0,右移的时候,空出来的补符号位(原码阶段)。
其他运算符
赋值运算符:
= :由右向左,优先级排倒数第二
int a = 4;
int num = 5 + 6;
注意:赋值运算符的左边(左操作数)必须是可写的地址
复合赋值运算符
+= -= *= /= %= ,由右向左,优先级倒数第二
int i = 1;
i+=1 //等价于i=1+1
i*=5 //等价于i=1*5
三目运算符
语法: 表达式1?表达式2:表达式3
求值顺序:
如果表达式1的值为1,则整个条件运算表达式的值为表达式2的值
如果表达式1的值为0,则整个条件运算表达式的值为表达式3的值
例一:
//需求:根据考试成绩进行奖励惩罚
// score >= 90 奖励电脑一台
// score < 90 奖励刷锅1个月
int score = 89;
printf(”%s\n”, score >= 90 ? “奖励电脑一台”:“奖励刷锅1个月”);
例二:
int a = 10,b = 20;
int ret = a>b?++a:++b;
printf(“ret:%d a:%d b:%d\n”,ret,a,b); // ret=21,a=10,b=21
逗号运算符:
说明:优先级最低,左到右,由多个运算符将多个式子两届起来的表达式称为都好表达式
语法:
(表达式1,表达式2…表达式n)
求值顺序:先求表达式1,再求表达式2,以此类推,整个逗号表达式的值为表达式n的值
注意:
1.逗号表达式的优先级最低
2.运算顺序从左往右
3.整个逗号表达式的值取决于最右边表达式的值
举例:
int a = 5, b = 3;
int ret = (a>b,a++,b++,a); //这种写法是为了减少代码量
printf(“ret:%d\n”,ret);
优先级的顺序:
补充:6818开发板:
需求:将一张BMP图片显示到开发板的LCD屏幕上
说明:
屏幕显示:BGR
图片显示:RGB
实现:RGB --> BGR
B:右移0个字节,也就是移动0位 B >> 0
R:右移2个字节,也就是移动16位 R >> 16
G:右移1个字节,也就是移动8位 G >> 8