当前位置: 首页 > news >正文

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

前言

哈喽大家好,这里是 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 & 任何数 = 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语句。我们下篇见。

http://www.xdnf.cn/news/1197991.html

相关文章:

  • 分布式系统中Token续期问题解决方案
  • AIC 2025 热点解读:如何构建 AI 时代的“视频神经中枢”?
  • 四、搭建springCloudAlibaba2021.1版本分布式微服务-加入openFeign远程调用和sentinel流量控制
  • 嵌入式——单片机的独立按键
  • git stash 命令详解
  • leetcode_560 和为K的子数组
  • C语言——————学习笔记(自己看)
  • 2025.7.27总结—新励成
  • Leetcode 3629. Minimum Jumps to Reach End via Prime Teleportation
  • 学习游戏制作记录(改进投掷剑的行为)7.27
  • 孤儿进程、僵尸进程和守护进程
  • 【element-ui】HTML引入本地文件出现font找不到/fonts/element-icons.woff
  • Android CameraX 使用指南:简化相机开发
  • 从零搭建3D激光slam框架-基于mid360雷达节点实现
  • [10月考试] C
  • 论文阅读-IGEV
  • Java进阶7:Junit单元测试
  • Windows10系统使用Cmake4.1.0构建工具+Visual Studio2022编译Opencv4.11教程
  • LabelImg:简洁高效的图像标注工具和下载
  • B站直播视频 | 深度讲解 Yocto 项目:从历史、架构到实战与趋势
  • Vue vuex模块化编码
  • 网络基础19:OSPF多区域实验
  • 中级全栈工程师笔试题
  • Maven之多模块项目管理
  • 什么是加密货币中的节点?
  • 【Linux系统编程】环境变量,进程地址空间与进程控制
  • 使用GIS中基于森林的分类与回归模型来估算房屋价值
  • 工业控制系统安全之 Modbus 协议中间人攻击(MITM)分析与防范
  • 解决ubantu系统下matplotlib中文乱码问题
  • 逆向入门(43)程序逆向篇-tsrh-crackme