- 课程名称:嵌入式工程师
- 学习章节:位运算符
- 学习链接:https://class.imooc.com/sc/148/learn
- 讲师姓名:大白老师
课程内容:
关系运算符
类型与含义
运算符 含义
大于条件成立的时候,运算的结果为真
= 大于或等于条件成立的时候,运算的结果为真
< 小于条件成立的时候,运算的结果为真
<= 小于或等于条件成立的时候,运算的结果为真
== 等于条件成立的时候,运算的结果为真
!= 不等于条件成立的时候,运算的结果为真
用法说明
(1)C语言中规定,关系表达式值只有两个 0 (假)和 1 (真)。
(2)=和== 不同, =表示赋值操作,==表示逻辑判断是否相等。
(3)一般C语言中定义,0为假,非0为真。
个人理解
关系运算符一般是用在两边条件关系对比的时候,结果也都是布尔值,对比条件成立或者不成立
逻辑运算符
与或非
逻辑与 &&
表达式1 && 表达式2
规则:
都真则真 一假则假
短路特性:表达式1为假,则不会执行表达式2
示例
int a = 10,b = 20;
int ret = a > b && a;
逻辑或 ||
表达式1 || 表达式2
规则:
都假则假 一真则真
短路特性:表达式1为真,则不会执行表达式2
示例
int a = 10,b = 20;
int ret = a > b || a;
逻辑非 !
规则:(假->真,真->假)
位运算符
运算符介绍
运算符&
格式
表达式1 & 表达式2
功能
按位与
结果
1 按位与1 结果是1 1 按位与0 结果是0 0按位与0 结果是0 速记:都1则1,1零则0
示例
unsigned char reg1 = 0x13;
char reg2 = -1; 原: 1000 0001
反: 1111 1110
补: 1111 1111
unsigned char reg2 = 0x78;
unsigned char data = 0;
0001 0011
&1111 1111
0001 0011 ===>0x13
0001 0011
& 0111 1000
0001 0000 ===>0x10
data = reg1 & reg2;
printf("data = %#x\n",data); //0x10
运算符 |
格式
表达式1 | 表达式2
功能
按位与
结果
1 按位与1 结果是1 1 按位与0 结果是0 0按位与0 结果是0 速记:都1则1,1零则0
示例
0001 0011
| 0111 1000
0111 1011 ===>0x7b
示例都是二进制按照功能结果推出来的
运算符 ^
格式
表达式1 ^ 表达式2
功能
按位异或
结果
1 变成0, 0变成1
运算符 ~
格式
~表达式
功能
按位取反
结果
1 变成0, 0变成1
运算符 >>
格式
表达式<< 位数
功能
左移
结果
无论是正数还是负数,左移都是对应的二进制位向左移动高位丢弃,低位补0 左移的时候,等价于将这个数据乘以2的n(移动的位)次方
运算符 <<
格式
表达式>> 位数
功能
右移
结果
无符号数据
逻辑右移(针对无符号数据) 对应的是正数和0,逻辑右移是对应的二进制位向右移动,低位丢弃,高位补0。
有符号数据
正数
算术右移(针对有符号数据): 若是数据为正数,算术右移是对应的二进制位向右移动,低位丢弃,高位补0。
负数
若是数据为负数,算术右移是对应的二进制位向右移动,低位丢弃,高位补1。 速记: 右移,向右移动,低位丢弃,高位正数补0,负数补1
学习收获:
这节课程下来了解到了位运算符
右移运算符有个坑 分正负数 以后遇到了要小心点
截图打卡: