【嵌入式学习2】位运算 - 控制语句
目录
## 位运算练习
## 程序执行的三大流程
## 分支语句
1、if 语句
2、if....else
3、三目运算符
4、if....else if....else
5、switch
## 分支语句总结:
使用 if:
使用 switch:
## 分支语句综合
案例需求:
## 位运算练习
二进制数 10101001
有8位,位数的计数从右往左开始,最低位(最右边的位)是第0位,最高位(最左边的位)是第7位。
// 将变量a的第1位设置为1,其他位保持不变
uint8_t a = 0b10101001; // 0xa9
/*
10101001
00000010
a | = 2 或者 a = a | 0b00000010;
printf("%#x\n", a);
*/
// 将变量b的第3位设置为0,其他位保持不变
uint8_t b = 0b10101001; // 0xa9
/*
b = b & 0b11110111
printf("%#x\n", b);
*/
// 将变量c的第7位取反,其他位保持不变
uint8_t c = 0b10101001; // 0xa9
/*
10101001
10000000
c = c ^ 0b10000000; //异或:相同0,不同1
printf("%#x\n", c);
*/
// 将变量d的第0位和第7位取反
uint8_t d = 0b10110011; // 0xb3;
/*
d = d ^ 0b10000001;
printf("%#x\n", d);
*/
// 检查变量e的第7位是否为1,如果是则输出"Bit is set",否则输出"Bit is not set"。
uint8_t e = 0b10110011;
/*
e = e >> 7; // 0b1,通过右移运算直接可以查看第七位数值
if (e > 0) {
printf("bit is set\n");
} else {
printf("bit is not set\n");
}
*/
## 程序执行的三大流程
- 顺序 : 从上向下, 顺序执行代码
- 分支 : 根据条件判断, 决定执行代码的分支
- 循环 : 让特定代码重复的执行
## 分支语句
1、if 语句
if (条件) {
条件成立时,要做的事
……
}
2、if....else
if (条件) {
条件成立时,要做的事
……
} else {
条件不成立时,要做的事
……
}
3、三目运算符
a>b?a:b;
如果a>b,整体为结果a,否则整体结果为b
4、if....else if....else
if (条件1) {
条件1成立时,要做的事
……
} else if(条件2) {
条件2成立时,要做的事
……
} else {
条件不成立时,要做的事
……
}
5、switch
switch (expression) {
case value1:
// 代码块1
break;
case value2:
// 代码块2
break;
default:
// 代码块3
}
## 分支语句总结:
-
使用
if
: - 当条件复杂,涉及多个变量或逻辑运算符时。
- 当需要判断的类型不是整数或枚举时。
- 当分支较少(通常不超过3个)时。
-
使用
switch
: - 当基于单个整数或枚举变量的值进行多分支选择时。
- 当分支较多(超过3个)时。
- 当需要更直观的代码结构时。
## 分支语句综合
案例需求:
- 输入:年份(整数)和月份(整数)
- 输出:该月份的天数(整数)
#include <stdio.h>
int main() {
// 1.定义变量保存年份、月份、天数
int year, month, day;
// 2.输入年份和月份
scanf("%d %d", &year, &month);
// 3.根据月份输出天数
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
day = 31;
break;
case 4:
case 6:
case 9:
case 11:
day = 30;
break;
case 2:
// 2月 非闰年 28天 闰年 29天
// 闰年判断:能被4整除,但不能被100整除的;或者能被400整除的年份
if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
day = 29;
} else {
day = 28;
}
break;
default:
day = -1;
}
printf("%d 年 %d 月 有 %d 天\n", year, month, day);
return 0;
}
## 循环语句
为什么要使用循环语句:
- 重复执行任务时:提高效率,处理大量数据
- 实现特定算法逻辑:迭代,搜索与排序算法
- 实现动态用户交互:持续输入的处理
1、while
while (条件) {
循环体
……
}
2、do...while
do-while 在执行循环体之后才检查条件表达式的值
所以 do-while 语句的循环体至少执行一次,被称为直到型循环
do {
循环体
……
} while (条件);
3、for
for ( init; condition; increment ) {
循环体
}
4、死循环
int main() {
while (1) {
printf("死循环1\n");
}
for(;;) {
printf("死循环2\n");
}
return 0;
}
5、嵌套循环
通过嵌套循环打印以下内容:
*
* *
* * *
* * * *
* * * * *
#include <stdio.h>
int main()
{
for(int j=0;j<5;j++)
{
for(int i=0;i<j+1;i++)
{
printf("* ");
}
printf("\n");
}
return 0;
}
解题思路:
①该题是5x5的 “*” 的矩阵输出变型,该图与 5 x 5的矩阵区别在于i和j的关系
②每一行输出的“*”数量等于该行的行数,由此可以得出第二个for中的判断关系,由于i和j'都由0开始数,所以判断条件中要变成j+1
## 跳转关键字
1、break:循环和switch专属的跳转
某一条件满足时,不再执行循环体中后续重复的代码,并退出循环
2、continue:循环专属跳转
某一条件满足时,不再执行本次循环体中后续重复的代码,但进入下一次循环判断
注意:while循环中,continue 之前一定要修改计数器(条件变量),否则会导致死循环
错误:当i等于3时,continue语句会执行,跳过i += 1和print(i),直接开始下一次循环。但是,由于i的值没有增加,循环条件i < 5始终为True,循环将永远不会结束,导致死循环。
i = 0
while i < 5:
if i == 3:
continue
i += 1
print(i)
正确:
i = 0
while i < 5:
i += 1
if i == 3:
continue
print(i)
3、goto:无条件跳转
从一组嵌套的循环中跳出可以使用goto
#include <stdio.h>
int main() {
int i = 0;
while (i < 3) {
if(i == 1) {
goto End; // 跳转到End标签
}
printf("i = %d\n", i);
i++;
}
End:
printf("this is ending!\n");
return 0;
}