关系与逻辑运算 —— 寄存器操作的 “入门钥匙”
前言
哈喽大家好,这里是 Hello_Embed 的新一篇学习笔记。在前文中,我们学习了如何用结构体指针操作硬件寄存器,而寄存器的配置往往离不开位运算和条件判断 —— 比如通过逻辑运算精准修改某几位的值,通过关系运算判断硬件状态。这篇笔记将系统梳理关系运算和逻辑运算的规则,以及它们在嵌入式开发中的实用场景,为后续寄存器操作打下基础。
🔍 关系运算:判断条件的真假
关系运算的核心是 “比较两个值的关系”,结果只有两种:真(1)或假(0)。常见的关系运算符如图所示
以<
与>
为例,我们通过代码理解其逻辑:
先定义int a = 1
,比较a > 1
时,由于 1 并不大于 1,结果为假(0);比较a > 0
时,1 大于 0,结果为真(1)。
#include <stdio.h>
#include <string.h>
int mymain(void)
{int a = 1;int b,c;b = a > 1; // 条件不成立,b为0printf("b = %d\n\r", b);c = a > 0; // 条件成立,c为1printf("c = %d\n\r", c);return 0;
}
需要注意 “赋值” 与 “比较” 的区别:
a = 1
是赋值操作,将 1 赋给变量 a;a == 1
是比较操作,判断 a 的值是否等于 1,结果为 0(假)或 1(真)。
我们通过一道题目测试理解:
int a = 2;
int b, c, d;
b = (a == 2); // a等于2,条件成立,b=1
c = (a != 2); // a不等于2?条件不成立,c=0
d = (a >= 2); // a大于等于2,条件成立,d=1
答案:b=1,c=0,d=1。关系运算的逻辑其实很直接:成立为真(1),不成立为假(0)。
⚙️ 逻辑运算:位操作与条件组合
逻辑运算分为 “按位运算” 和 “逻辑组合运算”,在寄存器配置中高频使用。
按位运算的规则与特性
常见的按位运算符如图所示
结合之前指针笔记中的补充
我们详细梳理其用法:
- 按位与(&):两个位都为 1 时结果为 1,否则为 0。
特性:0 & 任何数 = 0
,1 & 任何数 = 任何数本身
。可用于 “清零特定位”。 - 按位或(|):两个位中有一个为 1 时结果为 1,否则为 0。
特性:1 | 任何数 = 1
,0 | 任何数 = 任何数本身
。可用于 “置 1 特定位”。 - 按位异或(^):两个位不同时结果为 1,相同时为 0。
例如:1 ^ 0 = 1
,1 ^ 1 = 0
,0 ^ 0 = 0
。可用于 “翻转特定位”。 - 按位取反(~):0 变 1,1 变 0。常与按位与结合,用于生成 “位掩码”。
- 左移(<<):将二进制数向左移动指定位数,等价于 “原数 × 2ⁿ”。
例如:5 << 1
(二进制0101 << 1
=1010
),结果为 10(即 5×2¹)。 - 右移(>>):将二进制数向右移动指定位数,等价于 “原数 ÷ 2ⁿ”(整数除法)。
例如:5 >> 1
(二进制0101 >> 1
=0010
),结果为 2(即 5÷2¹,取整数部分)。
逻辑与(&&)和逻辑或(||)
在按位与(&)和按位或(|)的基础上,我们再学习用于条件组合的逻辑运算符:
- 逻辑与(&&):判断两个条件是否同时成立,两个条件都为真(非 0)时结果为 1,否则为 0。
- 逻辑或(||):判断两个条件是否至少有一个成立,只要有一个条件为真(非 0),结果就为 1,否则为 0。
为了区分容易混淆的&=
与&&
,我们用表格对比:
运算符 | 名称 | 功能 | 操作数类型 | 示例 |
---|---|---|---|---|
&= | 按位与赋值 | 逐位进行与运算并赋值 | 整数类型(如 int) | a &= 3 等价于 a = a & 3 |
&& | 逻辑与 | 判断两个条件是否同时成立 | 结果为 0 或非 0 | if (a > 0 && b < 10) |
总结
&=
是按位运算符,用于对整数的二进制位进行操作。&&
是逻辑运算符,用于组合多个条件表达式,返回布尔值0/1。
同理,|=
(按位或赋值)与||
(逻辑或)的区别可类比理解:|=
用于位操作,||
用于条件组合。
实战检验
通过代码测试逻辑运算的结果,思考c1、c2、c3、c4
的值:
a = 3;
b = 1;
c1 = (a > 4) && (b < 5); // 两个条件是否同时成立?
c2 = (a > 4) || (b < 5); // 两个条件是否至少一个成立?
c3 = !(a > 4) || !(b < 5); // 条件取反后是否至少一个成立?
c4 = !(a > 4) && !(b < 5); // 条件取反后是否同时成立?
答案揭晓:
c1 = 0
:a > 4
为假(0),b < 5
为真(1),两个条件不同时成立;c2 = 1
:b < 5
为真,至少一个条件成立;c3 = 1
:!(a > 4)
为真(1),!(b < 5)
为假(0),至少一个为真;c4 = 0
:两个取反后的条件不同时成立。
结尾
这篇笔记系统梳理了关系运算(判断真假)和逻辑运算(位操作与条件组合)的规则,尤其是按位运算在寄存器配置中的实用技巧(清零、置 1、翻转特定位),以及逻辑运算符在条件判断中的应用。这些都是嵌入式开发中操作硬件的基础,比如通过|=
置位寄存器的某一位来点亮 LED,通过&&
组合多个状态条件来判断系统是否正常。
下一篇,Hello_Embed 将跟着韦东山老师学习if语句。我们下篇见。