avatar
文章
44
标签
91
分类
9
首页
STM32专栏
算法题
C++
嵌入式
关于我
CJJ的小站
搜索
首页
STM32专栏
算法题
C++
嵌入式
关于我

CJJ的小站

原码、反码、补码:为什么计算机只用「加法」就能做减法
发表于2026-09-27|计算机基础
计算机里的加法器只懂 +,但我们又必须能做减法。原码、反码、补码就是为这个问题设计的三层「表示同一数字的不同方式」。这一篇从问题出发,把它们的来历、关系和实际计算流程串清楚。 一、计算机怎么表示一个数字1. 二进制位与「符号位」假设我们用 8 位二进制表示一个整数。最高位(第 7 位)当作「符号位」: 0 = 正数 1 = 负数 剩下的 7 位存「数值部分」(按二进制位权)。 举例: 十进制 二进制(8 位) 含义 +14 0 0001110 符号位 0(正),数值 0001110 = 14 −21 1 0010101 符号位 1(负),数值 0010101 = 21 为什么符号位只能放最前面? 因为它不参与位权计算,把它放最左/最右都行,统一约定放最左(最高位)方便电路判断正负。 1.1 8 位能表示的范围 编码方式 最小值 最大值 个数 无符号 0 255 256 有符号(任一编码) −128 +127 256 无论用哪种编码,256 个编码对应 256 个数字,总数不变。 二、三种编码设正数 $x$ 的二进制绝对...
进制转换:从二进制、八进制、十六进制到十进制的速算
发表于2026-09-27|计算机基础
这一篇把「二进制、八进制、十进制、十六进制」之间的相互转换整理成一份速查表,每一种都配一个具体例子的手工计算步骤。 记号约定: 数字后缀 (B)=二进制、(O)=八进制、(D)=十进制、(H)=十六进制 十六进制字母 (\text{A}=10)、(\text{B}=11)、(\text{C}=12)、(\text{D}=13)、(\text{E}=14)、(\text{F}=15) 一、四个核心概念1. 基数进制就是「每一位上能用几个数字」。每进一位就乘一次基数 (r): 进制 基数 (r) 数字范围 二进制 (B) 2 0, 1 八进制 (O) 8 0 ~ 7 十进制 (D) 10 0 ~ 9 十六进制 (H) 16 0 ~ F 2. 位权第 (i) 位(从右往左,从 (0) 开始数)的权值是 (r^i)。例如二进制 10110(5 位)的位权依次是 (2^4, 2^3, 2^2, 2^1, 2^0): 123位号: 4 3 2 1 0数字: 1 0 1 1 0位权: 16 8 4 2 1 3. 按权展开(任意进制 → 十进制的通用公...
STM32 入门笔记 04:旋转编码器与双 EXTI 中断
发表于2026-09-27|嵌入式学习
这是 STM32 入门笔记专栏的第 04 篇。在会了 EXTI 之后,再用它做点「有意思」的事——旋转编码器:拧一下旋钮,单片机就能分辨出是「顺时针」还是「逆时针」转了一格。 一、什么是旋转编码器旋转编码器是一种「拧一格、输出两相脉冲」的机电元件,常见的是 EC11 系列(淘宝几块钱一只)。它有 3 个引脚:A 相、B 相、GND(有的型号中间还多一个 C 接 VCC,按键按下才接通的「中心轴按下」功能)。 波形长相(理想情况下): 12A 相: _____|‾‾‾‾|_____ 上升 → 下降B 相: __|‾‾‾‾|_____ 在 A 之前就上升 旋转方向不同,A、B 相谁先变化也不同: 旋转方向 A 边沿时 B 的状态 顺时针 A 上升时 B = 0;A 下降时 B = 1 逆时针 A 上升时 B = 1;A 下降时 B = 0 推论:只要在 A 的某个边沿(比如下降沿)触发中断,进去读 B 现在的电平,就能判断方向。 二、接线约定 A 相 → PA0(EXTI0,独立 IRQ,方便调试) B 相 → PB0(EXTI0...
STM32 入门笔记 03:EXTI 外部中断——原理 + 对射式红外计次
发表于2026-09-27|嵌入式学习
这是 STM32 入门笔记专栏的第 03 篇。在能按键检测之后,轮询 (while(!key)) 已经不够用了——本篇引入中断机制,让 CPU 在按键被按下时才被「打断」去处理,其它时间可以睡觉、做别的事。 一、为什么需要中断想象你守在门口等快递: 轮询(poll):每秒钟起来看一眼门口有没有快递——你啥也别干了; 中断:坐下来睡觉,快递小哥敲门时再起床——绝大多数时间都在做自己的事。 单片机里也是一样的: 轮询:CPU 不断读按键引脚电平,99% 时间都是浪费的; 中断:CPU 跑主循环,按键变化时硬件自动打断 CPU,让它先跑中断函数,处理完再回来。 STM32 的中断系统分为两层: 缩写 全称 作用 NVIC Nested Vectored Interrupt Controller 内核里的「中断总管家」,负责优先级分组、嵌套、使能 EXTI External Interrupt 把 GPIO 引脚的电平变化转成「中断事件」 二、NVIC 的优先级分组STM32 把优先级分成两类: 名称 作用 类比 抢占优先级 决定「...
STM32 入门笔记 02:OLED 显示屏与硬件接线注意
发表于2026-09-27|嵌入式学习
这是 STM32 入门笔记专栏的第 02 篇。在能点亮 LED 之后,下一步通常是把 OLED 显示屏接上,单片机把数据 / 文字显示出来,能让调试过程直观得多。 一、OLED 是什么OLED(Organic Light-Emitting Diode,有机发光二极管)是一种自发光显示技术,每个像素都能自己发光,不需要背光。在嵌入式领域常见的是 0.96 寸 128×64 单色 OLED 屏,通常用 SSD1306 这颗驱动芯片,支持 I²C 或 SPI 两种通信接口(看型号后缀,4 针的几乎都是 I²C)。 特点: 薄、轻、功耗低——适合手持 / 可穿戴设备; 对比度高——黑的真黑,亮字清晰; 每个像素独立发光——理论上响应时间比 LCD 快; 寿命有限——蓝色像素老化得最快,长时间高亮度全亮会烧屏; 接口简单——4 根线(VCC / GND / SCL / SDA)就能用 I²C 驱动。 二、4 针 I²C OLED 的引脚定义江科大最小系统板上常见的是 0.96 寸 4 针 I²C 模块,引脚定义如下: 引脚 名称 说明 VCC 电源 接 3.3V(绝...
STM32 入门笔记(专栏索引)
发表于2026-09-27|嵌入式学习
这一篇是「STM32 入门笔记」专栏的索引页,列了到目前为止每一篇的链接与一句话简介,方便按顺序学习。 专栏说明 目标读者:跟我一样刚入门 STM32 嵌入式开发的同学,主要跟随江科大 / 江协科技 STM32 入门教程的进度。 代码风格:所有示例都用 STM32F103 标准外设库(固件库 v3.5),对应江科大那种「寄存器 + 库函数」混讲的风格。HAL 库 / CubeMX 的 API 名不同,但物理意义可以对照。 阅读顺序:建议从 01 开始按顺序看,每篇都假设你已经看过前面的内容。 目录 篇号 标题 关键内容 链接 01 从点亮一颗 LED 到能看懂固件库 GPIO 的 8 种模式、SetBits / ResetBits 方向、流水灯、Set/Reset 与高低电平对应关系、stdint ↔ STM32 别名 01 从点亮一颗 LED 到能看懂固件库 02 OLED 显示屏与硬件接线注意 有机发光二极管原理、4 针 / 7 针 OLED 引脚定义、杜邦线长度对显示的影响 02 OLED 显示屏与硬件接线注意 03 EXTI 外部中断:原理 + 对...
STM32 入门笔记 01:从点亮一颗 LED 到能看懂固件库
发表于2026-09-27|嵌入式学习
这一篇是 STM32 入门笔记专栏的第一篇,覆盖「点亮一颗 LED」用到的全部固件库调用,再把容易踩坑的几个细节——GPIO 8 种模式、SetBits/ResetBits 的方向、固件库自带的别名——串成一张能用得上的清单。 约定:除非另说,文里所有示例都是基于 STM32F103 标准外设库(也叫「标准库 / 固件库 v3.5」),对应江科大 / 江协科技入门课程那种「寄存器+库函数」混讲的版本。CubeMX / HAL 库的 API 名不一样(HAL_GPIO_WritePin 等),但物理意义是一致的。 一、点亮一颗 LED 的最小步骤以 PC13 引脚接的一颗 LED 为例(很多最小系统板上 PC13 是板载 LED),点亮它要干三件事: 打开 GPIOC 外设的时钟; 把 PC13 配置成「推挽输出」模式; 把 PC13 输出低电平(注意:很多板载 LED 是低电平点亮的,见下文)。 1.1 开时钟STM32 上外设默认是关时钟的(为了省电),用之前必须先开: 1RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENAB...
P1150 Peter 的烟 —— 一道看似绕、其实一步推完的小题
发表于2026-09-27|算法学习
题目链接:P1150 Peter 的烟 - 洛谷 一、题目复述Peter 有 n 根烟,每抽完 k 根烟的烟蒂可以换一根新烟。Peter 可以无限次地用烟蒂换烟。问 Peter 一共能抽多少根烟。 数据范围:1 ≤ n, k ≤ 10⁶。 样例:n = 3, k = 2 → 输出 5(抽完 3 根得 3 个烟蒂 → 换 1 根 → 抽完又得 1 个烟蒂,共 5 根)。 二、直觉:循环模拟最直观的写法是「不断用烟蒂换烟,直到不够为止」: 12345678910111213141516171819#include <iostream>using namespace std;int main() { long long n, k; cin >> n >> k; long long total = n; // 已经抽的烟数(也是手里烟蒂数) long long butts = n; // 当前手里的烟蒂数 while (butts >= k) { long...
数位统计:求 m~n 中数字 d 出现的次数
发表于2026-09-27|算法学习
求「m 到 n 区间内数字 d 出现了多少次」,最直接的思路是把区间拆成两半: \text{ans} = f(n) - f(m - 1)其中 f(x) 表示「数字 d 在区间 [0, x] 里出现了多少次」。这一篇重点讲 f(x) 的数位统计法,并把它压成「一行公式」。 一、思路把数字 x 按十进制一位一位看: 12x = high cur low base = high * base * 10 + cur * base + low 其中: 名字 含义 base 当前位的权值(1、10、100、…) cur 当前位的数字(0 ~ 9) high 比 cur 高的部分(左侧) low 比 cur 低的部分(右侧) 例:x = 1304,base = 100,则 high = 1、cur = 3、low = 4。 我们的任务是:在 [0, x] 中,当前位上出现 d 的次数有多少。设这个贡献为 Δ,则 f(x) = Σ Δ。 按 cur 和 d 的大小关系,分三种情况讨论。 二、分情况讨论2.1 cur < d当前位自己已经是 d 了,...
编程小技巧,小知识
发表于2026-09-27|C++学习
这一篇把做题时反复会用到、但每次都要重新查的几条「代码模板」和「容易踩坑」记一下,每个都附最简可运行例子。 一、读整数直到文件结束OJ(在线判题)里经常出现「不告诉你有多少个输入,要读到文件尾」的情况。模板: 1234int value;while (cin >> value) { // 读不到就结束(文件尾 / 类型不符 / EOF) // 在这里处理 value} 同理可读 string、double、char: 12string s;while (cin >> s) { /* ... */ } 注意点:cin >> 会跳过空白字符(空格、换行、制表符),所以一行多个数或一行一个数都能正确读,不需要额外处理。 输入完之后,按: Ctrl + Z,然后再敲一下回车 → 触发 EOF,循环结束。 Linux/Mac 是 Ctrl+D 二、循环 n 次while (n--) 是最简洁的写法: 1234int n = 5;while (n--) { cout <&...
12345
avatar
CJJ
CJJ的个人博客,分享技术分析和生活记录
文章
44
标签
91
分类
9
Follow Me
最新文章
递归枚举:二叉树递归版 vs for 多叉版2026-11-08
算法竞赛常用变量/函数简写2026-11-07
C++ type_traits:编译期类型查询与类型变换2026-10-15
C++ 六大特殊成员函数:= default / = delete、平凡可复制与标准布局2026-10-14
C++ constexpr:让计算发生在"编译期"2026-10-13
分类
  • C++学习22
  • STM32学习1
  • 个人规划1
  • 嵌入式学习5
  • 工具1
  • 日常1
  • 算法学习9
  • 计算机基础3
标签
NVIC 枚举 数制 考研 智能指针 DFS 内存布局 模拟 sort 随笔 STM32 模板 类型推导 RAII 函数指针 C++11 命名规范 栈 前缀和 二进制枚举 速查 内存管理 特殊成员函数 签证 虚函数 数据结构 函数对象 STL 继承 数论 EXTI 蓝桥杯 专栏索引 异或 宏定义 OLED 洛谷 try-catch 运算符重载 函数模板
归档
  • 十一月 2026 2
  • 十月 2026 18
  • 九月 2026 24
网站信息
文章数目 :
44
本站访客数 :
本站总浏览量 :
最后更新时间 :
© 2025 - 2026 By CJJ框架 Hexo 8.1.2|主题 Butterfly 5.7.0
搜索
数据加载中