当前位置: 首页 > 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.dtcms.com/a/301147.html

相关文章:

  • Linux: 调试器gdb/cgdb
  • 第六章 JavaScript 互操(2).NET调用JS
  • K-近邻算法
  • MPLS LDP(概念)
  • 20250707-2-Kubernetes 网络-Ingress暴露应用(http与https)_笔记
  • Flink窗口:解锁流计算的秘密武器
  • JavaEE初阶第十二期:解锁多线程,从 “单车道” 到 “高速公路” 的编程升级(十)
  • KingbaseES聚焦产品上线
  • 卫星图像语义分割与区域相似度比较研究
  • 顺序表算法题
  • 【自动化运维神器Ansible】Ansible常用模块之hostname模块详解
  • Qt C++动态库SDK在Visual Studio 2022使用(C++/C#版本)
  • ae烟雾-分形杂色
  • Python——入门
  • 金融科技里的信用评分、指纹识别、面部识别、虹膜识别
  • 地震成果数据在线可视化功能实现之高级篇
  • 枚举中间位置基础篇
  • Mysql中的索引详解
  • 「iOS」————MRC
  • 【Linux系统编程】环境变量,进程地址空间与进程控制
  • OpenResty 高并发揭秘:架构优势与 Linux 优化实践
  • IIS发布.NET9 API 常见报错汇总
  • 设计模式(九)结构型:组合模式详解
  • STM32的蓝牙通讯(HAL库)
  • 【ELasticsearch】温、冷数据节点能是同一个节点吗
  • 探秘 Nginx 的工作原理
  • Python Pandas.qcut函数解析与实战教程
  • 前后端分离:架构模式与实践
  • 设计模式(十二)结构型:享元模式详解
  • 基于黑马教程——微服务架构解析(一)