嵌入式C语言位操作的几种常见用法
作为一名老单片机工程师,我承认,当年刚入行的时候,最怕的就是看那些密密麻麻的寄存器定义,以及那些让人眼花缭乱的位操作。
尤其是遇到那种“明明改了寄存器,硬件就是不听话”的情况,简直想把示波器砸了!那时心里默默吐槽:这谁设计的寄存器,就不能给个明确的开关按钮吗,非要让我扭来扭去?
其实,每个单片机工程师都经历过这段“痛苦”的旅程。在第一家公司,我特别佩服那个把NXP单片机寄存器玩得溜溜转的大佬,同时又对那些藏在代码深处的位操作充满恐惧。毕竟,一个不小心,就可能让你的程序跑飞,硬件罢工。
如果你也正为位操作而苦恼,那么恭喜你,找到了组织!这篇文章不会教你背诵晦涩的位操作定义,而是会用最通俗易懂的语言,带你掌握嵌入式C语言中位操作的几种常见用法。
学完之后,你不仅能轻松应对各种硬件控制任务,还能在代码优化方面更上一层楼。告别抓耳挠腮,让你也能在位操作的世界里“横着走”!
记得有一次做消费类产品,我负责一个资源非常紧张的51单片机项目,Flash和RAM都快要爆炸了。当时,我想尽各种办法优化代码,最后发现,使用位操作可以极大地压缩数据存储空间,提高程序的运行效率。
通过巧妙地运用位操作,我成功盘下了这个项目,节省了硬件成本,还赢得了老板欢心,后面我离职了几年,又以技术入股的方式把我请回去,从此踏入更大的坑,算了,血泪史,不说也罢。。。从那以后,我就也深刻体会到,掌握位操作,真的是单片机工程师的必备技能。
1.位操作,其实没那么可怕!
1.1 位操作的基石:二进制世界
在深入位操作之前,我们需要先回到二进制的世界。
单片机本质上就是处理二进制数据的机器,一切指令、数据,最终都会转化为0和1。所以,理解二进制是掌握位操作的基础。
举个例子,我们常说的“8位单片机”,指的是它的数据总线宽度是8位,也就是一次可以处理8个二进制位的数据。比如,0xAA(十六进制)在二进制中表示为10101010。而位操作,就是对这些二进制位进行各种各样的操作。
1.2 位与(&):提取信息的过滤器
位与操作符(&)的作用是,将两个操作数的对应位进行“与”运算。只有当两个位都为1时,结果才为1,否则为0。
uint8_t a = 0b10101010;
uint8_t b = 0b00001111;
uint8_t result = a & b; // result 的值为 0b00001010
位与操作最常见的应用场景是清除特定位和提取特定位。
-
清除特定位: 假设我们需要清除一个寄存器reg的第3位(从0开始计数),我们可以使用以下代码:
reg = reg & (~(1 << 3)); // 将第3位清零
这里,(1 << 3) 会生成一个掩码0b00001000,然后取反得到0b11110111。再与reg进行位与操作,就可以将第3位清零,而其他位保持不变。
-
提取特定位: 假设我们需要提取reg的第4位到第7位,可以使用以下代码:
uint8_t extracted = (reg >> 4) & 0x0F; // 提取第4位到第7位
这里,(reg >> 4) 会将reg右移4位,使得第4位到第7位移动到最低位。然后与0x0F(0b00001111)进行位与操作,就可以提取出第4位到第7位的值。
1.3 位或(|):设置信息的开关
位或操作符(|)的作用是,将两个操作数的对应位进行“或”运算。只要两个位中有一个为1,结果就为1,否则为0。
uint8_t a = 0b10101010;
uint8_t b = 0b00001111;
uint8_t result = a | b; // result 的值为 0b10101111
位或操作最常见的应用场景是设置特定位。
-
设置特定位: 假设我们需要设置reg的第2位为1,可以使用以下代码:
reg = reg | (1 << 2); // 将第2位设置为1
这里,(1 << 2) 会生成一个掩码0b00000100。然后与reg进行位或操作,就可以将第2位设置为1,而其他位保持不变。
1.4 位异或(^):翻转信息的魔法棒
位异或操作符(^)的作用是,将两个操作数的对应位进行“异或”运算。当两个位不同时,结果为1,相同时为0。
uint8_t a = 0b10101010;
uint8_t b = 0b00001111;
uint8_t result = a ^ b; // result 的值为 0b10100101
位异或操作最常见的应用场景是翻转特定位和简单加密。
-
翻转特定位: 假设我们需要翻转reg的第5位,可以使用以下代码:
-
reg = reg ^ (1 << 5); // 翻转第5位
这里,(1 << 5) 会生成一个掩码0b00100000。然后与reg进行位异或操作,就可以将第5位翻转(0变1,1变0)。
-
简单加密: 位异或操作可以用于简单的加密和解密。同一个数据与同一个密钥进行两次位异或操作,就可以恢复原始数据。
uint8_t data = 0x5A;
uint8_t key = 0x3C;
uint8_t encrypted = data ^ key; // 加密
uint8_t decrypted = encrypted ^ key; // 解密,恢复为 data
1.5 位取反(~):反转世界的钥匙
位取反操作符(~)的作用是,将操作数的每一位取反。
uint8_t a = 0b10101010;
uint8_t result = ~a; // result 的值为 0b01010101
位取反操作通常用于生成掩码,配合其他位操作实现更复杂的功能。比如,前面清除特定位的例子中,我们就用到了位取反。
1.6 左移(<<)和右移(>>):移形换影的魔术
左移操作符(<<)的作用是,将操作数的每一位向左移动指定的位数,右边补0。
右移操作符(>>)的作用是,将操作数的每一位向右移动指定的位数,左边补0(无符号数)或补符号位(有符号数)。
uint8_t a = 0b00000011;
uint8_t result_left = a << 2; // result_left 的值为 0b00001100
uint8_t result_right = a >> 1; // result_right 的值为 0b00000001
左移和右移操作最常见的应用场景是**乘以或除以2的幂**、**提取特定位**和**组合数据**。
-
乘以或除以2的幂: 左移n位相当于乘以2的n次方,右移n位相当于除以2的n次方。这比直接使用乘除法运算更快。
-
提取特定位: 就像前面提取reg的第4位到第7位的例子。
-
组合数据: 假设我们有两个8位数据,需要将它们组合成一个16位数据:
uint8_t high = 0x12;
uint8_t low = 0x34;
uint16_t combined = (high << 8) | low; // combined 的值为 0x1234
2. 实战演练:GPIO控制
说了这么多,我们来一个实战演练:使用位操作控制GPIO。
假设我们需要控制一个LED的亮灭,LED连接到GPIO的第5个引脚。
#define LED_PIN (1 << 5) // 定义LED引脚对应的掩码// 点亮LED
void led_on() {GPIO_PORT |= LED_PIN; // 设置GPIO引脚为高电平
}// 熄灭LED
void led_off() {GPIO_PORT &= ~LED_PIN; // 设置GPIO引脚为低电平
}// 翻转LED状态
void led_toggle() {GPIO_PORT ^= LED_PIN; // 翻转GPIO引脚状态
}
这个例子清晰地展示了位操作在控制硬件方面的简洁和高效。
3. 注意事项:别踩这些坑!
-
位宽问题: 确保操作的变量类型足够容纳所需的位数,避免数据溢出。
-
符号扩展: 在对有符号数进行右移操作时,注意符号位的扩展。
-
移位溢出: 移位位数不应超过变量的位宽,否则行为未定义。
-
优先级: 位操作符的优先级比较低,需要注意加括号,避免运算顺序错误。
位操作是嵌入式C语言的精髓,也是单片机工程师的必备技能。掌握位操作,你就能更高效地控制硬件,更巧妙地优化代码,在单片机世界里施展你的魔法。
希望这篇文章能帮助你打开位操作的大门,让你在嵌入式开发的道路上越走越远!记住,位操作不仅是技术,更是一种思考方式,它能让你以更精巧、更高效的方式解决问题。干吧,骚年。
最近很多粉丝问我单片机怎么学,我根据自己从业十年经验,累积耗时一个月,精心整理一份「单
片机最佳学习路径+单片机入门到高级教程+工具包」,全部无偿分享给铁粉!!!
除此以外,再含泪分享我压箱底的22个热门开源项目,包含源码+原理图+PCB+说明文档,让你迅速进阶成高手!
教程资料包和详细的学习路径可以看我下面这篇文章的开头。
《单片机入门到高级开挂学习路径(附教程+工具)》
《单片机入门到高级开挂学习路径(附教程+工具)》
《单片机入门到高级开挂学习路径(附教程+工具)》
相关文章:
嵌入式C语言位操作的几种常见用法
作为一名老单片机工程师,我承认,当年刚入行的时候,最怕的就是看那些密密麻麻的寄存器定义,以及那些让人眼花缭乱的位操作。 尤其是遇到那种“明明改了寄存器,硬件就是不听话”的情况,简直想把示波器砸了&am…...
数据库原理及应用mysql版陈业斌实验四
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。” 目录 实验四索引与视图 1.实验数据如下 student 表(学生表&…...
【免登录ORACLE,jdk8安装包下载】jdk-8u441-windows-i586.exe和jdk-8u441-windows-x64.exe有什么区别
jdk-8u441-windows-i586.exe和jdk-8u441-windows-x64.exe主要有以下区别: 我用夸克网盘分享了「jdk」,链接:https://pan.quark.cn/s/c72666843e2b 适用系统架构: jdk-8u441-windows-i586.exe适用于32位的Windows操作系统&#x…...
Oracle日志系统之附加日志
Oracle日志系统之附加日志 在 Oracle 数据库中,附加日志(Supplemental Log)是一种增强日志记录的机制,用于在数据库的 redo log 中记录更多的变更信息,尤其是在进行数据迁移、复制和同步等任务时,能够确保…...
从零到一:管理系统设计新手如何快速上手?
管理系统设计是一项复杂而富有挑战性的任务,它要求设计者具备多方面的知识和技能,包括需求分析、架构设计、数据管理、用户界面设计等。对于初次接触这一领域的新手而言,如何快速上手并成为一名合格的管理系统设计者呢?本文将从管…...
Web 前端包管理工具深度解析:npm、yarn、pnpm 全面对比与实战建议
引言: 在现代web前端开发中,包管理工具的重要性不言而喻,无论是构建项目脚手架,安装ui库,管理依赖版本,还是实现monorepo项目结构,一个高效稳定的包管理工具都会大幅提升开发体验和协作效率 作为一名前端工程师,深入了解这些工具背后的机制与差异,对于提升项目可维护性和团队…...
Windows 图形显示驱动开发-WDDM 1.2功能—Windows 8 中的 DirectX 功能改进(六)
一、具有多示例抗别名示例访问权限的 UAV Direct3D 11 允许光栅化到无序访问视图, (UAV) 没有呈现目标视图 (RTV) /DSV 绑定。 即使 UAV 可以具有任意大小,实现也可以使用视区/剪刀矩形的像素尺寸来操作光栅器。 DirectX 11 硬件的示例模式仅为单个示例…...
Jenkins 多分支流水线: 如何创建用于 Jenkins 状态检查的 GitHub 应用
使用 Jenkins 多分支流水线时,您可以将状态检查与 GitHub 拉取请求集成。 以下是状态检查的示例 要实现这些类型的状态检查,您需要创建一个与 Jenkins 主实例集成的 GitHub 应用。 在本博客中,我们将介绍如何创建一个 GitHub 应用ÿ…...
LeeCode912. 排序数组
给你一个整数数组 nums,请你将该数组升序排列。 你必须在 不使用任何内置函数 的情况下解决问题,时间复杂度为 O(nlog(n)),并且空间复杂度尽可能小。 示例 1: 输入:nums [5,2,3,1] 输出:[1,2,3,5]示例 2…...
Maven 简介(图文)
Maven 简介 Maven 是一个Java 项目管理和构建的工具。可以定义项目结构、项目依赖,并使用统一的方式进行自动化构建,是Java 项目不可缺少的工具。 Maven 的作用 提供标准化的项目结构:以前不同的开发工具创建的项目结构是不一样的…...
深入规划 Elasticsearch 索引:策略与实践
一、Elasticsearch 索引概述 (一)索引基本概念 Elasticsearch 是一个分布式、高性能的全文搜索引擎,其核心概念之一便是索引。索引本质上是一个存储文档的逻辑容器,它使得数据能够在高效的检索机制下被查询到。当我们对文档进行…...
基于X86/RK/全志+FPGA+AI工业一体机在电力接地系统中的应用方案
随着电力技术的发展和需求增加,智能电网建设受到全球关注。电力五防系统建设是确保我国电力安全的核心任务,接地管理系统是其中的关键部分,对电力系统的安全、稳定和高效运行至关重要。工业一体机,凭借其卓越的性能、稳定性和环境…...
论文阅读:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey https://arxiv.org/pdf/2407.18369 https://www.doubao.com/chat/3262156521106434 速览 研究动机&#x…...
JVM对象创建全过程
JVM对象创建全过程深度解析 1. 对象创建的整体流程 JVM创建对象的过程可以分为7个关键步骤,从类检查到内存分配,再到对象初始化: 类加载检查 → 内存分配 → 内存空间初始化 → 对象头设置 → 构造函数执行 → 栈帧引用建立 → 对象使用2.…...
ubuntu 22.04 使用ssh-keygen创建ssh互信账户
现有两台ubuntu 22.04服务器,ip分别为192.168.66.88和192.168.88.66。需要将两台服务器创建新用户并将新用户做互信。 创建账户 adduser user1 # 如果此用户不想使用密码,直接一直回车就行,创建的用户是没法使用用户密码进行登陆的 su - …...
蓝牙开发那些事儿12——(记一颗BLE芯片BringUp折腾过程)
1.背景 蓝牙这个系列已经很久很久没有更新了,感慨良多。 现在写这篇文章主要是BringUp一颗蓝牙芯片的过程中遇到了一些奇怪的问题,想了一些办法,一一克服了,看看对其他做蓝牙的同学有没有启发。 同时也安利一个叫做HACKRF的设备…...
从零构建 Vue3 登录页:结合 Vant 组件与 Axios 实现完整登录功能
在 Web 开发的世界里,登录页是用户与应用交互的第一道门槛,它的体验好坏直接影响着用户对整个应用的印象。本文将详细记录如何使用 Vue3、Vant 组件库和 Axios 构建一个兼具美观与实用的登录页面,并实现完整的登录逻辑与数据验证,…...
AutoSAR从概念到实践系列之MCAL篇(一)——MCAL架构及其模块详解
欢迎大家学习我的《AutoSAR从概念到实践系列之MCAL篇》系列课程,我是分享人M哥,目前从事车载控制器的软件开发及测试工作。 学习过程中如有任何疑问,可底下评论! 如果觉得文章内容在工作学习中有帮助到你,麻烦点赞收藏评论+关注走一波!感谢各位的支持! 老规矩,…...
多线程编程的简单案例——单例模式[多线程编程篇(3)]
目录 前言 1.wati() 和 notify() wait() 和 notify() 的产生原因 如何使用wait()和notify()? 案例一:单例模式 饿汉式写法: 懒汉式写法 对于它的优化 再次优化 结尾 前言 如何简单的去使用jconsloe 查看线程 (多线程编程篇1)_eclipse查看线程-CSDN博客 浅谈Thread类…...
万物互联时代,AWS IoT Core如何构建企业级物联网中枢平台?
在智能制造、智慧城市、车联网等场景爆发的今天,全球物联网设备数量已突破150亿台。企业如何高效管理海量设备并挖掘数据价值?AWS IoT Core作为亚马逊云科技推出的全托管物联网平台,正在为数千家企业提供设备连接、数据采集、实时分析的一站式…...
论文阅读:2023 arxiv Safe RLHF: Safe Reinforcement Learning from Human Feedback
总目录 大模型安全相关研究:https://blog.csdn.net/WhiffeYF/article/details/142132328 Safe RLHF: Safe Reinforcement Learning from Human Feedback https://arxiv.org/pdf/2310.12773 https://github.com/PKU-Alignment/safe-rlhf 速览 研究动机ÿ…...
链表相关算法题
小细节 初始化问题 我们这样子new一个ListNode 它里面的默认值是0,所以我们不能这样 如果我们为空,我们要返回null 节点结束条件判断(多创建节点问题) 参考示例3217 解析: 我的答案是多了一个无用节点 这是因为我每…...
招商信诺原点安全:一体化数据安全管理解决方案荣获“鑫智奖”!
近日,“鑫智奖 2025第七届金融数据智能优秀解决方案评选”榜单发布,原点安全申报的《招商信诺:数据安全一体化管理解决方案》荣获「信息安全创新优秀解决方案」。 “鑫智奖第七届金融数据智能优秀解决方案评选”活动由金科创新社主办&#x…...
实战篇|多总线网关搭建与量产验证(5000 字深度指南)
引言 1. 环境准备与硬件选型 1.1 项目需求分析 1.2 SoC 与开发板选型 1.3 物理接口与 PCB 设计 1.4 电源与供电保护 2. 软件架构与协议栈移植 2.1 分层架构详解 2.2 协议栈移植步骤 2.3 高可用驱动设计 2.4 映射逻辑与 API 定义 3. 开发流程与实践 3.1 敏捷迭代与里程碑 3.2 核…...
Jenkins 简易使用记录
一、Jenkins 核心功能与适用场景 核心功能: 持续集成(CI):自动构建代码、运行单元测试。持续交付(CD):自动化部署到测试/生产环境。任务调度:定时执行任务(如备份、清理&…...
第十四节:实战场景-何实现全局状态管理?
React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案(轻量级首选) // 创建全局 Context 对象 const GlobalContext createConte…...
启动vite项目报Unexpected “\x88“ in JSON
启动vite项目报Unexpected “\x88” in JSON 通常是文件被防火墙加密需要寻找运维解决 重启重装npm install...
Jenkins 多分支管道
如果您正在寻找一个基于拉取请求或分支的自动化 Jenkins 持续集成和交付 (CI/CD) 流水线,本指南将帮助您全面了解如何使用 Jenkins 多分支流水线实现它。 Jenkins 的多分支流水线是设计 CI/CD 工作流的最佳方式之一,因为它完全基于 git(源代…...
PHP腾讯云人脸核身获取NONCE ticket
参考腾讯云官方文档: 人脸核身 获取 NONCE ticket_腾讯云 前提条件,已经成功获取了access token。 获取参考文档: PHP腾讯云人脸核身获取Access Token-CSDN博客 public function getTxFaceNonceTicket($uid) {$access_token file_get_c…...
云计算(Cloud Computing)概述——从AWS开始
李升伟 编译 无需正式介绍亚马逊网络服务(Amazon Web Services,简称AWS)。作为行业领先的云服务提供商,AWS为全球开发者提供了超过170项随时可用的服务。 例如,Adobe能够独立于IT团队开发和更新软件。通过AWS的服务&…...
51单片机实验五:A/D和D/A转换
一、实验环境与实验器材 环境:Keli,STC-ISP烧写软件,Proteus. 器材:TX-1C单片机(STC89C52RC)、电脑。 二、 实验内容及实验步骤 1.A/D转换 概念:模数转换是将连续的模拟信号转换为离散的数字信…...
重构未来智能:Anthropic 解码Agent设计哲学三重奏
第一章 智能体进化论:从工具到自主体的认知跃迁 1.1 LLM应用范式演进图谱 阶段技术形态应用特征代表场景初级阶段单功能模型硬编码规则执行文本摘要/分类进阶阶段工作流编排多模型协同调度跨语言翻译流水线高级阶段自主智能体动态决策交互编程调试/客服对话 1.1.…...
MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构
MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构 文章目录 MCP协议在纳米材料领域的深度应用:从跨尺度协同到智能研发范式重构一、MCP协议的技术演进与纳米材料研究的适配性分析1.1 MCP协议的核心架构升级1.2 纳米材料研发的核心挑战与…...
.NET Core 服务实现监控可观测性最佳实践
.NET Core 概述 .Net Core 是一个开源的、跨平台的高性能框架,由微软开发并维护,现由 .NET Foundation 提供支持。它用于构建现代化、可扩展的云端和本地应用程序,支持开发 Web 应用、微服务、API、物联网应用以及移动后端服务,是…...
ios精灵脚本辅助软件,有根和无根roothide越狱区别
最新版本的ios按键精灵app 支持到15-16系统,可以在半越狱环境下和无根越狱环境安装,对于很多用户一直不理解有根和无根之间的差别,今天简单介绍下 最高权限和部分权限的区别 1、有根越狱 – 有系统根目录读写权限(通过越狱软件可…...
ChatGPT-o3辅助学术大纲效果如何?
目录 1 引言 2 背景综述 2.1 自动驾驶雷达感知 2.2 生成模型演进:从 GAN 到 Diffusion 3 相关工作 3.1 雷达点云增强与超分辨率 3.2 扩散模型在数据增广中的应用 4 方法论 4.1 问题定义与总览 4.2 数据预处理与雷达→体素表示 4.3 潜在体素扩散网络&…...
PyCharm 2024.3.5 状态栏添加前进后退按钮
操作路径:Appearance & Behavior -> Menu and Toolbars -> Main Toolbar -> Left -> Add… 按钮位置:Main Menu -> Navigate -> OK 最终效果...
【CPP】死锁产生、排查、避免
一、死锁产生 死锁是指两个或多个线程互相等待对方释放资源,导致程序无法继续执行的现象。在多线程编程中,死锁是一种常见且严重的并发问题。死锁产生必须要四个条件同时满足才会发生: 互斥条件:某些资源只能由一个线程占用。占…...
深入理解 Android Handler
一、引言 Handler 在安卓中的地位是不言而喻的,几乎维系着整个安卓程序运行的生命周期,但是这么重要的一个东西,我们真的了解它吗?下面跟随着我的脚步,慢慢揭开Hanler的神秘面纱吧! 本文将介绍Handler 的运…...
Git 进阶之路:高效协作之分支管理
🌈 个人主页:Zfox_ 🔥 系列专栏:Git 企业级应用 目录 一:🔥 分⽀管理 🦋 理解分⽀🦋 创建分⽀🦋 切换分⽀🦋 合并分⽀🦋 删除分⽀🦋 合…...
LeetCode 2364.统计坏数对的数目:反向统计
【LetMeFly】2364.统计坏数对的数目:反向统计 力扣题目链接:https://leetcode.cn/problems/count-number-of-bad-pairs/ 给你一个下标从 0 开始的整数数组 nums 。如果 i < j 且 j - i ! nums[j] - nums[i] ,那么我们称 (i, j) 是一个 坏…...
6.Rust+Axum:打造高效 WebSocket 实时通信聊天室
摘要 本文详细介绍 RustAxum 在 WebSocket 实时通信开发中的应用,包括双向通信、状态管理等,实践构建聊天室应用。 一、引言 在当今的 Web 应用开发中,实时通信变得越来越重要。WebSocket 作为一种在单个 TCP 连接上进行全双工通信的协议&…...
【硬件系统架构】冯·诺依曼架构
一、引言 在计算机科学的广袤领域中,冯诺依曼架构犹如一颗璀璨的恒星,照亮了现代计算机发展的道路。从我们日常使用的个人电脑到强大的数据中心服务器,几乎都基于这一架构构建。它的出现是计算机发展史上的一个重要里程碑,深刻地影…...
Android 13 关闭屏幕调节音量大小
一、问题描述 在Android 13系统中,通过修改frameworks/base/core/res/res/values/config.xml配置文件,实现灭屏状态下调节音量的功能。 二、修改内容 diff --git a/frameworks/base/core/res/res/values/config.xml b/frameworks/base/core/res/res/values/config.xml inde…...
[编程基础] Java · 学习手册
🔥 《Java 工程师修炼之路:从零构建系统化知识体系》 🔥 🛠️ 专栏简介: 这是一个以工业级开发标准打造的 Java 全栈技术专栏,涵盖语言核心、并发编程、JVM 原理、框架源码、架构设计等全维度知识体系。专…...
探索元生代:ComfyUI 工作流与计算机视觉的奇妙邂逅
目录 一、引言 二、蓝耘元生代和 ComfyUI 工作流初印象 (一)蓝耘元生代平台简介 (二)ComfyUI 工作流创建是啥玩意儿 三、计算机视觉是个啥 (一)计算机视觉的基本概念 (二)计算…...
C++ 迭代器失效详解:如何避免 vector 操作中的陷阱
目录 1. 什么是迭代器失效? 2. 哪些操作会导致迭代器失效? 2.1 vector 的插入操作(push_back, insert) 示例:push_back 导致迭代器失效 如何避免? 2.2 vector 的删除操作(erase, pop_back&…...
【fisco bcos】基于ABI调用智能合约
参考官方文档:https://fisco-bcos-documentation.readthedocs.io/zh-cn/latest/docs/sdk/java_sdk/assemble_transaction.html 先放一下智能合约: (就是一个很简单的插入和查找嗯) pragma solidity ^0.4.25; pragma experimental…...
【Python学习笔记】Pandas实现Excel质检记录表初审、复核及质检统计
背景: 我有这样一个需要审核的飞书题目表,按日期分成多个sheet,有初审——复核——质检三个环节,这三个环节是不同的同学在作业,并且领到同一个题目的人选是随机的,也就是说,完成一道题的三个人…...
Springboot 自动装配原理是什么?SPI 原理又是什么?
1. Spring Boot 自动装配原理 自动装配是 Spring Boot 简化配置的核心机制,其核心思想是根据类路径中的依赖自动配置 Spring 应用。 关键步骤: 启动注解 SpringBootApplication 该注解组合了 EnableAutoConfiguration,用于激活自动配置。 …...