关系与逻辑运算 —— 寄存器操作的 “入门钥匙”

前言

哈喽大家好,这里是 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为0
	printf("b = %d\n\r", b);
	c = a > 0;  // 条件成立,c为1
	printf("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 & 任何数 = 01 & 任何数 = 任何数本身。可用于 “清零特定位”。
  • 按位或(|):两个位中有一个为 1 时结果为 1,否则为 0。
    特性:1 | 任何数 = 10 | 任何数 = 任何数本身。可用于 “置 1 特定位”。
  • 按位异或(^):两个位不同时结果为 1,相同时为 0。
    例如:1 ^ 0 = 11 ^ 1 = 00 ^ 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 或非 0if (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 = 0a > 4为假(0),b < 5为真(1),两个条件不同时成立;
  • c2 = 1b < 5为真,至少一个条件成立;
  • c3 = 1!(a > 4)为真(1),!(b < 5)为假(0),至少一个为真;
  • c4 = 0:两个取反后的条件不同时成立。
结尾

这篇笔记系统梳理了关系运算(判断真假)和逻辑运算(位操作与条件组合)的规则,尤其是按位运算在寄存器配置中的实用技巧(清零、置 1、翻转特定位),以及逻辑运算符在条件判断中的应用。这些都是嵌入式开发中操作硬件的基础,比如通过|=置位寄存器的某一位来点亮 LED,通过&&组合多个状态条件来判断系统是否正常。
下一篇,Hello_Embed 将跟着韦东山老师学习if语句。我们下篇见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值