<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="atom.xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Watermelonabc</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://watermelonabc.top/</id>
  <link href="https://watermelonabc.top/" rel="alternate"/>
  <link href="https://watermelonabc.top/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Watermelonabc</rights>
  <subtitle>欢迎来到 Watermelonabc 的 Blog 🥳，一个蒟蒻 CTFer 的自留地~</subtitle>
  <title>Watermelonabc的Blog</title>
  <updated>2026-08-06T05:38:34.000Z</updated>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="杂记" scheme="https://watermelonabc.top/categories/%E6%9D%82%E8%AE%B0/"/>
    <category term="other" scheme="https://watermelonabc.top/tags/other/"/>
    <content>
      <![CDATA[<p>新发正式版的 Hacker 模拟游戏：<a href="https://store.steampowered.com/app/2980270/HackHub__Ultimate_Hacker_Simulator/">HackHub - Ultimate Hacker Simulator</a>，属于渗透 / 红队领域</p><p>正如制作组所说的 “A hacking game that actually feels real”<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>，此游戏的一个优势在于制作组确实构建了一个真实向的终端环境——简化的 KDE 桌面、Firefox、Discord、apt-get、bash 等，还有 Gmail、Twitter（小蓝鸟复活）、Github，并引入了一些真实存在的 CLI 工具。至少这个游戏没有追求炫酷但何意味的 “过场动画式” 工具，而选择融入实际的命令行。</p><div class="tag-plugin image"><div class="image-bg" style="padding:6px;aspect-ratio:2560/1600;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/hackhub-ui.webp" alt="Hackhub游戏界面" data-fancybox="true" onerror="this.src='/asset/image/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(/asset/image/Fructose-Content-running-medium.webp);"></div></div><div class="image-meta"><span class="image-caption center">Hackhub 游戏界面</span></div></div><p>不过，既然是游戏，那么就存在 “不是那么现实” 的情况。比如前期游戏就虚构了一个信息搜集工具，堪称 “一键开盒”，但是很多理应存在的信息却显示 No data，只输出任务直接相关的信息。以及有些任务也是出于 “游戏性” 考虑的。</p><p>我玩的是学习版，还没有玩多少内容…… 原价￥48，一般打八折。我不会花这个钱的，不如真的去装个 Linux 虚拟机，真的去安装并使用那些实际存在的工具。这种游戏还是属于激发兴趣、简要入门以及安全的 Playground</p><p>看了一下创意工坊（对，支持 MOD），现在社区都做出了暗网、媒体播放器、NES 模拟器、密码管理器、加密货币以及 <code>python-is-python3</code> 🤣，那么什么时候进化到支持引入 AI 呢？</p><p>封面来自制作组 <a href="https://hotbunny.dev">Hotbunny Interactive</a></p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p><a href="https://hotbunny.dev/hackhub">Hackhub | Hotbunny Interactive</a> <a href="#fnref1" class="footnote-backref">↩︎</a></p></li></ol></section>]]>
    </content>
    <id>https://watermelonabc.top/p/4be45b93/</id>
    <link href="https://watermelonabc.top/p/4be45b93/" rel="alternate"/>
    <link href="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/hackhub-banner.webp" rel="enclosure" type="image/webp"/>
    <published>2026-08-04T03:19:57.000Z</published>
    <summary>至少构建了一个真实向的终端环境</summary>
    <title>又一个黑客模拟游戏</title>
    <updated>2026-08-06T05:38:34.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="杂记" scheme="https://watermelonabc.top/categories/%E6%9D%82%E8%AE%B0/"/>
    <category term="other" scheme="https://watermelonabc.top/tags/other/"/>
    <content>
      <![CDATA[<p>今天帮三升四的弟弟（对，我俩差了 12 岁，正好两个都属 🐔）辅导了一下课业，几个感想：</p><ol><li>“知识的诅咒” 发力了，应用题我一开始想着列个方程，但是根据课标教材，三年级的数学工具不支持；后面想到分数乘法，结果三年级也没有直接的说明；最后用 “几份几份” 将这些问题转化为整数的四则运算。（之后翻了三年级上册课本才发现此时的数学工具也是这样做的）</li><li>也许是习题集的问题吧，整数列式计算中间出了一两道小数除法，三年级教材也没有说明。但是从整数转到小数除法，采用知其然的说法（被除数小数点点哪，商的小数点就点哪）也不难。当然我小学时也有这个问题，老师没讲就说不知道（</li><li>答题卷面很糟糕，数学符号和汉字写得都比较乱。我在幼小阶段是很痛恨练字的，但是如果卷面呈现出来是这个样子的话我认为还是有必要练一练整齐度的，实在不行出个 “昏招”：课堂开小差就琢磨着数字的 N 种写法（</li><li>不理解上下文，上一行公式的结果到下一行就忘了。可能是我们在旁边指导吧，他开始 “大脑外置”。“12 个人分成 3 份，1 份 4 个人，三分之一，三份取一份，女生一份，请问女生几个人？” 结果先回答 8 人（男生）然后回答 1 份。这还是三年级上册课本的例题！</li><li>至少令我欣慰的一点是，当我不去指导应用题时，他会去翻我讲过的题目作为参考，虽然那些题目的格式相似，但至少有点 “举一反三” 的意味在了。</li><li>英语，粗劣的手写体不怪他，但是听写单词能不能别像搜索一样，写错回退换一个字母试试？！虽然以我的教育体验来讲，小学英语的差距可以在初中弥补，但我现在又不确定了。</li></ol><blockquote><p>“现阶段我国还有少部分地区师资欠缺、开课不足，一些孩子的英语基础相对薄弱，为此我们在七年级上册设计并调整了第一单元作为预备学习单元，供你们选用。”——义务教育教科书《英语》科学普及出版社 2011 年课标版本。在 2022 年课标版本里，预备学习单元的内容被压缩。</p></blockquote><p>“当教育制度开始改革，往往又是一次代际更替，而前人则带着旧体制的烙印进入社会”。十二年，已经过了 “十年树木” 的阶段，而现在的基础教育实践已经和我所经历过的有了差距。随着 “素质教育” 和 “减负” 的提出，一部分的学习任务从学校转移到家庭，而很显然，我们貌似没能适应这种变化。</p><p>家里人给他买了某知名教培品牌的学习平板，比我小学时期的步步高不知道高级多少。它也内置了很多表面亮丽的学习游戏，但看来没有起到激发学习兴趣的作用。这类游戏完全比不过娱乐视频，只能是面对更加无趣的一般学习模块时的备选：事实如此，当要求学单词时，他打开的是闯关游戏，而不是一般的单词模块（类似百词斩、不背单词这种）</p><p>而对于一般平板呢？他之前还用着 2020 年买的华为平板，满是各种钓鱼小游戏。屏幕摔过不知多少次，甚至露出了内部的背光模块和电子元件。最后被我妈一怒之下格式化了。</p><p>现在，就在我旁边，他拿着学习平板，观看着视频资源——吐槽恶搞学校生活的动画，本质上和我以前看过的《茶啊二中》相似。不知是平板一开始就开放的，还是由于我父亲的宽松管控而开放的。再想到我装个 “欧路词典” 都要家长授权、单词学习界面滥用思源黑体（这种字体应该选择手写风格的，比如 ABeeZee），只能说依旧草班台子。</p><p>小时候我也想过：要当一个 “好” 家长。但现在来看，我也开始重演上一辈的 “打击教育”；我也是个脾气不好、缺乏耐心的人啊。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/84608961/</id>
    <link href="https://watermelonabc.top/p/84608961/" rel="alternate"/>
    <published>2026-07-31T13:06:44.000Z</published>
    <summary>一代人有一代人的教育</summary>
    <title>家庭辅导一晚，有点感想</title>
    <updated>2026-08-10T11:20:31.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="复习笔记" scheme="https://watermelonabc.top/categories/%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="FZU" scheme="https://watermelonabc.top/tags/FZU/"/>
    <content>
      <![CDATA[<blockquote><p>最终成绩：87 分<br>考试说明：闭卷形式，选择题 + 程序填空题 + 计算题 + 简答题</p></blockquote><h2 id="CH1-嵌入式系统概述"><a class="header-anchor" href="#CH1-嵌入式系统概述"></a>CH1 嵌入式系统概述</h2><h3 id="1、嵌入式系统的定义"><a class="header-anchor" href="#1、嵌入式系统的定义"></a>1、嵌入式系统的定义</h3><p>以应用为中心，以计算机技术为基础，软硬件可裁剪，适应应用系统对功能、可靠性、安全性、成本、体积、重量、功耗、环境等方面有严格要求的专用计算机系统。</p><h3 id="2、嵌入式系统和通用计算机系统的比较（共同点和不同点）、嵌入式系统的特点"><a class="header-anchor" href="#2、嵌入式系统和通用计算机系统的比较（共同点和不同点）、嵌入式系统的特点"></a>2、嵌入式系统和通用计算机系统的比较（共同点和不同点）、嵌入式系统的特点</h3><p>共同点：都属于计算机系统，由硬件和软件组成；工作原理相同，都属存储程序机制；从硬件上看，嵌入式系统和通用计算机系统都是由 CPU、存储器、I/O 接口和中断系统等部件组成；从软件上看，嵌入式系统软件和通用计算机软件都可以划分为系统软件和应用软件两类。</p><p>不同点：形态，功能，资源，价值，功耗，开发方式。</p><p>特点：专用性强、可裁剪性、实时性好、可靠性高、生命周期长、不易被垄断</p><h3 id="3、嵌入式系统的架构：冯･诺依曼结构和哈佛结构"><a class="header-anchor" href="#3、嵌入式系统的架构：冯･诺依曼结构和哈佛结构"></a>3、嵌入式系统的架构：冯･诺依曼结构和哈佛结构</h3><p>冯･诺依曼结构：采用二进制逻辑、程序存储执行以及计算机由五个部分组成（运算器、控制器、存储器、输入设备、输出设备）</p><p>哈佛结构（存储器结构）：程序存储器和数据存储器是两个独立的存储器，每个存储器独立编址、独立访问。</p><h3 id="4、嵌入式系统处理器：MPU、MCU、DSP、SoC"><a class="header-anchor" href="#4、嵌入式系统处理器：MPU、MCU、DSP、SoC"></a>4、嵌入式系统处理器：MPU、MCU、DSP、SoC</h3><p>分别为微处理器 (MPU)、微控制器（MCU，俗称单片机）、数字信号处理器 (DSP) 和嵌入式片上系统（System on Chip ，简称 SoC）</p><p>MCU 的特点是集成度高、控制能力强、可靠性强、低功耗、性价比高、系统设计周期短。最大特点是单片化，体积大大减小，从而使功耗和成本下降，可靠性提高。</p><h3 id="5、MCU的基本组成：CPU、时钟、存储器、通用I-O、定时器-计数器、外设等"><a class="header-anchor" href="#5、MCU的基本组成：CPU、时钟、存储器、通用I-O、定时器-计数器、外设等"></a>5、MCU 的基本组成：CPU、时钟、存储器、通用 I/O、定时器/计数器、外设等</h3><p>单片机的 CPU 由运算器和控制器组成，有运算和控制的功能。单片机的指令代码就是通过 CPU 执行的。</p><p>时钟时钟本质上就是固定频率的脉冲信号，为 MCU 工作提供基准时序。时钟频率直接决定了 MCU 的执行速度。</p><p>单片机的存储器包括存放代码指令的<strong> ROM</strong>（或 Flash），以及存放变量、数据的<strong> SRAM</strong>。</p><p>通用 I/O 口 (GPIO) 可以当作输入或输出接口。大部分单片机为了减少引脚数量，I/O 口还复用作为其它特殊功能引脚，比如 PWM 输出、捕获输入、串行通信、外部中断输入等。</p><p>定时器 / 计数器能够提供精确定时，或者对外部事件进行计数。内部硬件本质是计数器，当计数器脉冲来源是固定频率脉冲时，可通过计数来实现计时。</p><p>MCU 常用的外设模块有：模数转换模块 (ADC)、PWM 模块、捕获模块 (CAP)、通信模块等等。不同芯片有不同的外设配置</p><h3 id="6、CPU功能"><a class="header-anchor" href="#6、CPU功能"></a>6、CPU 功能</h3><p>CPU 有运算和控制的功能。单片机另外增设了 “面向控制” 的处理功能，如位处理、查表、跳转、乘除法运算、状态检测、中断处理等，增强了实用性。</p><h3 id="7、总线BUS：地址总线、数据总线、控制总线"><a class="header-anchor" href="#7、总线BUS：地址总线、数据总线、控制总线"></a>7、总线 BUS：地址总线、数据总线、控制总线</h3><p>总线是一组相关逻辑信号的集合。不同芯片有不同的总线标准。</p><p>地址总线 (Address Bus, AB)：单向，用于传递地址信息。地址线的数目决定了可寻址的存储空间。一根地址线有两种状态，即可以区分两个不同的存储单元，或者说可以寻址两个存储单元；如果有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 根地址线，则可以寻址 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mi>n</mi></mrow><annotation encoding="application/x-tex">2n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">2</span><span class="mord mathnormal">n</span></span></span></span> 个存储单元。</p><p>数据总线 (Data Bus, DB)：一般为双向，用于 CPU 与存储器、CPU 与外设、或外设与外设之间传送数据信息。我们平常说的 8 位、16 位或 32 位单片机，指的就是 CPU<strong> 一次能够处理的数据位数</strong>，这也决定了单片机数据总线的根数（宽度）。</p><p>控制总线 (Control Bus, CB)：是单片机系统中所有控制信号线的总称，用来传递控制信息。</p><h2 id="CH2-C2000-系列微控制器及硬件平台"><a class="header-anchor" href="#CH2-C2000-系列微控制器及硬件平台"></a>CH2 C2000 系列微控制器及硬件平台</h2><h3 id="1、F28027主要资源"><a class="header-anchor" href="#1、F28027主要资源"></a>1、F28027 主要资源</h3><p>32 位 CPU、时钟（40MHz/50MHz/60MHz）、哈佛总线架构、3.3V 单电源供电、外设资源（GPIO、中断 PIE、CPU 定时器、ePWM、eCAP、ADC、SCI、SPI、I2C）</p><h3 id="2、引脚。功能复用、引脚有效符号等"><a class="header-anchor" href="#2、引脚。功能复用、引脚有效符号等"></a>2、引脚。功能复用、引脚有效符号等</h3><p>F28027 的引脚按其功能进行分类，可以分为 JTAG 接口、Flash、时钟信号、复位引脚、ADC 模拟输入信号、CPU 和 I/O 电源引脚、电压调节控制引脚、GPIO 和外设信号。</p><h3 id="3、MCU硬件功能概述"><a class="header-anchor" href="#3、MCU硬件功能概述"></a>3、MCU 硬件功能概述</h3><p>F28027 有一个 32 位的 CPU 内核（TMS320C28x），主频高达 60MHz，同时它具有 GPIO、模数转换器 ADC、增强型 PWM 模块、增强型捕获模块、串口通信接口、串行外设接口等外设。功能丰富强大，用户可以方便地用它来开发高性能的微控制系统。片内集成了 Flash 存储器，程序可以直接烧写到 Flash 中，实现脱机运行。</p><h3 id="4、内存映射（数据空间-地址空间，空间大小与地址的转换）"><a class="header-anchor" href="#4、内存映射（数据空间-地址空间，空间大小与地址的转换）"></a>4、内存映射（数据空间 / 地址空间，空间大小与地址的转换）</h3><p>M0 SARAM 和 M1 SARAM 大小均为 1K×16 位，地址范围分别为<code>0x000000</code> ~ <code>0x0003FF</code>、<code>0x000400</code> ~ <code>0x0007FF</code>。当复位后，堆栈指针指向<strong> M1 块的起始地址</strong>，堆栈指针向上生长。<strong>M0、M1 可以映射到程序区和数据区</strong>。</p><p><code>0x000800</code> ~ <code>0x0001FFF</code> 对应外设帧 0，为寄存器映射空间，该空间直接通过 CPU 内存总线访问。</p><p><code>0x006000</code> ~ <code>0x0006FFF</code> 对应外设帧 1，为寄存器映射空间，该空间通过 32 位外设总线访问。</p><p>L0 SARAM 的大小为 4K×16 位，即可以映射到程序区，也可以映射到数据区。L0 SRAM 地址为双映射，可以映射到<code>0x008000</code> ~ <code>0x008FFF</code>，也可以映射到<code>0x03F8000</code> ~ <code>0x3F8FFF</code>。</p><p>用户 OTP 区的大小为 1K×16 位，地址范围为 <code>0x3D7800</code> ~ <code>0x3D7BFF</code>，即可以映射到程序区，也可以映射到数据区。</p><p><code>0x3D7C80</code> ~ <code>0x3D7CBF</code> 为内部振荡器和 ADC 模块的校正数据空间。由厂家进行编程，用户不可编程。</p><p><code>0x3D7CC0</code> ~ <code>0x3D7CDF</code> 该存储空间保存 MCU 工作模式引导程序。在 MCU 初始化引导时调用引导程序进入相应模式。</p><p><code>0x3D7E80</code> ~ <code>0x3D7EAF</code> 预留给 TMX/TMP 系列芯片使用。</p><p><code>0x3D7FFF</code> 保存设备相关信息，对于 TI 28027PT 读取值为 0x00CF。</p><p><code>0x3F0000</code> ~ <code>0x3F7FF7</code> 闪存分为四个扇区，每个扇区 8K×16，分别是扇区 D、扇区 C、扇区 B、扇区 A。如果使用代码安全模式，Flash 空间 <code>0x3F7F80</code> - <code>0x3F7FF5</code>不能用来保存程序代码或数据，必须将这些区域编程为 0。如果不使用代码安全模式，可以用来保存程序或数据，但是 <code>0x3F7FF0</code> ~ <code>0x3F7FF5</code> s 只能用于保存数据，不能用于保存程序代码。</p><p><code>0x3F7FF8</code> ~ <code>0x3F7FFF</code> 128 位密码区。密钥由用户编程时写入闪存。</p><p><code>0x3FE000</code> ~ <code>0x3FFFFF</code> BOOT ROM 用于保存 TI 的引导装载程序和 IQ 数学表，在芯片出厂时已经编程好。包含 IQ 数学表、IQ 数学函数、Bootloader 函数、Flash 应用程序接口库、ROM 版本和 ROM 校验和、复位向量和 CPU 向量表几个部分。</p><p><code>0x3FE000</code> ~ <code>0x3FFFFF</code> F28027 的 CPU 向量表。在 CPU 向量表中，唯一可以直接使用的是位于<code>0x3FFFC0</code>的复位向量，复位向量保存着 <code>InitBoot</code> 函数的入口地址。</p><h3 id="5、时钟信号SYSCLKOUT"><a class="header-anchor" href="#5、时钟信号SYSCLKOUT"></a>5、时钟信号 SYSCLKOUT</h3><p>由锁相环模块输出。为了达到节能目的，TI 对时钟提供一种管理机制，每个外设模块都可以对时钟输入进行使能或禁止（CLK ENABLE），只对需要工作的模块提供时钟信号，不工作的模块不提供时钟信号。系统时钟可以再次被处理，生成低速时钟信号 LSPCLK，用于低速外设模块，如 SCI 模块和 SPI 模块。</p><p>F28027 提供了四种时钟来源。包括：1、提供外接晶振的接口来实现内部振荡电路的工作；2、直接用外接时钟信号 XCLKIN；3、内部振荡器 Internal OSC1；4、内部振荡器 Internal OSC2。内部振荡器的工作频率是 10MHz，单片机上电复位后默认的时钟来源是 Internal OSC1。</p><h3 id="6、看门狗电路（本质是定时器，“喂狗”：0x55AA）"><a class="header-anchor" href="#6、看门狗电路（本质是定时器，“喂狗”：0x55AA）"></a>6、看门狗电路（本质是定时器，“喂狗”：0x55AA）</h3><p>F28027 提供了看门狗模块。该模块本质上是一个计数器，在计数器溢出时，它会产生一个复位信号，来复位 CPU 或者产生看门狗中断。为了不让它产生复位信号，那就需要在计数器溢出前对它清零，俗称 “喂狗”。</p><p>时钟源 OSCCLK 经过 512 分频后再进行可编程的预分频 (Watchdog Prescaler)，输出脉冲作为看门狗计数器（Watchdog Counter）的计数脉冲。<code>Watchdog 55+AA Key Detector</code> 是看门狗的 “喂狗” 操作。“喂狗” 时，需要先写入数据 “55” 给寄存器 WDKEY，接着写入 “AA” 给寄存器 WDKEY，硬件就会发出有效的信号 <code>Good Key</code>，用于复位看门狗计数器。</p><p>当程序运行出现问题，比如 “死机” 或进入 “死循环”，那么设定的 “喂狗” 程序将无法执行，看门狗计数器将溢出并发出触发信号，通过 Generate Output Pulse 模块输出 512 个时钟周期的低电平信号。</p><h3 id="7、片内上电复位-欠电压复位"><a class="header-anchor" href="#7、片内上电复位-欠电压复位"></a>7、片内上电复位 / 欠电压复位</h3><p>上电复位电路（POR）的目的是在整个上电过程，对器件产生一个有效的复位信号。器件上电过程结束后，欠压复位电路（BOR）对 VDDIO 进行监测，如果使能片内电压稳压器，还对 VDD 进行监测。POR 的电压保护点比 BOR 低。当电压低于相应的保护点时，复位电路把 XRS 拉至低电平引起复位过程。</p><h2 id="CH3-微控制器程序设计基础"><a class="header-anchor" href="#CH3-微控制器程序设计基础"></a>CH3 微控制器程序设计基础</h2><h3 id="1、编程语言"><a class="header-anchor" href="#1、编程语言"></a>1、编程语言</h3><p><strong>机器语言</strong>就是用<strong>二进制代码</strong>表示的计算机<strong>能直接识别和执行</strong>的一种机器指令集合，每一条机器指令在计算机内部都有相应的电路来完成它，是<strong>唯一</strong>的计算机能够直接识别和执行的语言。CPU 的所有指令集构成该计算机的<strong>指令系统</strong>。</p><p>汇编语言是面向机器的程序设计语言。由汇编语言编写的程序，计算机无法直接识别，需把汇编语言翻译成机器语言，这种具有翻译功能的程序叫做汇编程序。汇编程序把汇编语言翻译成机器语言的过程称为汇编。汇编语言的指令一般都由操作码和操作数组成，操作码也被称为指令助记符。</p><p>机器语言和汇编语言都是低级语言。高级语言是一种贴合人类逻辑思维、便于直观理解的计算机语言，高级语言既接近自然语言又可以使用数学表达式，并且相对独立于计算机，可以跨计算机使用。编译的程序代码通常比用汇编语言设计的程序代码更长、执行更慢。</p><h3 id="2、CPU执行指令5个过程：取指令、指令译码、取操作数、执行指令、结果写回"><a class="header-anchor" href="#2、CPU执行指令5个过程：取指令、指令译码、取操作数、执行指令、结果写回"></a>2、CPU 执行指令 5 个过程：取指令、指令译码、取操作数、执行指令、结果写回</h3><p>取指令：将指令从程序存储器取出。程序计数器 PC 中的数值指示当前指令在程序存储器中的位置。当一条指令被取出后，PC 中的数值将根据指令长度自动递增，指向下一条指令。</p><p>指令译码：指令译码器按照预定的指令格式，对取回的指令进行译码，识别出不同的指令类别以及各种获取操作数的方法。</p><p>取操作数：从存储器或者 CPU 寄存器中获取操作数。操作数指出了参与运算的数据或数据所在的地址，而如何得到就由芯片的寻址方式决定。C28x 支持四种基本寻址方式：<strong>直接寻址方式、间接寻址方式、堆栈寻址方式、寄存器寻址方式</strong>。同时，C28x 还支持一些特殊寻址方式，如数据/程序/IO 空间寻址方式、程序空间间接寻址方式等。</p><p>执行指令：完成指令所规定的操作，实现指令的功能。为此，CPU 的不同部分被连接起来，以执行所需的操作。</p><p>结果写回：把执行指令阶段的运行结果数据写回到存储器或 CPU 寄存器。</p><p>在结果数据写回之后，当条指令执行完毕。CPU 从程序计数器 PC 中取得下一条指令地址，开始新一轮的循环。</p><p>为了提高效率，C28x 采用 8 个独立阶段来完成以上 5 个过程。指令以流水线方式执行，在任何时候，最多可以执行八个指令，每个指令处于不同的完成阶段。</p><h3 id="3、嵌入式C语言：几个特殊保留字（volatile、interrupt）"><a class="header-anchor" href="#3、嵌入式C语言：几个特殊保留字（volatile、interrupt）"></a>3、嵌入式 C 语言：几个特殊保留字（volatile、interrupt）</h3><p>嵌入式 C 语言的四大要素就是数据及其处理、程序流程控制、函数与中断服务程序以及指针。</p><p><code>volatile</code> 关键字是一种类型修饰符，用它声明的类型变量表示可以被某些编译器未知的因素更改，比如：操作系统、硬件或者其它线程等。遇到这个关键字声明的变量，编译器对访问该变量的代码就不再进行优化，从而可以提供对特殊地址的稳定访问。</p><div class="callout" data-callout="example"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list"><line x1="8" x2="21" y1="6" y2="6"></line><line x1="8" x2="21" y1="12" y2="12"></line><line x1="8" x2="21" y1="18" y2="18"></line><line x1="3" x2="3.01" y1="6" y2="6"></line><line x1="3" x2="3.01" y1="12" y2="12"></line><line x1="3" x2="3.01" y1="18" y2="18"></line></svg></div><div class="callout-title-inner">Example</div></div><div class="callout-content"><p></p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">volatile</span> <span class="type">int</span> i=<span class="number">10</span>;</span><br><span class="line"><span class="type">int</span> a = i;</span><br><span class="line">...</span><br><span class="line"><span class="comment">// 其他代码，并未明确告诉编译器，对 i 进行过操作</span></span><br><span class="line"><span class="type">int</span> b = i;</span><br></pre></td></tr></tbody></table></figure><p><code>volatile</code> 指出 <code>i</code> 是随时可能发生变化的，每次使用它的时候必须从 <code>i</code> 的地址中读取，因而编译器生成的汇编代码会重新从 <code>i</code> 的地址读取数据放在 <code>b</code> 中。而优化做法是，由于编译器发现两次从 <code>i</code> 读数据的代码之间的代码没有对 <code>i</code> 进行过操作，它会自动把上次读的数据放在 <code>b</code> 中。而不是重新从 <code>i</code> 里面读。这样以来，如果 <code>i</code> 是一个寄存器变量或者表示一个端口数据就容易出错，所以说 <code>volatile</code> 可以保证对特殊地址的稳定访问。</p></div></div><p><code>interrupt</code>/<code>__interrupt</code> 为编译器扩展的保留字，用于声明中断服务函数（ISR）。ISR 函数必须定义为 <code>void</code> 返回类型，且没有参数。例如：<code>__interrupt void int_handler(void)</code>。编译器会在编译时执行特殊的操作：自动保存和恢复寄存器；生成特殊的中断返回指令 <code>IRET</code>。</p><h2 id="CH4-软件架构与CCS集成开发环境"><a class="header-anchor" href="#CH4-软件架构与CCS集成开发环境"></a>CH4 软件架构与 CCS 集成开发环境</h2><h3 id="1、如何使用结构体指针操作寄存器"><a class="header-anchor" href="#1、如何使用结构体指针操作寄存器"></a>1、如何使用结构体指针操作寄存器</h3><p>结构体指针的定义：</p><ul><li>第一步：声明结构体类型，结构体类型名为<code>GPIO_Obj</code>。<br>结构体成员包含了 GPIO 模块的所有寄存器，结构体成员严格按照寄存器的地址顺序排列，并保留没有用到的地址空间，</li><li>第二步：声明结构体指针类型，结构体指针类型名为<code>GPIO_Handle</code>。<br><code>typedef GPIO_Obj * GPIO_Handle;</code></li><li>第三步：定义结构体指针变量 myGpio。<br><code>GPIO_Handle myGpio;</code></li><li>第四步：结构体指针变量初始化。<br><code>myGpio = (void*)GPIO_BASE_ADDR; //GPIO_BASE_ADDR为GPIO模块所有寄存器的首地址0x0000 6F80</code></li></ul><p>接下来，以 <code>GPADAT</code> 寄存器为例介绍寄存器的读写操作方法。</p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">myGpio-&gt;GPADAT = <span class="number">5</span>; <span class="comment">// GPADAT寄存器值设置为5</span></span><br><span class="line">data = myGpio-&gt;GPADAT; <span class="comment">// 读取GPADAT寄存器值当前的值,保存到变量data中</span></span><br></pre></td></tr></tbody></table></figure><h3 id="2、寄存器位操作"><a class="header-anchor" href="#2、寄存器位操作"></a>2、寄存器位操作</h3><p>寄存器位操作一般都是通过逻辑 “与” 和逻辑 “或” 来实现的。在对某个位操作的同时不能影响到寄存器的其他位。例如，对<code>GPADAT</code>的<code>GPIO2</code>这个位进行写和读操作：</p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">myGpio -&gt;GPADAT &amp;= (~((<span class="type">uint32_t</span>)<span class="number">1</span> &lt;&lt; <span class="number">2</span>)); <span class="comment">// 待操作位清零，其他位保持不变</span></span><br><span class="line">myGpio -&gt;GPADAT |= (<span class="type">uint32_t</span>)<span class="number">1</span>&lt;&lt; <span class="number">2</span>; <span class="comment">// GPIO2位写1</span></span><br><span class="line"><span class="comment">// myGpio -&gt;GPADAT |= (uint32_t)0&lt;&lt; 2; // GPIO2位写0</span></span><br><span class="line"></span><br><span class="line">Bitdata= ((myGpio -&gt; GPADAT &gt;&gt; <span class="number">2</span>) &amp; <span class="number">0x0001</span>)；<span class="comment">// GPIO2位值保存到Bitdata变量中。</span></span><br></pre></td></tr></tbody></table></figure><h3 id="3、软件架构"><a class="header-anchor" href="#3、软件架构"></a>3、软件架构</h3><p>分为主程序层、应用层、用户模块层和芯片模块层。</p><p>TI 公司为各系列 MCU 提供了丰富的固件库函数和技术支持。固件库是一个固件函数包，它由程序、数据结构和宏组成，包括 MCU 所有系统级和外设标准驱动函数 (接口)。对于初学者而言，可以直接调用这些驱动函数，快速实现需要的应用。</p><p>用户模块层对 MCU 驱动函数进行封装，完成具体的功能操作。</p><p>应用层对用户函数进行封装。</p><p>主程序层主要是对 MCU 的初始化配置和应用层功能函数的调用，实现复杂的 MCU 功能。初始化部分包含系统和外设模块配置函数和初始化函数。</p><h2 id="CH5-通用输入输出口"><a class="header-anchor" href="#CH5-通用输入输出口"></a>CH5 通用输入输出口</h2><h3 id="1、GPIO基础知识"><a class="header-anchor" href="#1、GPIO基础知识"></a>1、GPIO 基础知识</h3><p>GPIO 是微控制器的数字输入输出模块，可以实现微控制器与外部设备的数字交换。数字输入功能主要是将外部设备的开关量信号转换成 CPU 可读取的数字信号 “1”、“0”，从而获知外部设备的运行状态；数字输出功能则是将 CPU 的数字控制信号 “1”、“0” 转换成引脚高、低电平信号，从而实现对外部设备运行状态控制。</p><p>GPIO 输出驱动器主要由多路选择器、输出控制和 MOS 管组成。</p><p>多路选择器根据用户配置决定该引脚是用于通用 GPIO 还是复用功能输出。通用输出时，该引脚的输出信号来自于 GPIO<strong> 输出数据寄存器</strong>。复用功能输出时，该引脚输出信号来自于<strong>片上外设</strong>，并且一个引脚输出可能来自多个不同外设。<strong>同一时刻，一个引脚只能使用一种输出功能</strong>。</p><p>根据数字电路输出电平的 “强弱”，可将 IO 输出分为图腾柱输出（推挽输出 / 推拉输出）、开漏输出、下拉电阻输出 3 种。</p><p>图腾柱输出电路输出为<strong>强 1，强 0 或高阻态</strong>。推挽输出既提高电路的负载能力，又提高开关速度，适用于输出 0V 和 VDD 的场合。输出强 1：上管导通，下管截止，OUTPUT 输出高电平；输出强 0：上管截止，下管导通，OUTPUT 输出低电平；高阻状态：上管截止，下管截止，无影响</p><p>开漏输出：与图腾柱方式相比，<strong>只有下管受控，上管断开或没有上管</strong>。对于与 Vss 相连的 MOS 管来说，其漏级是开路的。当内部输出 “0” 时，下管导通，引脚相当于接地，外部输出<strong>低电平</strong>；当内部输出 “1” 时，下管截止，由于上管也截止，外部输出既不是高电平，也不是低电平，而是<strong>高阻态</strong>。如果想要外部输出高电平，必须接有上拉电阻。上拉电阻输出电路为<strong>强 0 弱 1 电路</strong>。</p><p>下拉电阻输出电路为<strong>强 1 弱 0 电路</strong>。与图腾柱方式相比，只有上管受控，没有下管。</p><h3 id="2、C2000的GPIO模块（概述、软件架构）"><a class="header-anchor" href="#2、C2000的GPIO模块（概述、软件架构）"></a>2、C2000 的 GPIO 模块（概述、软件架构）</h3><p>F28027 有 22 个 GPIO（DIO）、6 个 AIO（与 AD 采样通道共用引脚）；GPIO 引脚分组管理，分为端口 A（由 GPIO0 - GPIO31 组成）、端口 B（由 GPIO32-GPIO38 组成）。</p><p>GPIO 引脚与最多 3 种外设功能引脚共用，使用前需要先进行模式选择。</p><p>GPIO 引脚可工作在上拉模式或推挽模式。</p><p>GPIO 引脚的电气特性：输入时，低电平电压范围为：（Vss-0.3）V ~ 0.8V，高电平电压范围为：2V ~（VDD+0.3）V。输出时，逻辑 “1” 输出的电压最低为 2.4V，逻辑 “0” 输出的电压最高为 0.4V。</p><p>CPU 对输入引脚的信号确认有 3 种方式。非同步（异步输入）方式、同步时钟方式、采样窗方式。默认情况下，所有输入引脚信号被设置为同步于系统时钟 SYSCLKOUT。</p><p>采样窗方式下，输入信号首先被同步到系统时钟 SYSCLKOUT，然后输入信号状态持续时间达到指定数量周期数时，输入状态才允许改变。</p><p>为了限定信号，在固定的周期进行输入信号采样。用户指定采样周期（也称采样间隔时间）是相对于系统时钟（SYSCLKOUT）而言的。</p><p>采样的次数可以选择为 3 次采样或者 6 次采样，通过寄存器 GPAQSEL1、GPAQSEL2、GPBQSEL1 和 GPBQSEL2 来设置。当连续 3 次或 6 次信号状态一样，输入状态的改变才会被确认</p><p>采样窗口就是输入信号被确认的时间长度。为了让输入限定能够检测到输入的变化，信号电平必须在采样窗口或者更长的时间内保持稳定。GPIO 引脚的输入信号经过限定器后输出信号就对小毛刺 A 进行了滤波。</p><h3 id="3、软件思维导图：配置GPIO控制LED和按键"><a class="header-anchor" href="#3、软件思维导图：配置GPIO控制LED和按键"></a>3、软件思维导图：配置 GPIO 控制 LED 和按键</h3><p>GPIO 的硬件初始化配置都需要通过 GPIO 的寄存器实现，包括 GPIO 控制寄存器（GPIO Control Registers）和 GPIO 中断<br>和低功耗唤醒选择寄存器（GPIO Interrupt and Low Power Mode Select Registers）。GPIO 的读写操作通过 GPIO 数据寄存器操作（GPIO Data Registers）。</p><p>由于引脚功能的复用性，使用前需要根据硬件系统的资源需求，统筹考虑把引脚当作 GPIO 或其他外设功能。优先考虑并预留外设功能的需求。</p><p>步骤 1：配置引脚功能 (GPIO_setMode)。<br>步骤 2：使能 / 禁止内部上拉电阻 (GPIO_setPullUp)。<br>步骤 3：配置输入限定 (GPIO_setQualification、GPIO_setQualificationPeriod)。<br>步骤 4：配置引脚方向 (GPIO_setDirection)。<br>步骤 5：低功耗唤醒模式唤醒源 (GPIO_lpmSelect)。<br>步骤 6：选择外部中断源（GPIO_setExtInt）。</p><h2 id="CH6-中断系统"><a class="header-anchor" href="#CH6-中断系统"></a>CH6 中断系统</h2><h3 id="1、中断基础知识（中断概念、中断处理过程、中断嵌套）"><a class="header-anchor" href="#1、中断基础知识（中断概念、中断处理过程、中断嵌套）"></a>1、中断基础知识（中断概念、中断处理过程、中断嵌套）</h3><p>单片机的中断系统能够加强 CPU 对多任务事件的处理能力。中断是 CPU 对系统发生的某个事件作出的一种反应。引起中断的事件称为<strong>中断源</strong>。中断源向 CPU 提出处理的请求称为<strong>中断请求</strong>。发生中断时被打断程序的暂停点称为<strong>断点</strong>。CPU 暂停现行程序而转去响应中断请求的过程称为<strong>中断响应</strong>。中断响应的程序称为<strong>中断处理程序</strong>。CPU 执行有关的中断处理程序称为<strong>中断处理</strong>。而返回断点的过程称为<strong>中断返回</strong>。中断的实现通过软件和硬件综合完成，硬件部分叫做硬件装置，软件部分称为软件处理程序。</p><p>根据来源不同，中断可分为硬件中断（Hardware Interrupt）和软件中断（Software Interrupt）；根据中断请求能否被屏蔽，中断可分为可屏蔽中断（Maskable Interrupt）和非可屏蔽中断（Non-Maskable Interrupt，NMI）</p><p>中断服务程序的入口地址称为<strong>中断向量</strong></p><p><strong>中断的优先级</strong>主要用来描述不同事件的重要程度。如果在执行一个中断时又被另一个更重要的事件打断，暂停该中断处理过程转而去处理这个更重要的事件，处理完毕后再继续处理本中断的过程称为<strong>中断的嵌套</strong></p><p>程序设计人员可以通过设置相应的中断屏蔽位，<strong>禁止 CPU 响应某个中断</strong>，从而实现<strong>中断屏蔽</strong>。但值得注意的是，尽管某个中断源可以被屏蔽，但一旦该中断发生，不管该中断屏蔽与否，它的中断标志位都会被置位，而且只要该中断标志位不被清除，它就一直有效。</p><p>MCU 的中断处理过程包括<strong>中断请求、中断响应、中断服务、中断返回</strong>四个步骤。当外设发出中断请求时，如果从外设到 CPU 的中断使能被允许，那么进入中断响应阶段。由于 CPU 执行完中断处理程序之后要返回被中断的地方继续执行原来程序，因此在执行中断服务程序之前，要把断点处<strong>地址和现场进行保护</strong>。</p><p>单一中断请求时，CPU 暂停正在运行的主程序转而运行中断服务程序，中断处理完毕后运行原程序。当多个中断请求同时挂起且不允许中断嵌套时，CPU 首先处理高优先级中断事件，然后再处理低优先级中断事件，最后返回执行主程序。允许中断嵌套时，大多数 MCU 高优先级中断可以中断低优先级中断服务程序，低优先级中断不能中断高优先级中断服务程序</p><h3 id="2、C2000的中断系统"><a class="header-anchor" href="#2、C2000的中断系统"></a>2、C2000 的中断系统</h3><p>中断资源包含 1 个非可屏蔽中断 NMI 和 16 个可屏蔽中断（INT1-INT14、RTOSINT、DLOGINT）</p><p>可屏蔽中断（INT1～INT12）采用外设中断扩展（PeripheralInterrupt Expansion，PIE）来进行协助管理，定时器 1、2 对应的 INT13、INT14 中断和 NMI 不经过 PIE，直接与 CPU 相连。</p><p>PIE 模块参与管理的中断有以下四类：</p><ul><li>TINT0：定时器 0 中断，可屏蔽中断；</li><li>外部中断：XINT1、XINT2、XINT3；</li><li>唤醒中断：WAKEINT，包括看门狗和低功耗唤醒；</li><li>外设中断：SPI、SCI、I2C、EPWM、HRPWM、ECAP、ADC 等。</li></ul><p>PIE 最多可管理 96 个独立中断源，这 96 个中断源分成 12 组、每组 8 个，分别对应 CPU 级 12 个可屏蔽中断（INT1～INT12）。96 个中断源具有独立的中断向量，均存储在专用 RAM 中，用户可以修改这些中断向量。</p><h3 id="3、PIE三级中断管理机制"><a class="header-anchor" href="#3、PIE三级中断管理机制"></a>3、PIE 三级中断管理机制</h3><p>F28027 的中断采用的是 3 级中断管理机制，分别是<strong>外设级、PIE 级和 CPU 级</strong>。对于某一个具体的外设中断请求，<strong>任意一级的不许可</strong>，CPU 最终都不会响应该外设中断。</p><p>外设模块产生中断事件时，相应外设模块寄存器的中断标志位 IF 被置位，如果对应的外设中断允许位 IE 被使能，则外设就向 PIE 发送一个中断请求。如果外设中断允许位 IE 未被使能，则该中断被屏蔽，不会向 PIE 发送中断请求。外设模块的中断标志位有的会在中断响应后自动清除，有的需要通过软件来清除。外部中断比较特殊，没有中断标志位，如果中断使能允许，外部中断请求信号直接送达 PIE。</p><p>PIE 控制器将每 8 个外设或外部中断汇集成 1 个 CPU 级中断。这样对于 96 个外设中断源，就被分成 12 组，分别是 PIE1～PIE12，每一组对应一个 CPU 级中断，即 PIE1 对应 INT1，PIE12 对应 INT12。一旦中断请求被送到 PIE 模块，相应的 PIE 中断标志位 PIEIFRx.y 被置位。如果对应的中断使能位<code>PIEIERx.y=1</code>，那么 PIE 模块将检查相应的 PIE 应答位<code>PIEACKx</code>，确认 CPU 是否准备好响应这个组的中断。如果这个组的 PIE 应答位<code>PIEACKx=0</code>，则 PIE 将该中断请求送至 CPU。如果 PIE 应答位<code>PIEACKx=1</code>，中断请求不会被 PIE 发送给 CPU，直到<code>PIEACKx=0</code>且该中断请求还存在时，PIE 才会将挂起的中断请求发送给 CPU。</p><p>软件清除中断应答位<code>PIEACKx</code>；而 CPU 响应 PIE 级中断后，自动清除相应的中断标志位<code>PIEIFRx.y</code>，后者不可通过软件进行清除。</p><p>当中断请求从 PIE 发送到 CPU 时，CPU 级的中断标志寄存器<code>IFRx</code>被置位，中断应答位<code>PIEACKx</code>被置位，同组的其他中断请求被挂起。如果<code>IERx=1</code>且中断总开关<code>INTM=0</code>，那么 CPU 将响应这个中断请求并自动清零对应的<code>IFRx</code>标志位</p><p>CPU 响应中断请求后，要去处理中断服务程序，这个中断响应过程包括现场保护（中断返回地址、相关寄存器等入栈）和中断服务子程序地址的获取。其中，中断服务子程序地址保存在 MCU 内存单元，这部分内存单元也称为<strong>中断向量表</strong>。</p><h2 id="CH7-CPU定时器"><a class="header-anchor" href="#CH7-CPU定时器"></a>CH7 CPU 定时器</h2><h3 id="1、定时器基础知识（本质是计数器、计数方式、定时时间计算）"><a class="header-anchor" href="#1、定时器基础知识（本质是计数器、计数方式、定时时间计算）"></a>1、定时器基础知识（本质是计数器、计数方式、定时时间计算）</h3><p>定时器本质上是一个<strong>计数器</strong>，该计数器能对固定频率的脉冲进行计数，把时间的计量转化为对脉冲的计数。根据计数方向不同，有<strong>增计数、减计数、增减计数</strong>三种模式</p><p>增计数的工作模式是计数器按加 1 计数，也就是计数器在时钟脉冲的触发下连续加 1。当计数值与预先设置的周期值 PRD 相等时，计数器重新从 0 开始计数，由于计数是从 0 开始的，因此<strong>实际的计数周期要多加 1</strong>。</p><p>减计数的计数方式与增计数相反，计数器从某个初始值开始减 1，减到 0 时回到初始值重新开始。</p><p>增、减计数工作模式下定时器的定时时间 T 为：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi><mo>=</mo><msub><mi>T</mi><mrow><mi>c</mi><mi>l</mi><mi>k</mi></mrow></msub><mo>×</mo><mo stretchy="false">(</mo><mi>P</mi><mi>D</mi><mi>R</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T=T_{clk} × (PDR+1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight" style="margin-right:0.0197em;">l</span><span class="mord mathnormal mtight" style="margin-right:0.0315em;">k</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span></p><p>增减计数模式的计数方向由定时器自动设置，当计数器的值增加到周期值时，计数方向由增计数自动改为减计数，同样，当计数值减到 0 时，计数方向由减计数自动改为加计数。这种工作模式下定时器的定时时间 T 为：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi><mo>=</mo><msub><mi>T</mi><mrow><mi>c</mi><mi>l</mi><mi>k</mi></mrow></msub><mo>×</mo><mo stretchy="false">(</mo><mi>P</mi><mi>D</mi><mi>R</mi><mo>×</mo><mn>2</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">T=T_{clk} × (PDR×2)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight" style="margin-right:0.0197em;">l</span><span class="mord mathnormal mtight" style="margin-right:0.0315em;">k</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span></span></span></span></p><h3 id="2、C2000的定时器（3个定时器、时钟基准SYSCLKOUT、减计数方式、预分频、周期、定时时间计算）"><a class="header-anchor" href="#2、C2000的定时器（3个定时器、时钟基准SYSCLKOUT、减计数方式、预分频、周期、定时时间计算）"></a>2、C2000 的定时器（3 个定时器、时钟基准 SYSCLKOUT、减计数方式、预分频、周期、定时时间计算）</h3><p>F28027 有 3 个 32 位的定时器 TIMER0、TIMER1 和 TIMER2，三个定时器<strong>均采用减计数</strong>工作模式。<strong>TIMER0 和 TIMER1 提供给用户使用</strong>，TIMER2 提供给实时操作系统使用。时钟基准默认为系统时钟 SYSCLKOUT。</p><p>预分频计数器（PSCH:PSC）的触发信号是系统时钟信号（SYSCLKOUT）。每个时钟周期 PSCH:PSC 的值减 1，当 PSCH:PSC 值为 0 后的一个时钟周期，发出脉冲信号（Borrow），该信号作为计数器（TIMH:TIM）的时钟信号，同时触发寄存器 TDDRH:TDDR 的值重新装载到寄存器 PSCH:PSC。</p><p>定时器的工作流程是：每经过 (TDDRH:TDDR+1) 个时钟周期计数器（TIMH:TIM）减 1，当计数器 TIMH:TIM 减到 0 后将产生一次中断请求信号送给 CPU。</p><div class="callout" data-callout="example"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list"><line x1="8" x2="21" y1="6" y2="6"></line><line x1="8" x2="21" y1="12" y2="12"></line><line x1="8" x2="21" y1="18" y2="18"></line><line x1="3" x2="3.01" y1="6" y2="6"></line><line x1="3" x2="3.01" y1="12" y2="12"></line><line x1="3" x2="3.01" y1="18" y2="18"></line></svg></div><div class="callout-title-inner">Example</div></div><div class="callout-content"><p>假设系统时钟是 1MHz（即 1 微秒一个脉冲）。</p><ul><li>如果 <code>TDDRH:TDDR = 0</code>，预分频系数是 1，则主计数器每 1 微秒减 1。</li><li>如果 <code>TDDRH:TDDR = 99</code>，预分频系数是 100，则主计数器每 100 微秒才减 1。</li></ul></div></div><p>定时时间：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi><mo>=</mo><mo stretchy="false">(</mo><mi>T</mi><mi>D</mi><mi>D</mi><mi>R</mi><mi>H</mi><mo>:</mo><mi>T</mi><mi>D</mi><mi>D</mi><mi>R</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo>×</mo><mo stretchy="false">(</mo><mi>T</mi><mi>I</mi><mi>M</mi><mi>H</mi><mo>:</mo><mi>T</mi><mi>I</mi><mi>M</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo>×</mo><msub><mi>T</mi><mrow><mi>c</mi><mi>l</mi><mi>k</mi></mrow></msub></mrow><annotation encoding="application/x-tex">T=(TDDRH:TDDR+1)×(TIMH:TIM+1)×T_{clk}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mord mathnormal" style="margin-right:0.0813em;">H</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.0785em;">I</span><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mord mathnormal" style="margin-right:0.0813em;">H</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">:</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.0785em;">I</span><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight" style="margin-right:0.0197em;">l</span><span class="mord mathnormal mtight" style="margin-right:0.0315em;">k</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><h2 id="CH8-增强型捕获模块"><a class="header-anchor" href="#CH8-增强型捕获模块"></a>CH8 增强型捕获模块</h2><h3 id="1、捕获模块基础知识"><a class="header-anchor" href="#1、捕获模块基础知识"></a>1、捕获模块基础知识</h3><p>捕获模块可以捕获 MCU 引脚的电平跳变（上升沿、下降沿），并记录电平跳变的时刻。捕获模块也有对时间的处理，也是通过计数器来实现的。捕获模块可以用于外部事件的精确时间测量。只要被检测信号能够转换为脉冲信号，捕获模块就可以对该脉冲信号进行捕获。</p><h3 id="2、计数器工作模式：增计数"><a class="header-anchor" href="#2、计数器工作模式：增计数"></a>2、计数器工作模式：增计数</h3><h3 id="3、C2000的eCAP（概述、功能（预分频、边沿极性、连续-单次模式、事件决策、捕获寄存器、中断控制）"><a class="header-anchor" href="#3、C2000的eCAP（概述、功能（预分频、边沿极性、连续-单次模式、事件决策、捕获寄存器、中断控制）"></a>3、C2000 的 eCAP（概述、功能（预分频、边沿极性、连续 / 单次模式、事件决策、捕获寄存器、中断控制）</h3><p>单触发捕获模式：捕获 1-4 个事件后停止捕获<br>连续捕获模式：循环进行 1-4 个事件的捕获<br>中断功能：4 个捕获事件都可以触发中断<br>捕获模式不使用时，eCAP 模块可以配置为单通道 PWM 输出</p><p>预分频器可以对输入脉冲信号进行预分频（2-62 分频，2 的倍数），或者直接旁路，不经过预分频器。</p><p>边沿极性可以选择上升沿捕获或下降沿捕获。eCAP 模块有 4 个独立的边沿极性选择，每一个分别对应一个捕获事件。</p><p>Modulo 4 counter：事件触发计数器，由捕获事件触发计数。计数值只能是 0、1、2、3。</p><p>输入信号经过事件预分频（Event prescale）、极性选择（Polarity select）后到达事件决策模块（Event qualifier）。事件决策模块根据捕获模式（Continuous/Oneshot Capture Control）的配置，产生装载捕获寄存器的触发信号（LD1~LD4），把捕获计数器（TSCTR）的当前值 CTR 装载到捕获寄存器中（CAP1、CAP2、CAP3、CAP4）。根据复位配置（CTRRSTx）可输出信号（Delta mode）复位捕获计数器。捕获事件（Capture events）可发出捕获事件中断信号（CEVT）给 PIE。另外，eCAP1~ eCAP4 可通过时钟同步信号（SYNCIn）进行计数器初始值（CTRPHS）的装载。</p><p>捕获事件 1 设置为<strong>上升沿触发，差分模式</strong>，当上升沿捕获时，计数器清 0，开始新的周期计数；捕获事件 2 设置为<strong>下降沿触发，绝对值模式</strong>，这样<strong> CAP2 即对应高电平的周期值；CAP1 的值对应波形周期值</strong>。</p><p>eCAP 捕获模式时有 5 个中断事件，即捕获事件 1（CEVT1）、捕获事件 2（CEVT2）、捕获事件 3（CEVT3）、捕获事件 4（CEVT4）、TSCTR 计数器溢出（CTROVF）（计数值从 FFFFFFFF 回到 00000000）。</p><h2 id="CH9-增强型脉宽调制模块"><a class="header-anchor" href="#CH9-增强型脉宽调制模块"></a>CH9 增强型脉宽调制模块</h2><h3 id="1、PWM基础知识"><a class="header-anchor" href="#1、PWM基础知识"></a>1、PWM 基础知识</h3><p>PWM 是 Pulse Width Modulation 的缩写，即脉冲宽度调制，也就是<strong>宽度可调节的方波脉冲</strong>。相关的参数：周期、频率和占空比</p><ul><li>周期 T：输出一次脉冲，即输出一次完整的高低电平的时间</li><li>频率 f：周期的倒数，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo>=</mo><mfrac><mn>1</mn><mi>T</mi></mfrac></mrow><annotation encoding="application/x-tex">f=\frac{1}{T}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.1389em;">T</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></li><li>占空比 D：一个周期内，脉冲高电平时间与周期的比值（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi><mo>=</mo><mfrac><msub><mi>T</mi><mrow><mi>h</mi><mi>i</mi><mi>g</mi><mi>h</mi></mrow></msub><mi>T</mi></mfrac></mrow><annotation encoding="application/x-tex">D=\frac{T_{high}}{T}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.3364em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9914em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.1389em;">T</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.5131em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.1389em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em;"><span style="top:-2.3488em;margin-left:-0.1389em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="katex-sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">hi</span><span class="mord mathnormal mtight" style="margin-right:0.0359em;">g</span><span class="mord mathnormal mtight">h</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2901em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>）</li></ul><p>PWM 信号有两种产生方法：模拟电子方法和数字化方法。</p><p>模拟电子方法：由三角波或锯齿波发生器产生高频调制波，经比较器产生 PWM 信号。三角波或锯齿波与可调直流电源比较，产生占空比可调的 PWM 信号；与正弦基波比较，产生占空比按正弦规律变化的 SPWM 信号。</p><p>数字化方法（主流）：与硬件构成 PWM 信号类似，数字逻辑将锯齿波发生器等效为一个计数器 Count，将可调直流电源等效为比较点 Compare。数字控制产生 PWM 需要 3 个寄存器：计数器、周期值和比较值。通过配置周期值和比较值就能够产生任意频率、占空比的 PWM 信号。</p><h3 id="2、C2000的ePWM（TB子模块、CC子模块、AQ子模块、ET子模块）"><a class="header-anchor" href="#2、C2000的ePWM（TB子模块、CC子模块、AQ子模块、ET子模块）"></a>2、C2000 的 ePWM（TB 子模块、CC 子模块、AQ 子模块、ET 子模块）</h3><p>时基子模块（TB）功能：每个 ePWM 单元都有一个独立的时基单元，用来决定该 ePWM 模块相关的事件时序。通过同步输入信号可以将所有的 ePWM 工作在同一时基信号下，即所有的 ePWM 级联在一起，处于同步状态，可以看成一个整体。</p><p>TB 模块的主要功能：</p><ol><li>预分频功能（Clock Prescale）</li><li>PWM 周期值（TBPRD）</li><li>时基计数器 TBCTR</li><li>时基时钟同步</li><li>时基计数器相位控制</li></ol><p>系统时钟预分频后作为 TB 子模块的时钟信号，分频系数由寄存器<code>TBCTL[HSPCLKDIV]</code>和<code>TBCTL[CLKDIV]</code>决定。<code>HSPCLKDIV</code>的值为 x，则如果 x 为 0，则分频系数为 1，如果 x 不为 0，则分频系数为 2x；如果<code>CLKDIV</code>的值为 y，则分频系数为 2y。</p><div class="callout" data-callout="example"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-list"><line x1="8" x2="21" y1="6" y2="6"></line><line x1="8" x2="21" y1="12" y2="12"></line><line x1="8" x2="21" y1="18" y2="18"></line><line x1="3" x2="3.01" y1="6" y2="6"></line><line x1="3" x2="3.01" y1="12" y2="12"></line><line x1="3" x2="3.01" y1="18" y2="18"></line></svg></div><div class="callout-title-inner">Example</div></div><div class="callout-content"><p>本书案例设置 SYSCLKOUT 为 60MHz，如果 HSPCLKDIV=0，CLKDIV=1，则 TBCLK=30MHz。</p></div></div><p>PWM 周期值 TBPRD 有两个寄存器：影子寄存器（Period Shadow）和活动寄存器（PeriodActive）。它们具有相同物理地址。由<code>TBCTL[PRDLD]</code>位控制周期寄存器的工作模式：影子寄存器模式 (=0) 或立即加载模式 (=1)。默认情况下 TBPRD 采用影子寄存器模式。在影子寄存器模式下，对 TBPRD 的读写操作是对影子寄存器进行的，只有当 TBCTR=0 时，影子寄存器的值加载到工作寄存器。</p><p>时基计数器的计数模式有三种模式，分别是：增计数模式、减计数模式和增减计数模式。在这三种计数模式中，一个有效的 TBCLK，时基计数器变化率为 1。</p><p>每个 ePWM 模块的时基时钟 TBCLK 是独立的，它们都是由系统时钟信号 SYSCLKOUT 分频得到。在 CLK 模块中，提供一个同步开关 TBCLKSYNC，当这个开关有效（置位）时，所有工作的 ePWM 模块的时基计数器 TBCTR<strong> 同步于 TBCLK 的第一个上升沿</strong>。每个 ePWM 模块的分频必须设置一样。</p><p>每个 ePWM 模块拥有一个同步信号输入 (EPWMxSYNCI) 和一个同步信号输出 (EPWMxSYNCO)。第一个 ePWM 模块（ePWM1）的同步输入信号是来自芯片的引脚。同步信号还控制关联的捕获（eCAP）模块。同步脉冲信号实现不同 ePWM 模块的同步，而且通过 TBPHS 实现各 ePWM 模块的相位超前和滞后的控制。当同步输入信号发生时，时基相位 TBPHS 装载到时基计数器 TBCTR，装载时刻一致，同步实现。如果 ePWM 模块的 TBPHS 不为零，那么在同步信号作用下，TBPHS 的值就装载进 TBCTR，各个 ePWM 模块就存在计数初值的不同，也就是存在相位差。</p><hr><p>CC 子模块主要功能是对 TB 子模块的计数器值 TBCTR 与给定的比较值进行比较，产生比较相等的事件，该事件作为后续 AQ 子模块的触发事件。有两个比较寄存器 CMPA 和 CMPB</p><p>它们分别有两个寄存器：影子寄存器和工作寄存器。影子寄存器和工作寄存器具有相同的物理地址。由<code>CMPCTL[SHDWAMODE]</code>或<code>CMPCTL[SHDWBMODE]</code>位控制比较值寄存器的工作模式：影子寄存器模式或立即加载模式。对 CMPA 的写操作是对影子寄存器进行的。在设置的特殊时刻，影子寄存器的值加载到工作寄存器。加载的特殊时刻由<code>CMCTRL[LOADMODE]</code>决定，可以在 CTR=0 时刻、CTR=PRD 时刻或两者都可以。</p><p>比较功能子模块可以产生两个独立的比较事件，对于增计数或减计数，在一个 PWM 周期内，比较事件只发生一次。对于增减计数模式，在一个 PWM 周期内，如果比较寄存器的值在 0~TBPRD 之间，在一个 PWM 周期内，比较事件发生两次。</p><hr><p>AQ 子模块决定了相应事件发生时应该输出什么样的电平。该模块是基于事件驱动的，可以认为该子模块<strong>输入的就是事件，输出的是动作</strong>。每个子模块有两路独立输出 EPWMA 和 EPWMB</p><p>AQ 子模块的输入事件有 4 种，事件发生时触发 AQ 子模块，分别是：</p><ol><li>CTR = PRD，计数器寄存器 TBCTR 的值与周期寄存器 TBPRD 相等时；</li><li>CTR = Zero，计数器寄存器 TBCTR 的值等于 0 时；</li><li>CTR = CMPA，计数器寄存器 TBCTR 的值等于比较寄存器 CMPA；</li><li>CTR = CMPB，计数器寄存器 TBCTR 的值等于比较寄存器 CMPB</li></ol><p>将计数方向输入给 AQ 子模块，能够把计数比较事件细分为增计数情形的计数比较事件（CAU 和 CBU）和减计数情形的计数比较事件（CAD 和 CBD）。除了以上外部事 件外，还可以用软件强制触发。通过设置寄存器 AQSFRC、AQCSFRC，产生一个软件强制事件。该软件强制事件可以是单次作用，也可以是连续作用。</p><p>AQ 子模块控制在触发事件产生时，2 路 PWM 输出 EPWMxA 和 EPWMxB 表现出何种行为。PWM 输出 EPWMxA 和 EPWMxB 可以设置为以下的动作：</p><ol><li>置高，EPWMxA 或 EPWMxB 输出高电平；</li><li>置低，EPWMxA 或 EPWMxB 输出低电平；</li><li>翻转，EPWMxA 或 EPWMxB 输出电平与之前的电平相反；</li><li>无动作，EPWMxA 或 EPWMxB 的输出状态不变。</li></ol><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p>任何有效事件都能用来产生预定的动作，例如事件 CTR=CMPA 和 CTR=CMPB 都可以作用于 EPWMxA，不要认为 A 的事件只能用来产生 A 的 PWM 输出。</p></div></div><p>AQ 在硬件上也设计有事件的优先级。在众多事件中，软件强制的优先级始终是最高的。在增减计数下，CTR = CMPB 优先于 CTR = CMPA；增计数方向上，增事件优先于减事件，CTR = Zero 在中间；减计数方向上，减事件优先于增事件，CTR = PRD 在中间</p><p>如果是增/减计数，那么就排除减/增计数方向和减/增事件。</p><hr><p>死区，通常叫死区时间（dead time），用于避免功率开关控制信号翻转时发生误触发的情况。死区子模块 (DB) 就是起到延时导通的作用。实现的功能有：死区发生器时钟选择、死区时间的设置、输入源选择（<code>DBCTL[IN_MODE]</code>）、极性选择（<code>DBCTL[POLSEL]</code>）、输出模式（<code>DBCTL[OUT-MODE]</code>)</p><p>死区发生器产生波形上升沿延时 RED 和下降沿延时 FED，它是通过 10 位计数器来实现的。计数器时钟 DBCLK 可以选择为：</p><ul><li>fDBCLK=fTBCLK，即与 TBCLK 同频，称为周期时钟</li><li>fDBCLK= 2×fTBCLK，即为 TBCLK 的 2 倍频，称为半周期时钟</li></ul><p>死区时延时间计算公式为：<br><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mi>E</mi><mi>D</mi><mo>=</mo><mi>D</mi><mi>B</mi><mi>F</mi><mi>E</mi><mi>D</mi><mo>×</mo><mi>T</mi><mi>T</mi><mi>B</mi><mi>C</mi><mi>L</mi><mi>K</mi></mrow><annotation encoding="application/x-tex">FED = DBFED × TTBCLK</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mord mathnormal" style="margin-right:0.0576em;">E</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mord mathnormal" style="margin-right:0.0576em;">E</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord mathnormal">L</span><span class="mord mathnormal" style="margin-right:0.0715em;">K</span></span></span></span><br><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi><mi>E</mi><mi>D</mi><mo>=</mo><mi>D</mi><mi>B</mi><mi>R</mi><mi>E</mi><mi>D</mi><mo>×</mo><mi>T</mi><mi>T</mi><mi>B</mi><mi>C</mi><mi>L</mi><mi>K</mi></mrow><annotation encoding="application/x-tex">RED = DBRED × TTBCLK</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mord mathnormal" style="margin-right:0.0576em;">E</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mord mathnormal" style="margin-right:0.0576em;">E</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord mathnormal">L</span><span class="mord mathnormal" style="margin-right:0.0715em;">K</span></span></span></span><br>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi> T</mi><mi>T</mi><mi>B</mi><mi>C</mi><mi>L</mi><mi>K</mi></mrow><annotation encoding="application/x-tex">TTBCLK</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord mathnormal">L</span><span class="mord mathnormal" style="margin-right:0.0715em;">K</span></span></span></span> 是时基时钟 TBCLK 的周期。如果选择半周期时钟，则<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi> T</mi><mi>T</mi><mi>B</mi><mi>C</mi><mi>L</mi><mi>K</mi></mrow><annotation encoding="application/x-tex">TTBCLK</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord mathnormal">L</span><span class="mord mathnormal" style="margin-right:0.0715em;">K</span></span></span></span> 也取半。</p><p>通过对应开关控制，死区子模块的输入信号是动作限定子模块的输出信号，记为 EPWMxA in 和 EPWMxB in。信号源可以设置为：</p><ul><li>EPWMxA in 作为上降沿和下升沿延时的信号源，该模式是缺省模式。</li><li>EPWMxA in 作为上降沿延时的信号源，EPWMxB 作为下升沿延时的信号源。</li><li>EPWMxA in 作为下升沿延时的信号源，EPWMxB 作为上降沿延时的信号源。</li><li>EPWMxB in 作为上降沿和下升沿延时的信号源。</li></ul><hr><p>事件触发与中断管理 (ET) 子模块主要功能有：</p><ul><li>管理由时基子模块、比较子模块所产生的事件，这些事件可用于产生 PIE 中断 EPWMxINT 和 ADC 转换启动信号 EPWMxSOCA 和 EPWMxSOCB</li><li>允许软件强制触发中断和启动 ADC 转换</li><li>通过事件分频机制，灵活设置输出触发事件的频度</li></ul><p>可用于 ET 子模块的输入事件信号有：</p><ul><li>CTR=Zero：计数器寄存器的值为 0，TBCTR =0</li><li>CTR=PRD：计数器寄存器的值为 PRD，TBCTR =PRD</li><li>CTR=Zero 或 CTR=PRD：TBCTR = 0 或 TBCTR = period</li><li>CTRU=CMPA：在计数器增计数时，TBCTR=CMPA，CTR_dir=1</li><li>CTRD=CMPA：在计数器减计数时，TBCTR=CMPA，CTR_dir=0</li><li>CTRU=CMPB：在计数器增计数时，TBCTR=CMPB，CTR_dir=1</li><li>CTRD=CMPB：在计数器减计数时，TBCTR=CMPB，CTR_dir=0</li><li>软件产生的强制事件信号</li></ul><p>每个 ePWM 的 ET 子模块拥有的输出事件信号有：</p><ul><li>1 路 PIE 中断，EPWMxINT</li><li>2 路 ADC 启动信号，EPWMxSOCA 和 EPWMxSOCB</li></ul><hr><p>PWM 周期：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi><mo>=</mo><mo stretchy="false">(</mo><mi>N</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo>×</mo><msub><mi>T</mi><mrow><mi>c</mi><mi>l</mi><mi>k</mi></mrow></msub></mrow><annotation encoding="application/x-tex">T=(N + 1)×T_{clk}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.109em;">N</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight" style="margin-right:0.0197em;">l</span><span class="mord mathnormal mtight" style="margin-right:0.0315em;">k</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><p>占空比与比较值：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>T</mi><mrow><mi>h</mi><mi>i</mi><mi>g</mi><mi>h</mi></mrow></msub><mo>=</mo><mi>C</mi><mi>M</mi><mi>P</mi><mo>+</mo><msub><mi>T</mi><mrow><mi>c</mi><mi>l</mi><mi>k</mi></mrow></msub></mrow><annotation encoding="application/x-tex">T_{high} = CMP + T_{clk}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">hi</span><span class="mord mathnormal mtight" style="margin-right:0.0359em;">g</span><span class="mord mathnormal mtight">h</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight" style="margin-right:0.0197em;">l</span><span class="mord mathnormal mtight" style="margin-right:0.0315em;">k</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><h3 id="3、软件思维导图"><a class="header-anchor" href="#3、软件思维导图"></a>3、软件思维导图</h3><p>引脚配置：</p><ol><li>配置引脚功能（GPIO_setMode）</li><li>配置引脚方向（GPIO_setDirection）</li><li>使能 / 禁止内部上拉电阻（GPIO_setPullUp）</li><li>输入配置为异步系统时钟（GPIO_setQualification）</li></ol><p>功能配置：</p><ol start="5"><li>PWM 时基时钟关闭（CLK_disableTbClockSync (myClk)</li><li>PWM 时钟设置（PWM_setHighSpeedClkDiv、PWM_setClkDiv）</li><li>PWM 计数模式设置（PWM_setCounterMode）</li><li>PWM 动作限定设置（AQ 模块）</li><li>计算 PWM 的周期、周期设置（PWM_setPeriod）</li><li>计算 PWM 的占空比、占空比设置（CC 模块）</li><li>设置 PWM 死区（DB 模块, 可选项）</li><li>设置 PWM 斩波（PC 模块，可选项）</li><li>设置 PWM 故障联防（TZ 模块，可选项）</li><li>PWM 时基时钟开启（CLK_enableTbClockSync）</li><li>PWM 事件触发与中断管理（ET 模块）</li></ol><p>中断事件配置：</p><ol start="16"><li>中断入口地址注册（PIE_registerPieIntHandler）</li><li>PWMx 事件中断使能（PWM_enableInt）</li><li>PIE 级中断使能（PIE_enableInt）</li><li>CPU 级中断使能（CPU_enableInt）</li></ol><p>中断服务程序：</p><ol start="20"><li>在 PWM 中断服务程序里完成比较点的更新或其他任务</li><li>清除 PWM 中断标志位和对应的 PIE 中断应答位 PIEACKx。</li></ol><h2 id="CH10-模-数转换器"><a class="header-anchor" href="#CH10-模-数转换器"></a>CH10 模 / 数转换器</h2><h3 id="1、ADC基础知识"><a class="header-anchor" href="#1、ADC基础知识"></a>1、ADC 基础知识</h3><p>模拟数字转换器（Analog to Digital Converter, ADC），也称模数转换器，是将连续变化的模拟信号转换为离散的数字信号的电子器件。因为 CPU 只能处理数字量，所以需要把外部待测量的模拟量转换为数字量</p><p>输出量为待测量的电压、电流、温度、压力、流量、速度等<strong>物理量</strong>，这些物理量先经过传感器变换为<strong>电信号</strong>，再调制成符合 ADC 模块输入电压范围的<strong>电压模拟量</strong>，最后送给 ADC 模块转换为<strong>数字量</strong>，实时控制系统可以对该数字量进行处理</p><p>输入的模拟信号在时间上是<strong>连续</strong>的，而输出的数字信号是<strong>离散</strong>的。将连续的模拟量转换为离散的数字量通常要经过 3 个步骤：<strong>采样保持、量化、编码</strong>。</p><ol><li>采样是将随时间变化的模拟量转换为在时间上离散的模拟量，保持则将所采样的模拟信号值保持一段时间，以使得后续的量化编码过程中信号值不发生变化。</li><li>采样后每个脉冲的幅度仍然是连续的，必须对每个脉冲的幅度进行离散化处理。将采样保持电路输出的电平转换为量化单位的整数倍的过程称为量化。</li><li>把量化的结果用二进制表示出来叫做编码。</li></ol><p>ADC 的主要性能参数有量程、分辨率、精度、转换时间、量化误差、偏移误差等。除此之外，其他指标还有：绝对精度、相对精度、微分非线性、单调性和无错码、总谐波失真和积分非线性等等。</p><p><strong>量程</strong>是指 ADC 所能转换的模拟输入电压的范围，分为单极性和双极性两种类型。</p><p>量化时需要把电平转换为量化单位的整数倍，因为模拟电压是连续的，它不一定能被量化单位整除，因而不可避免地会存在<strong>量化误差</strong>。AD<strong> 分辨率</strong>越高，量化误差越小。一般是 1 个或 0.5 个最小数字量的模拟变化量，表示为 1LSB 或 0.5LSB</p><p>分辨率（Resolution）：指 ADC 能分辨的<strong>最小模拟输入量</strong>。从理论上来讲，n 位输出的 ADC 能区分 2n 个不同等级的输入模拟电压，能区分输入电压的最小值为满量程输入的<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mn> 1</mn><msup><mn>2</mn><mi>n</mi></msup></mfrac></mrow><annotation encoding="application/x-tex">\frac{1}{2^n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mtight">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.5935em;"><span style="top:-2.786em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="katex-sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>。</p><p>精度（Accuracy）：精度是指对于 ADC 的数字输出（二进制代码），其实际需要的模拟输入值与理论上要求的模拟输入值之差。</p><p>转换时间（Conversion time）：ADC 完成一次 AD 转换所需要的时间，是指从启动 ADC 开始到获得相应数据所需要的时间。一般来讲，ADC 的分辨率越高，转换时间就越长。</p><p>偏移误差（Offset Error）：模拟量输入信号为零时，数字量输出不为零的值。</p><p>增益误差（Gain Error）：满刻度输出时对应的模拟输入量与理想的模拟输入量之差。</p><p>ADC 的主要类型：</p><ul><li><p>逐次逼近型 ADC 属于<strong>直接式 ADC</strong>，其原理可理解为将输入模拟量逐次与 UREF/2、UREF/4、UREF/8、…、UREF/2N-1 作比较，模拟量大于比较值取 1（并减去比较值），否则取 0。逐次逼近型 ADC 转换精度高，速度较快，价格适中，是目前种类最多、应用最广的 AD 转换器</p></li><li><p>积分型 ADC 是一种间接式 ADC，其原理是将输入模拟量和基准量通过积分器积分，转换为时间，再对时间计数，计数值即为数字量。优点是转换精度高，缺点是转换时间较长。</p></li><li><p>并行比较型 ADC 的主要原理是将参考电压分为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>N</mi></msup><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2^N-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9247em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.109em;">N</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 个等级（对于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>N</mi></mrow><annotation encoding="application/x-tex">N</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">N</span></span></span></span> 位的 ADC），通过 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>N</mi></msup><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">2^N-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9247em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8413em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.109em;">N</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 个比较器和输入模拟电压进行比较，比较器的输出状态由触发器存储，经编码器编码，得到数字量输出。速度快，但其分辨率不高。</p></li><li><p>压频变换型 ADC 是一种间接式 ADC，其原理是将模拟量转换为频率信号，再对频率信号计数，转换为数字量。精度高，功耗较低，抗干扰能力强，便于长距离传送，但转换速度较低。</p></li><li><p>∑-Δ 型 ADC 又称为过采样型 ADC，是目前分辨率最高的 ADC。它主要由采样 / 保持电路、模拟低通滤波器、DAC 及数字滤波器构成。大多数的模块都是由数字电路搭建，一些噪声对其的影响很小。</p></li><li><p>流水线型 ADC 的原理是将多级比较网络级联在一起，每一级得到一位数字码。如果需要的是 n 位数字码，则需要比较 n 次。每次输入的信号必须从头传到尾才算完成了一次量化编码。其优点是高速、高精度，低功耗，芯片面积小，同时具有优异的动态特性。</p></li></ul><h3 id="2、C2000的ADC（12位ADC内核、量程、SOC）"><a class="header-anchor" href="#2、C2000的ADC（12位ADC内核、量程、SOC）"></a>2、C2000 的 ADC（12 位 ADC 内核、量程、SOC）</h3><p>具有内置双采样保持 (S/H) 的 12 位 ADC 内核</p><p>ADC 内核包含一个 12 位转换器，转换器为部分逐次逼近型、部分流水线型。转换器的模拟参考电平可以配置为外部电压基准 (VREFHI/VREFLO)，也可以配置为内部电压基准。</p><p>全范围模拟输入：0V 至 3.3V，或者 VREFLO 到 VREFHI</p><p>F28027 有 13 个 ADC 引脚可以与外部模拟量相连，分为两组，包括 ADCINA（ADCINA7、ADCINA6、ADCINA4、ADCINA3、ADCINA2、ADCINA1、ADCINA0 等 7 个引脚）和 ADCINB（ADCINB7、ADCINB6、ADCINB4、ADCINB3、ADCINB2、ADCINB1 等 6 个引脚）。在芯片内部，内置温度传感器占用 A5 输入，参考电压 VREFLO 占用 B5 输入，ADCINA5、ADCINB5 和 ADCINB0 没有外接引脚。</p><p>ADC 的工作是基于 SOC 控制的，SOC 信号送到 ADC 采样决策辑模块（ADC Sample Generation Logic）进行决策，产生相应的控制信号：通道选择（CHSEL）、采样窗设置（ACQPS）和开始转换触发信号（SOC）。</p><p>每个 SOC 可以独立配置：<strong>转换的通道、采样窗宽度和选择开始转换的触发源</strong>。转换方式灵活：用同一个触发源对不同的通道进行采样；用不同的触发源对不同的通道进行采样；也可以用一个触发源对同一个采样通道进行多次采样的过采样。</p><p>输入电路包括通道选择和采样 / 保持电路。ADC 模块输入的通道有 16 个（F28027 只有 13 个，见概述说明），分为 A 组和 B 组，各 8 个。当使用外部参考电平时，电平 VREFHI 占用 ADCINA0 引脚，ADCINA0 不能当作采样输入口。</p><p>采样窗的配置信号 ACQPS 来自采样决策模块。ADC 的采样保持电路必须快速准确地跟踪被采样的信号 ADCIN。AD 处理总的时间等于采样时间和转换时间之和。</p><p>ADC 触发源用于启动 SOC 配置的通道开始 AD 转换。每个 SOC 的触发源可以配置为以下任意一个事件：</p><ul><li>软件立即触发</li><li>ePWM 1-4 的 SOCA 和 SOCB</li><li>外部中断 2，GPIO XINT2</li><li>CPU 定时器 0/1/2 中断</li><li>ADCINT1/2。用 ADC 转换结束中断信号作为触发事件，</li><li>可以用于通道的连续转换控制。</li></ul><p>ADC 转换的结果保存在结果寄存器 ADCRESULTx 中。保存方式是：顺序采样时，SOCx 触发的通道转换结果保存在对应的 ADCRESULTx 中，序号一一对应。对于同步采样，通常只用偶数的 SOCx，该 SOCx 配置的一对通道转换后结果保存在 ADCRESULTx 和 ADCRESULT（x+1）中，分别对应 A 组和 B 组的转换结果。</p><p>当多个 SOC 被同时触发时，需要通过优先级来决定哪个 SOC 对应的通道优先被转换。采样优先级有两种模式：Round Robin 模式和具有高优先级的 Round Robin 模式。</p><ul><li><p>Round Robin 模式：是由 SOC0~SOC15 组成的一个头尾相接，方向固定的循环闭环。优先级由循环指针 RRPOINTER 决定。当前 RRPOINTER 的值表示上一次被转换的 SOC，那么它的下一个 SOC 具有最高的优先级。ADC 模块复位后，RRPOINTER=20h，表示没有 SOC 被转换，那么 SOC0 具有最高优先级。</p></li><li><p>具有高优先级的 Round Robin 模式：该模式可以设置某些 SOC 具有高优先级，这些高优先级的 SOC 可以打断 Round Robin 的循环顺序，优先进行转换。多个高优先级的 SOC，序号低的优先级高。</p></li></ul><p>对应于 16 个独立的 SOCx，有相应的 16 个采样结束信号 EOCx。ADC 模块有 9 个中断输出信号，即 ADCINT1~ADCINT9。任意一个 EOCx 脉冲都可以配置为 ADCINTx 的触发源。</p><h2 id="CH11-串行通信接口"><a class="header-anchor" href="#CH11-串行通信接口"></a>CH11 串行通信接口</h2><h3 id="1、串行通信的基础知识"><a class="header-anchor" href="#1、串行通信的基础知识"></a>1、串行通信的基础知识</h3><p>MCU 通信的数据是以字节为单位进行传输，其中每个字节包括多个数据位，根据数据位传输方式的不同，MCU 通信可分为串行通信和并行通信。</p><p>串行通信定义：字节中的数据一位一位依次传送的通信方式，具有传输信号线少、传输距离远等优点，但传输速度慢。</p><p>并行通信定义：字节中的所有数据位同时传送的通信方式，传输速度快，但是所需传输信号线多，适用于近距离通信。</p><p>SCI 串行通信仅需<strong>接收和发送两根信号线</strong>，8 位并行通信则<strong>需 8 根信号线</strong>。这两种通信方式除了信号线外，<strong>还需一根零电位参考线</strong>。</p><p>根据电平与数据对应的不同形成不同的编码方式，可分成 RZ 编码（Return Zero Code）、NRZ (Not Return Zero Code) 和 NRZI（Not Return Zero Inverted Code）等。</p><p>在 RZ 编码中，正电平代表逻辑 1，负电平代表逻辑 0，并且每传输完一位数据信号<strong>返回到零电平</strong></p><p>与 RZ 编码不同的是，NRZ 编码电平不需要归零，因此只需采用高、低两种电平即可进行数据传输。</p><p>NRZI 编码使用信号的翻转代表一种逻辑，信号保持不变代表另外一种逻辑，如 “0” 对应电平翻转，“1” 电平保持不变。</p><p>数据在信号线上传输时需要满足一定的规范，才能使得通信双方正确地收发数据。通常以<strong>帧</strong>（frame）为单位进行数据传输。</p><p>从开始位到结束位的时间间隔称为一帧，通常一帧数据包括 1 位开始位、8 位数据位、1 到 2 位的停止位。</p><p>异步串行通信过程中，通信双方的发送和接收步调要一致才能保证传输数据的正确接收。因此，通过波特率（Boad Rate）来实现通信双方的步调一致，波特率是用来描述数据传输的速率。常用的波特率有 600、2400、4800、9600、19200、38400、57600、115200、128000 等。通信距离越长的时候通常选用越低的波特率。</p><p>在一帧数据中增加一位奇偶校验位用于错误检测。奇校验时，如果数据位 1 的个数是奇数，则校验位为 0；如果 1 的个数为偶数，则校验位为 1。偶校验时，如果数据位 1 的个数是奇数，则校验位为 1；如果 1 的个数为偶数，则校验位为 0。</p><p>串行通信根据接线的不同，有单工、半双工、全双工三种传输方式。</p><ul><li>单工通信：数据传输是单向的，除了地线外，只有一根数据线。</li><li>半双工通信：数据传输是双向的，但是只有一根数据线，发送和接收不能同时进行。</li><li>全双工通信：数据传输是双向的，有两根独立的数据线，发送和接收可以同时进行。</li></ul><h3 id="2、C2000的SCI（波特率、数据帧）"><a class="header-anchor" href="#2、C2000的SCI（波特率、数据帧）"></a>2、C2000 的 SCI（波特率、数据帧）</h3><p>SCI 的波特率由时钟 LSPCLK 和波特率配置寄存器控制。LSPCLK 由系统时钟模块的低速外设时钟预分频寄存器配置，波特率选择寄存器为 16 位寄存器，有 65536 种不同的波特率选择。</p><p>假设 16 位波特率配置寄存器配置值为 BRR，则对应的波特率计算方法为：</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mi>a</mi><mi>u</mi><mi>d</mi><mo>=</mo><mfrac><mrow><mi>L</mi><mi>S</mi><mi>P</mi><mi>C</mi><mi>L</mi><mi>K</mi></mrow><mrow><mo stretchy="false">(</mo><mi>B</mi><mi>R</mi><mi>R</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo>∗</mo><mn>8</mn></mrow></mfrac><mo separator="true">,</mo><mn>1</mn><mo>≤</mo><mi>B</mi><mi>R</mi><mi>R</mi><mo>≤</mo><mn>65535</mn></mrow><annotation encoding="application/x-tex">Baud=\frac{LSPCLK}{(BRR+1)*8}, 1≤BRR≤65535</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.3923em;vertical-align:-0.52em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8723em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.0502em;">B</span><span class="mord mathnormal mtight" style="margin-right:0.0077em;">R</span><span class="mord mathnormal mtight" style="margin-right:0.0077em;">R</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mclose mtight">)</span><span class="mbin mtight">∗</span><span class="mord mtight">8</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">L</span><span class="mord mathnormal mtight" style="margin-right:0.0576em;">S</span><span class="mord mathnormal mtight" style="margin-right:0.1389em;">P</span><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span><span class="mord mathnormal mtight">L</span><span class="mord mathnormal mtight" style="margin-right:0.0715em;">K</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.52em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8193em;vertical-align:-0.136em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">≤</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">65535</span></span></span></span><br><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>B</mi><mi>a</mi><mi>u</mi><mi>d</mi><mo>=</mo><mfrac><mrow><mi>L</mi><mi>S</mi><mi>P</mi><mi>C</mi><mi>L</mi><mi>K</mi></mrow><mn>16</mn></mfrac><mo separator="true">,</mo><mi>B</mi><mi>R</mi><mi>R</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">Baud=\frac{LSPCLK}{16}, BRR=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal">a</span><span class="mord mathnormal">u</span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.2173em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8723em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">16</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">L</span><span class="mord mathnormal mtight" style="margin-right:0.0576em;">S</span><span class="mord mathnormal mtight" style="margin-right:0.1389em;">P</span><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span><span class="mord mathnormal mtight">L</span><span class="mord mathnormal mtight" style="margin-right:0.0715em;">K</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span></p><p>帧格式配置：</p><ul><li>1 位开始位；</li><li>1-8 位数据位；</li><li>1 位地址和数据的识别位（针对地址位方式的多机模式）</li><li>1 位可选的奇偶校验位</li><li>1 或 2 位停止位</li></ul><p>需要学会画出帧的波形表示。</p><h2 id="CH12-实验"><a class="header-anchor" href="#CH12-实验"></a>CH12 实验</h2><p>总共 4 次实验，代码运行结果需要给老师测试。实验代码可以参考文字辅导材料、视频教程（<a href="https://www.bilibili.com/video/BV16kcBzwEdC">CCS 软件开发 ---F28027</a>）和 AI。由于是小组形式，因此可以组内外私下交流。老师一般不会要求你解释代码功能，只会让你向他展示运行结果。</p><p>建议早测试早结束。大部分人都是将测试积压到后面的课时，导致组内和组间需要竞争测试机会——一次课只有一个半小时，还不算理论教授时间。最极端的情况下，你可能需要和老师单独约定时间测试。</p><p>注意基础配置：什么文件在哪个文件夹，各类初始化在哪个文件。在考试中需要回忆得起来，因为有程序填空题。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/3c5ed94a/</id>
    <link href="https://watermelonabc.top/p/3c5ed94a/" rel="alternate"/>
    <published>2026-06-21T16:26:21.000Z</published>
    <summary>为毛跨学科的选修课也这么难啊</summary>
    <title>福州大学单片机原理与应用（跨学科）复习</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="复习笔记" scheme="https://watermelonabc.top/categories/%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="FZU" scheme="https://watermelonabc.top/tags/FZU/"/>
    <content>
      <![CDATA[<blockquote><p>最终成绩：76 分</p></blockquote><h2 id="考试流程"><a class="header-anchor" href="#考试流程"></a>考试流程</h2><p>考试时间 100 分钟，前 60 分钟为论述题回答时间，后 40 分钟为选择题回答时间。选择题使用超星学习通系统，论述题回答结束后也上传一份电子档至学习通。</p><p>答题纸左侧为第 1 题答题区域，右侧为第 2 题答题区域。论述题回答时间内，不得使用手机。论述题回答结束时，将回答结果拍照上传至学习通，5 分钟内提交答题纸。</p><h2 id="问答题"><a class="header-anchor" href="#问答题"></a>问答题</h2><h3 id="Q1-什么是马克思主义中国化时代化？"><a class="header-anchor" href="#Q1-什么是马克思主义中国化时代化？"></a>Q1 什么是马克思主义中国化时代化？</h3><p>（<strong>定义</strong>）马克思主义中国化时代化，就是立足中国国情和时代特点，坚持把马克思主义基本原理同中国具体实际相结合、同中华优秀传统文化相结合，深入研究和解决中国革命、建设、改革不同历史时期的实际问题，真正搞懂面临的时代课题，不断吸收新的时代内容，科学回答时代提出的重大理论和实践课题，创造新的理论成果。</p><p>（<strong>内涵</strong>）运用马克思主义的立场、观点、方法，观察时代，把握时代，引领时代，解决中国革命、建设、改革中面临的实际问题；总结和提炼中国实践经验，并上升为理论，以指导新的实践，赋予马克思主义新的时代内涵和实践要求；运用中国人民喜闻乐见的民族语言来阐述马克思主义、使其植根于中华优秀传统文化的土壤之中, 具有中国特色、中国风格、中国气派。准确把握马克思主义中国化时代化的科学内涵，要做到坚持马克思主义和发展马克思主义相统一，要做到同中国具体实际、同中国优秀传统文化相结合。</p><h3 id="Q2-如何理解马克思主义中国化时代化是“一脉相承又与时俱进的关系”？（已考）"><a class="header-anchor" href="#Q2-如何理解马克思主义中国化时代化是“一脉相承又与时俱进的关系”？（已考）"></a>Q2 如何理解马克思主义中国化时代化是 “一脉相承又与时俱进的关系”？（已考）</h3><p>一脉相承：都坚持马克思主义基本原理，都立足中国实际<br>与时俱进：每个理论都回答了不同历史时期面临的主要问题；后一个理论都是对前一个理论的继承、丰富和发展</p><p>一方面，毛泽东思想所蕴含的马克思主义的立场、观点和方法，为中国特色社会主义理论体系提供了基本遵循。另一方面，中国特色社会主义理论体系在新的历史条件下进一步丰富和发展了毛泽东思想。</p><p>（举一个例子，建议从 “实事求是、群众路线、独立自主” 中选。比如群众路线 -&gt; “三个有利于”（邓）-&gt; “三个代表”（江）-&gt; 科学发展观（胡）-&gt; 习近平思想，论述后面发展的理论如何传承毛泽东思想中的 “群众路线”）</p><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p>“三个有利于”：是否有利于发展社会主义社会的生产力、是否有利于增强社会主义国家的综合国力、是否有利于提高人民的生活水平<br>“三个代表”：中国共产党始终代表中国先进生产力的发展要求、始终代表中国先进文化的前进方向、始终代表中国最广大人民的根本利益<br>科学发展观：坚持以人为本，全面、协调、可持续的发展观。发展为了人民、发展依靠人民、发展成果由人民共享</p></div></div><h3 id="Q3-为什么新民主主义革命属于资产阶级民主主义革命？"><a class="header-anchor" href="#Q3-为什么新民主主义革命属于资产阶级民主主义革命？"></a>Q3 为什么新民主主义革命属于资产阶级民主主义革命？</h3><p>近代中国<strong>半殖民地半封建社会</strong>的性质和<strong>中国革命的历史任务</strong>，决定了新民主主义革命的性质是资产阶级民主主义革命。新民主主义革命在政治上争取和联合民族资产阶级，在经济上保护民族工商业。它要建立的是无产阶级领导的<strong>各革命阶级的联合</strong>专政，而不是无产阶级专政。</p><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">新民主主义革命时期中国革命的历史任务</div></div><div class="callout-content"><p>反对帝国主义、封建主义、官僚资本主义，争取民族独立、人民解放，为实现中华民族伟大复兴创造根本社会条件。</p></div></div><h3 id="Q4-说明新旧民主主义革命的区别（“新”在哪里？）"><a class="header-anchor" href="#Q4-说明新旧民主主义革命的区别（“新”在哪里？）"></a>Q4 说明新旧民主主义革命的区别（“新” 在哪里？）</h3><p>新民主主义革命处于世界无产阶级社会主义革命的时代，是世界无产阶级社会革命的一部分；革命的领导力量是中国无产阶级及其先锋队——中国共产党；革命的指导思想是马克思列宁主义；革命的前途是社会主义而不是资本主义。</p><h3 id="Q5-为什么说“新民主主义社会是一个过渡性的社会”？（已考）"><a class="header-anchor" href="#Q5-为什么说“新民主主义社会是一个过渡性的社会”？（已考）"></a>Q5 为什么说 “新民主主义社会是一个过渡性的社会”？（已考）</h3><p>新民主主义社会不是一个独立的社会形态，而是由新民主主义转变到社会主义的过渡性的社会。</p><p>（<strong>生产力</strong>）新民主主义社会中存在着五种经济成分，其中主要的经济成分是三种：<strong>社会主义经济、个体经济和资本主义经济</strong>。通过没收官僚资本而形成的社会主义的国营经济，掌握了主要经济命脉，居于领导地位；而以农业和手工业为主体的个体经济，则在国民经济中占绝对优势。新民主主义社会要继续向前发展，就要不断扩大国营经济，同时逐步将资本主义经济和个体经济转变为社会主义经济，使社会主义经济逐步成为我国的经济基础。</p><p>（<strong>基本纲领</strong>）</p><ul><li>政治上：推翻帝国主义、封建主义和官僚资本主义的反动统治，建立无产阶级领导的，以工农联盟为基础的，<strong>各革命阶级联合专政</strong>的新民主主义国家。这是过渡形式。</li><li>经济上：没收封建地主阶级的土地<strong>归农民</strong>所有，没收官僚资产阶级的垄断资本归新民主主义国家所有，<strong>保护民族工商业</strong>。</li><li>文化上：是<strong>无产阶级领导</strong>的人民大众的反帝反封建的文化，是民族的、科学的、大众的文化。</li></ul><p>（<strong>主要矛盾</strong>）土地改革完成后，<strong>工人阶级和资产阶级</strong>的矛盾逐渐成为我国社会的主要矛盾。只有解决了这一矛盾，才能使中国社会实现向社会主义的转变。</p><p>新民主主义社会是属于社会主义体系的，是逐步过渡到社会主义社会的过渡性质的社会。为了促进社会生产力的进一步发展，为了实现国家富强、民族复兴、人民幸福，我国新民主主义社会必须适时地逐步过渡到社会主义社会。</p><h3 id="Q6-为什么进行社会主义改造？"><a class="header-anchor" href="#Q6-为什么进行社会主义改造？"></a>Q6 为什么进行社会主义改造？</h3><ol><li>我国有极其广大的个体农业和手工业及在国民经济中占很大一部分比重的资本主义工商业，要求一个相当长的时期改造它们。</li><li>经过 1949 年到 1952 年三年的努力，我国已经有了相对强大和迅速发展的社会主义国营经济。这为党提出向社会主义过渡的总路线提供了物质基础。</li><li>国内的资本主义力量弱小，发展困难，不可能成为中国工业起飞的基础。</li><li>党总结在国民经济恢复时期在老解放区大力推广农业互助组和初级合作社的经验。这也为党提出向社会主义过渡的总路线提供了重要依据。</li><li>新中国成立初期，国家在利用和限制资本主义工商业的过程中所积累的经验，成为对资本主义经济进行社会主义改造的最初步骤。</li><li>当时的国际形势也有利于中国向社会主义过渡。苏联社会主义的发展已经显示出相对于资本主义的优越性，对我国有重要的借鉴作用。</li></ol><h3 id="Q7-为什么不是走资本主义工业化，而是走社会主义工业化道路？"><a class="header-anchor" href="#Q7-为什么不是走资本主义工业化，而是走社会主义工业化道路？"></a>Q7 为什么不是走资本主义工业化，而是走社会主义工业化道路？</h3><p>从历史上看，实现工业化有两条道路：一条是资本主义工业化道路，另一条是社会主义工业化道路。</p><blockquote><p>“资本主义道路，也可增产，但<strong>时间要长</strong>，而且是<strong>痛苦的道路</strong>。我们<strong>不搞资本主义</strong>，这是定了的。”——毛泽东</p></blockquote><p>三个 “不”：</p><ul><li>等不起：资本主义工业化开始于 18 世纪 60 年代英国的产业革命，至 19 世纪后期，主要资本主义国家先后完成了工业化。我国和资本主义国家有上百年的发展差距，不是短时间内可以弥补的。当时的中国必须在比较短的时间内实现自身实力的提升。</li><li>玩不起：资本主义通过剥削、掠夺实现资本原始积累。我国不可能选择对外侵略，必须依靠自身力量实现工业化。</li><li>走不起：以美国为首的西方资本主义阵营对我国实施长期封锁、禁运和军事威胁；与之同时，苏联等社会主义国家向我国提供了援助和宝贵经验。当时的时代条件和国际环境的新特点促使中国人民选择走社会主义道路。</li></ul><h3 id="Q8-如何理解改革开放前后历史时期关系？"><a class="header-anchor" href="#Q8-如何理解改革开放前后历史时期关系？"></a>Q8 如何理解改革开放前后历史时期关系？</h3><ol><li>前 30 年在重大挫折中取得了巨大成就，全盘否定前 30 年的历史是极端错误的。毛泽东等开国元勋带领全国人民进行社会主义革命和建设，取得了巨大成绩；前 30 年属于探索时期，出现错误在所难免。</li><li>改革开放前后时期是<strong>探索、铺垫</strong>与<strong>继承、发展</strong>的关系。改革开放前的社会主义实践探索为改革开放后的社会主义实践探索积累了经验并准备了条件，改革开放后的社会主义实践探索是对前一个时期探索的坚持、改革、发展。</li><li>对改革开放前的社会主义实践探索，要坚持实事求是，分清主流和支流，坚持真理，修正错误，发扬经验，吸取教训。</li></ol><h3 id="Q9-如何理解国内改革和国外开放的关系？"><a class="header-anchor" href="#Q9-如何理解国内改革和国外开放的关系？"></a>Q9 如何理解国内改革和国外开放的关系？</h3><p>开放也是改革。对外开放是建设中国特色社会主义的一项基本国策。对外开放之所以重要，是因为历史经验一再告诉我们，关起门来搞建设是不行的，把自己孤立于世界之外是不利的。对外开放，包括对发达国家的开放，也包括对发展中国家的开放，是对世界所有国家的开放。它不仅是经济领域的开放，还包括科技、教育、文化等领域的开放。</p><p>改革是开放的<strong>基础与内因</strong>，国内制度完善、市场统一和营商环境优化，决定了对外开放的深度与能级，为高水平开放提供制度支撑。开放是改革的催化剂与压力测试，通过对接国际高标准经贸规则，引入外部竞争，倒逼国内体制机制创新，破除利益固化藩篱，实现 “以开放促改革”。</p><h3 id="Q10-如何理解社会主义市场经济制度中政府和市场的关系？"><a class="header-anchor" href="#Q10-如何理解社会主义市场经济制度中政府和市场的关系？"></a>Q10 如何理解社会主义市场经济制度中政府和市场的关系？</h3><blockquote><p>“计划经济不等于社会主义，资本主义也有计划；市场经济不等于资本主义，社会主义也有市场。”——邓小平</p></blockquote><p>社会主义市场经济理论的要点：一是计划经济和市场经济不是划分社会制度的标志，计划经济不等于社会主义，市场经济也不等于资本主义；二是计划和市场都是经济手段，对经济活动的调节各有优势和长处，社会主义实行市场经济要把两者结合起来；三是市场经济作为资源配置的一种方式本身不具有制度属性，可以和不同的社会制度结合，从而表现出不同的性质。</p><h3 id="Q11-为什么说“改革是中国的第二次革命”？"><a class="header-anchor" href="#Q11-为什么说“改革是中国的第二次革命”？"></a>Q11 为什么说 “改革是中国的第二次革命”？</h3><p>所谓第二次革命，是与中国共产党领导的第一次革命相对而言的。中国共产党领导的第一次革命把一个半殖民地半封建的旧中国变成了一个社会主义新中国；中国共产党领导的第二次革命，将把一个经济文化比较落后的社会主义中国变成一个现代化的社会主义国家。没有改革，就不可能走出一条建设中国特色社会主义的正确道路，我们的事业就不可能顺利前进。</p><p>改革作为一次新的革命，不是也不允许否定和抛弃我们建立起来的社会主义基本制度，它是社会主义制度的自我完善和发展。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/763d5207/</id>
    <link href="https://watermelonabc.top/p/763d5207/" rel="alternate"/>
    <published>2026-06-10T14:28:40.000Z</published>
    <summary>燃尽了^2</summary>
    <title>福州大学毛概期末复习</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="学习笔记" scheme="https://watermelonabc.top/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="ASM" scheme="https://watermelonabc.top/tags/ASM/"/>
    <content>
      <![CDATA[<h2 id="7-x86-汇编语言元素"><a class="header-anchor" href="#7-x86-汇编语言元素"></a>7. x86 汇编语言元素</h2><p>现在我们带你讲解一下一个汇编语言程序是怎么写的。x86 汇编语言由<strong>语句</strong> (statement) 构成，一条语句可能有以下元素：</p><h3 id="7-1-常量整数和常量整数表达式"><a class="header-anchor" href="#7-1-常量整数和常量整数表达式"></a>7.1 常量整数和常量整数表达式</h3><p>一个常量整数表示为 <code>[{ + | - }] 数字 { 基数字符 }</code>，例如 <code>-10</code>、<code>11010011b</code>、<code>0A3h</code>。</p><blockquote><p>标识说明：</p><ul><li><code>[]</code> 的内容是可选的</li><li><code>{ A | B }</code> 说明必须在 <code>A</code> 和 <code>B</code> 中选择一项</li></ul></blockquote><p>基数字符说明了此整数使用的数制，如下表所示：</p><table><thead><tr><th style="text-align:center">基数字符</th><th style="text-align:center">数制</th></tr></thead><tbody><tr><td style="text-align:center">空置/<code>d</code></td><td style="text-align:center">十进制 (Dec)</td></tr><tr><td style="text-align:center"><code>q</code>/<code>o</code></td><td style="text-align:center">八进制 (Oct)</td></tr><tr><td style="text-align:center"><code>h</code></td><td style="text-align:center">十六进制 (Hex)</td></tr><tr><td style="text-align:center"><code>b</code></td><td style="text-align:center">二进制 (Bin)</td></tr></tbody></table><p>如果一个十六进制值以字母开头，如 <code>A4</code>，则必须加上前缀 <code>0</code> 以免和变量名混淆。</p><p>整数字面量间的运算使用以下运算符：</p><table><thead><tr><th style="text-align:center">运算符</th><th style="text-align:center">优先级</th><th style="text-align:center">备注</th></tr></thead><tbody><tr><td style="text-align:center"><code>()</code></td><td style="text-align:center">1</td><td style="text-align:center"></td></tr><tr><td style="text-align:center"><code>+</code>, <code>-</code></td><td style="text-align:center">2</td><td style="text-align:center">正负号</td></tr><tr><td style="text-align:center"><code>*</code>, <code>/</code></td><td style="text-align:center">3</td><td style="text-align:center"></td></tr><tr><td style="text-align:center"><code>mod</code></td><td style="text-align:center">4</td><td style="text-align:center"></td></tr><tr><td style="text-align:center"><code>+</code>, <code>-</code></td><td style="text-align:center">5</td><td style="text-align:center">加减号</td></tr></tbody></table><p>每个表达式的计算结果必须为可存储为 32 位的整型（<code>0</code> ~ <code>FFFFFFFF</code>），此结果在编译时确定，运行时不可变。</p><p><code>EQU</code> 指令可以设置符号整数常量，相当于 C 中的 <code>#define</code>，格式为 <code>标识符 EQU 常量整数表达式</code>。<code>EQU</code> 定义的常量在汇编时直接替换为字面量，因此运行时固定不可变。更宽松的版本是 <code>=</code> 指令，允许常量重定义，但依然是汇编时确定，运行时不可更改。</p><h3 id="7-2-其他常量"><a class="header-anchor" href="#7-2-其他常量"></a>7.2 其他常量</h3><p>常量实数表示为 <code>[{ + | - }]数字.[数字][指数]</code>，其中<code>[指数]</code>为科学记数法中的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>×</mo><msup><mn>10</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">×10^{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7477em;vertical-align:-0.0833em;"></span><span class="mord">×</span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 部分，表示为 <code>E[{ + | - }]integer</code>。<code>2.</code>、<code>-44.2E+05</code>、<code>26.E5</code> 都是合法的十进制实数。常量实数按照 IEEE 浮点数格式转换存储。</p><p>编码实数 (encoded real) 以十六进制表示，用 <code>r</code> 结尾。对应的十六进制从 IEEE 浮点数格式的二进制数转换得到，如 <code>+1.0</code> 的 IEEE 浮点数格式为 <code>0011 1111 1000 0000 0000 0000 0000 0000</code>，编码实数表示为 <code>3F800000r</code></p><p>字符和字符串常量以 <code>''</code>/<code>""</code> 包围，按照 ASCII 码存储。</p><h3 id="7-3-保留字"><a class="header-anchor" href="#7-3-保留字"></a>7.3 保留字</h3><p>保留字主要有以下类型：</p><ul><li>指令助记符，如 <code>mov</code>、<code>add</code>、<code>mul</code> 等</li><li>寄存器名称</li><li>汇编器指令</li><li>类型属性，如 <code>byte</code> 和 <code>word</code></li><li>运算符</li><li>预定义的符号</li></ul><p>保留字<strong>大小写不敏感</strong>，如 <code>MOV</code> 和 <code>mov</code> 是一样的，但预定义符号除外。</p><h3 id="7-4-标识符"><a class="header-anchor" href="#7-4-标识符"></a>7.4 标识符</h3><p>标识符用于标识变量、常量、函数、标签，有以下规则：</p><ul><li>长度在 1 ~ 247 之间</li><li>大小写<strong>不敏感</strong>（通过汇编器的 <code>-Cp</code> 选项可使之大小写敏感）</li><li>首字符必须是字母、下划线、<code>@</code>、<code>?</code> 或 <code>$</code>，后续的字符才可以取数字。<br>作为建议，请尽量不要以下划线或者 <code>@</code> 开头，减少违反下一条规则的概率。</li><li>不能和保留字撞名</li></ul><h3 id="7-5-指令"><a class="header-anchor" href="#7-5-指令"></a>7.5 指令</h3><p>指令在汇编时转换成运行时可执行的语句（机器语言字节）。一条指令包含四个部分：<code>[标签:] [助记符] [操作数] [;注释]</code></p><ul><li><p>标签<br>标签用于标识数据 / 代码的位置。</p></li><li><p>助记符<br>助记符标识指令功能。</p></li><li><p>操作数<br>操作数用于指令数据的输入输出。操作数可以是寄存器 (reg)、内存地址 (mem) 或者整数表达式 (imm)。一条指令可以有 0 到 3 个操作数。<br>对于有两个操作数的指令，第一个操作数作为目标操作数 (dest)，第二个操作数作为源操作数 (src)。指令一般修改的是目标操作数。<br>对于有三个操作数的指令，后两个操作数作为源操作数执行指令，结果存储到目标操作数。<br>常见助记符及其操作数：</p><table><thead><tr><th style="text-align:center">助记符</th><th style="text-align:center">操作数</th><th style="text-align:center">说明</th></tr></thead><tbody><tr><td style="text-align:center"><code>MOV</code></td><td style="text-align:center"><code>dest, src</code></td><td style="text-align:center"><code>src</code> 的值赋值到 <code>dest</code></td></tr><tr><td style="text-align:center"><code>ADD</code></td><td style="text-align:center"><code>dest, src</code></td><td style="text-align:center"><code>dest = dest + src</code></td></tr><tr><td style="text-align:center"><code>INC</code></td><td style="text-align:center"><code>op</code></td><td style="text-align:center"><code>op</code> 递增 1</td></tr><tr><td style="text-align:center"><code>DEC</code></td><td style="text-align:center"><code>op</code></td><td style="text-align:center"><code>op</code> 递减 1</td></tr><tr><td style="text-align:center"><code>SUB</code></td><td style="text-align:center"><code>dest, src</code></td><td style="text-align:center"><code>dest = dest - src</code></td></tr><tr><td style="text-align:center"><code>MUL</code></td><td style="text-align:center"><code>op</code></td><td style="text-align:center">无符号乘法，结果储存在主寄存器中，即 <code>EAX = EAX * op</code></td></tr><tr><td style="text-align:center"><code>IMUL</code></td><td style="text-align:center"><code>dest, src1, src2</code></td><td style="text-align:center">有符号乘法，<code>dest = src1 * src2</code></td></tr><tr><td style="text-align:center"><code>JMP</code></td><td style="text-align:center"><code>label</code></td><td style="text-align:center">无条件跳转至标签位置</td></tr><tr><td style="text-align:center"><code>CALL</code></td><td style="text-align:center"><code>func</code></td><td style="text-align:center">调用函数</td></tr><tr><td style="text-align:center"><code>NOP</code></td><td style="text-align:center">无</td><td style="text-align:center">无操作指令，占用 1 字节，常被汇编器用于字节对齐</td></tr></tbody></table><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>无论何时，我们都建议优先以寄存器作为操作数，然后是常量值，最后才是内存地址标识，因为它们的读取效率是依次递减的。</p></div></div></li><li><p>注释<br>单行注释以 <code>;</code> 开头<br>多行注释使用 <code>COMMENT</code> 指令，语法为 <code>COMMENT 结束符</code>。从 <code>COMMENT</code> 到第一个结束符之间的代码块将被忽略。</p></li></ul><h3 id="7-6-段式存储"><a class="header-anchor" href="#7-6-段式存储"></a>7.6 段式存储</h3><p>正如 4.2 所述，x86 处理器底层依然属于段式存储模型。在大部分操作系统上，采用的模型和各位在 C/C++ 学的内存布局是一样的。</p><p>现在这个阶段，需要我们设置的内存段只有 <code>.data</code>（数据段）和 <code>.code</code>（代码段）。</p><h3 id="7-7-示例-1"><a class="header-anchor" href="#7-7-示例-1"></a>7.7 示例 1</h3><p>下面是一个进行加减运算的 MASM 汇编程序，操作数是写死在程序中的。</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">INCLUDE Irvine32<span class="number">.</span><span class="keyword">inc</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">.code</span></span><br><span class="line">main PROC</span><br><span class="line"><span class="symbol"></span></span><br><span class="line"><span class="symbol">a:</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">eax</span>,<span class="number">30000h</span><span class="comment">; EAX = 10000h</span></span><br><span class="line"><span class="keyword">add</span> <span class="built_in">eax</span>,<span class="number">80000h</span><span class="comment">; EAX = 50000h</span></span><br><span class="line"><span class="keyword">sub</span> <span class="built_in">eax</span>,<span class="number">20000h</span><span class="comment">; EAX = 30000h</span></span><br><span class="line"><span class="comment">; jmp a           ; jump to label 'a'</span></span><br><span class="line"><span class="keyword">call</span> DumpRegs</span><br><span class="line"></span><br><span class="line">exit</span><br><span class="line">main ENDP</span><br><span class="line">END main</span><br></pre></td></tr></tbody></table></figure><p>我们详细分析一下这个程序。第一部分是汇编器指令：</p><ul><li><code>INCLUDE Irvine32.inc</code> 调用了教学用库 <code>Irvine32.inc</code></li></ul><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p>我们要求：在本课程中，<strong>必须</strong> <code>INCLUDE Irvine32.inc</code>，因为它预设置了有用的函数和汇编器指令。</p></div></div><p>接下来是代码区，我们在这里写函数代码：</p><ul><li><code>.code</code> 表示下面的所有代码均属于代码段的内容</li><li><code>main PROC</code> 定义 <code>main</code> 过程（<strong>Proc</strong>edure，即函数）</li><li><code>a:</code> 定义了一个标签 <code>a</code>，指向 <code>mov eax, 30000h</code></li><li><code>mov eax, 30000h</code> 将十六进制值 <code>30000h</code> 赋值给 <code>eax</code></li><li><code>add eax, 80000h</code> 将 <code>80000h</code> 和 <code>eax</code> 的值相加，结果保存到 <code>eax</code>。</li><li><code>call DumpRegs</code> 调用 <code>Irvine32.inc</code> 的 <code>DumpRegs</code> 函数，作用是打印当前的寄存器数值</li><li><code>jmp a</code> 表示无条件跳转到 <code>a</code> 指向的代码。由于有个 bug 故注释，注意到了么？</li><li><code>exit</code> 是系统调用 (system call)，表示程序的退出。注意不要对主函数使用 <code>ret</code>，因为 <code>ret</code> 需要显式调用方</li><li><code>main ENDP</code> 表示结束此过程的定义</li><li><code>END main</code> 表示整个源文件结束，并且指定了入口点函数 <code>main</code>。</li></ul><h3 id="7-8-数据类型与数据操作"><a class="header-anchor" href="#7-8-数据类型与数据操作"></a>7.8 数据类型与数据操作</h3><p>MASM 内建以下数据类型：<code>BYTE</code>, <code>SBYTE</code>（有符号字节）, <code>WORD</code>, <code>SWORD</code>, <code>DWORD</code>, <code>SDWORD</code>, <code>FWORD</code>（六字节）, <code>QWORD</code>, <code>TBYTE</code>（十字节）。主要使用 <code>BYTE</code>, <code>WORD</code>, <code>DWORD</code>, <code>QWORD</code> 类型，可分别简写为 <code>db</code>, <code>dw</code>, <code>dd</code>, <code>dq</code>。</p><p>使用 <code>TYPEDEF</code> 可以定义新的类型，包括指针，语法为 <code>类型名 TYPEDEF [PTR] 已注册的类型</code>。已注册的类型包括内建类型和已使用 <code>TYPEDEF</code> 注册过的类型，例如：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">CHAR    TYPEDEF <span class="built_in">BYTE</span></span><br><span class="line">PCHAR   TYPEDEF <span class="built_in">PTR</span> CHAR</span><br></pre></td></tr></tbody></table></figure><p>使用数据类型在 <code>.data</code> 段定义数据的语法为 <code>[标识符] 类型 [初始化值, ...]</code></p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">count <span class="built_in">dword</span> <span class="number">114514</span></span><br><span class="line">homo  <span class="built_in">word</span>  ?</span><br></pre></td></tr></tbody></table></figure><p>数据定义时必须有至少一个初始化值，如果不想自己设定，可以使用 <code>?</code> 表示随机赋值。所有的初始化值，无论其格式，都会被汇编器转换为二进制数据。如果初始化值是有规律重复的，可以使用 <code>DUP</code> (Duplicate) 命令：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">BYTE</span> <span class="number">20</span> DUP(<span class="number">0</span>) <span class="comment">; 20 字节，均初始化为 0</span></span><br><span class="line"><span class="built_in">BYTE</span> <span class="number">20</span> DUP(?) <span class="comment">; 20 字节，均随机初始化</span></span><br><span class="line"><span class="built_in">BYTE</span> <span class="number">4</span> DUP(<span class="string">"STACK"</span>) <span class="comment">; 20 字节，一个字符串："STACKSTACKSTACKSTACK"</span></span><br></pre></td></tr></tbody></table></figure><p>可以有多个初始化值，这实际上就声明了一个数组：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">list  <span class="built_in">byte</span>  <span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span></span><br><span class="line">      <span class="built_in">byte</span>  <span class="number">50</span>,<span class="number">60</span>,<span class="number">70</span>,<span class="number">80</span></span><br></pre></td></tr></tbody></table></figure><p>数据 <code>10</code> 位于 <code>list</code> 的偏移 0 位置，以此类推。</p><p>字符串也是一种数组，但作为例外，每个字节间不都需要逗号分隔。正如各位在 C 中所学的那样，所有的字符串都需要加一个 <code>\0</code> 终止符（当然，是手动的，没有编译器兜底了）。对于多行字符串，只需要一整块字符串的末尾终止即可，如果需要换行，需要使用 <code>0dh, 0ah</code> (CR/LF)：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">greeting1 <span class="built_in">BYTE</span> <span class="string">"Welcome to the Encryption Demo program "</span></span><br><span class="line">          <span class="built_in">BYTE</span> <span class="string">"created by Kip Irvine."</span>,<span class="number">0dh</span>,<span class="number">0ah</span></span><br><span class="line">          <span class="built_in">BYTE</span> <span class="string">"If you wish to modify this program, please "</span></span><br><span class="line">          <span class="built_in">BYTE</span> <span class="string">"send me a copy."</span>,<span class="number">0dh</span>,<span class="number">0ah</span>,<span class="number">0</span></span><br></pre></td></tr></tbody></table></figure><p>计算数组长度可以使用 <code>$ - Array</code>，例如：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">list <span class="built_in">BYTE</span> <span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span></span><br><span class="line">ListSize = ($ - list) <span class="comment">; ListSize = 4</span></span><br></pre></td></tr></tbody></table></figure><p>如果是字符串长度，需要减去使用的转义字符的长度：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">hello <span class="built_in">BYTE</span> <span class="string">"Hello"</span>,<span class="number">0</span></span><br><span class="line">StringSize = ($ - hello) - <span class="number">1</span> <span class="comment">; StringSize = 5</span></span><br></pre></td></tr></tbody></table></figure><p>注意采用这种方式计算的，表达式必须紧跟在数组之后，因为 <code>($ - list)</code> 的语义是当前地址 ($) 减去 <code>list</code> 的地址。数据在段内是连续的，因此可以用偏移值计算元素个数。如果中间再插入了其他数据，偏移值就计算错误了。</p><p><code>BYTE</code> 只占 1 字节，因此偏移值 = 元素数。如果是 <code>WORD</code> 等更大的数据类型，就需要除以它的单位长度，例如：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">data <span class="built_in">WORD</span> <span class="number">1</span>,<span class="number">1</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">1</span>,<span class="number">4</span></span><br><span class="line">dataSize = ($ - data) / <span class="number">2</span> <span class="comment">; $ - data = 12, dataSize = 6</span></span><br></pre></td></tr></tbody></table></figure><p>可以在代码段中间夹杂数据段。数据的作用域从声明位置开始：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">.code</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">eax</span>,<span class="built_in">ebx</span></span><br><span class="line"><span class="meta">.data</span></span><br><span class="line">temp <span class="built_in">DWORD</span> ?</span><br><span class="line"><span class="meta">.code</span></span><br><span class="line"><span class="keyword">mov</span> temp,<span class="built_in">eax</span></span><br></pre></td></tr></tbody></table></figure><p>在进行数据的转移时，数据的宽度<strong>必须匹配目标寄存器的宽度</strong>。由于寄存器的宽度可以 “分割”，会出现数值覆盖 (Overlapping Values) 的情况：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">.data</span></span><br><span class="line">oneByte <span class="built_in">BYTE</span> <span class="number">78h</span></span><br><span class="line">oneWord <span class="built_in">WORD</span> <span class="number">1234h</span></span><br><span class="line">oneDword <span class="built_in">DWORD</span> <span class="number">12345678h</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">.code</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">eax</span>,<span class="number">0</span> <span class="comment">; EAX = 00000000h</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">al</span>,oneByte <span class="comment">; EAX = 00000078h</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">ax</span>,oneWord <span class="comment">; EAX = 00001234h</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">eax</span>,oneDword <span class="comment">; EAX = 12345678h</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">ax</span>,<span class="number">0</span> <span class="comment">; EAX = 12340000h</span></span><br></pre></td></tr></tbody></table></figure><p>数值仅覆盖对应位数，而其他位不变。对于有符号数，这种情况更加复杂：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">.data</span></span><br><span class="line">signedVal SWORD -<span class="number">16</span> <span class="comment">; FFF0h (-16)</span></span><br><span class="line"><span class="meta">.code</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">ecx</span>,<span class="number">0</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">cx</span>,signedVal <span class="comment">; ECX = 0000FFF0h (+65,520)</span></span><br></pre></td></tr></tbody></table></figure><p>明明存储的是负数，结果读 <code>ECX</code> 的时候却读出了正数！除了尽量保证使用 <code>CX</code>，我们也可以先将 <code>ECX</code> 赋值为 <code>FFFFFFFFh</code>，这样数值就是正确的 <code>FFFFFFF0h</code> 了，这被称为符号位扩展 (Sign Extension)。为了简便较小宽度的数据向较大宽度的寄存器的转移， x86 设计了两个指令：</p><ul><li><code>MOVZX</code> (Move with Zero eXtension)</li></ul><p>适用于无符号数，将扩展的位数设置为 0。</p><ul><li><code>MOVSX</code> (Move with Sign eXtension)</li></ul><p>适用于有符号数，将扩展的位数设置为 1。</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">.data</span></span><br><span class="line">byteVal <span class="built_in">BYTE</span> <span class="number">10001111b</span></span><br><span class="line"><span class="meta">.code</span></span><br><span class="line"><span class="keyword">movzx</span> <span class="built_in">ax</span>,byteVal <span class="comment">; AX = 0000000010001111b</span></span><br><span class="line"><span class="keyword">movsx</span> <span class="built_in">bx</span>,byteVal <span class="comment">; BX = 1111111110001111b</span></span><br></pre></td></tr></tbody></table></figure><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p>以上两个指令不得使用常量作为操作数。它们仅接受以下操作数组合：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">reg32, reg/mem8</span><br><span class="line">reg32, reg/mem16</span><br><span class="line">reg16, reg/mem8</span><br></pre></td></tr></tbody></table></figure><p>不要滥用符号位扩展，请优先确认操作数的宽度。例如：三个数据 <code>10h</code>、<code>20h</code> 和 <code>30h</code> 定义为 <code>BYTE</code> 类型，其中 <code>30h</code> 和前两个的用途不同。</p><p>这是中间一个步骤的内存视图：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">10 00 00 00 30 00</span><br></pre></td></tr></tbody></table></figure><p>如果将 <code>20h</code> 位扩展到 32 位（和 <code>EAX</code> 对齐）存进内存，那么：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">10 20 00 00 00 00</span><br></pre></td></tr></tbody></table></figure><p>之前存的 <code>30h</code> 被扩展的 <code>0</code> 覆盖了！</p></div></div><p>你如果还记得 C 语言的话，估计会把交换数据写成三个存储位置的中转交换，但 x86 提供了 <code>XCHG</code> (eXchange data)，可以直接交换数据：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">XCHG</span> reg,reg</span><br><span class="line"><span class="keyword">XCHG</span> reg,mem</span><br><span class="line"><span class="keyword">XCHG</span> mem,reg</span><br></pre></td></tr></tbody></table></figure><p>对于两个内存数据的交换，需要使用寄存器中转：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">mov</span> <span class="built_in">ax</span>,val1</span><br><span class="line"><span class="keyword">xchg</span> <span class="built_in">ax</span>,val2</span><br><span class="line"><span class="keyword">mov</span> val1,<span class="built_in">ax</span></span><br></pre></td></tr></tbody></table></figure><h3 id="7-9-操作数和寻址方式"><a class="header-anchor" href="#7-9-操作数和寻址方式"></a>7.9 操作数和寻址方式</h3><p>正如我们在 7.5 所述，操作数可以是寄存器、内存地址或者整数表达式。我们将这些操作数分类为：立即数、寄存器和内存，由此得到几种寻址模式：</p><table><thead><tr><th style="text-align:center">寻址方式</th><th style="text-align:center">典型语句</th><th style="text-align:center">关键含义</th><th style="text-align:center">C 场景</th><th style="text-align:center">记忆点</th></tr></thead><tbody><tr><td style="text-align:center">寄存器寻址</td><td style="text-align:center"><code>mov ecx, eax</code></td><td style="text-align:center">寄存器中的数据传送</td><td style="text-align:center">中间结果</td><td style="text-align:center">无 <code>[]</code></td></tr><tr><td style="text-align:center">立即数寻址</td><td style="text-align:center"><code>add eax, 5</code></td><td style="text-align:center">常量写在指令中</td><td style="text-align:center">常量赋值</td><td style="text-align:center">数直接给出</td></tr><tr><td style="text-align:center">直接寻址</td><td style="text-align:center"><code>mov ecx, count</code></td><td style="text-align:center">变量名给出地址</td><td style="text-align:center">普通变量</td><td style="text-align:center">名字就能定位</td></tr><tr><td style="text-align:center">间接寻址</td><td style="text-align:center"><code>mov edx, [ebx]</code></td><td style="text-align:center">按寄存器地址取值</td><td style="text-align:center">指针 <code>*p</code></td><td style="text-align:center">寄存器里装地址</td></tr><tr><td style="text-align:center">相对寻址</td><td style="text-align:center"><code>mov esi, [ebx+4]</code></td><td style="text-align:center">基址 + 常量偏移</td><td style="text-align:center"><code>arr[1]</code></td><td style="text-align:center">偏移按字节</td></tr><tr><td style="text-align:center">相对寻址</td><td style="text-align:center"><code>mov eax, count[esi]</code></td><td style="text-align:center">符号地址 + 寄存器偏移</td><td style="text-align:center"><code>count[i]</code></td><td style="text-align:center">基址 + 位移</td></tr><tr><td style="text-align:center">变址寻址</td><td style="text-align:center"><code>mov eax, [ebx+edx+80h]</code></td><td style="text-align:center">基址 + 变址 + 位移</td><td style="text-align:center"><code>buf[32+i]</code></td><td style="text-align:center">多一个动态偏移</td></tr><tr><td style="text-align:center">比例变址</td><td style="text-align:center"><code>mov eax, [ebx+esi*4-80h]</code></td><td style="text-align:center">基址 + 下标 × 大小 + 位移</td><td style="text-align:center"><code>arr[i-32]</code></td><td style="text-align:center">自动乘元素大小</td></tr></tbody></table><ul><li>立即数寻址</li></ul><p>立即数就是内存中的字面量，因此立即数可以直接写在指令中：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">mov</span> <span class="built_in">eax</span>, <span class="number">10h</span></span><br><span class="line"></span><br><span class="line"><span class="comment">; View in Hex:</span></span><br><span class="line"><span class="comment">; B8 10000000</span></span><br></pre></td></tr></tbody></table></figure><ul><li>直接内存寻址</li></ul><p>地址需要解引用以访问对应数据。不过相比直接写地址值，我们一般都使用变量名，因为变量名携带了相对与段基地址的偏移信息。</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">mov</span> <span class="built_in">eax</span>, var1</span><br><span class="line"></span><br><span class="line"><span class="comment">; Suppose var1 were located at offset 10400h</span></span><br><span class="line"><span class="comment">; View in Hex:</span></span><br><span class="line"><span class="comment">; A1 00040100</span></span><br></pre></td></tr></tbody></table></figure><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">操作码</div></div><div class="callout-content"><p>发现了吗？同样是 <code>mov</code>，两者在 Hex dump 中的表示却不一样！我们将 <code>B8</code>、<code>A1</code> 称为操作码 (Opcode)，可以参见 <a href="https://pdos.csail.mit.edu/6.828/2010/readings/i386/MOV.htm">MOV -- Move Data</a>。<br>不同的 Opcode 对应不同的操作数类型，但在汇编中我们统一写成 <code>mov</code>。这就是上层虚拟机对底层虚拟机功能的封装。</p><p><code>B8</code> 表示将 <code>imm</code> 复制到 <code>reg</code>，而 <code>A1</code> 表示将位于 <code>seg:offset</code> 的值复制到 <code>EAX</code>。这样你就明白为什么 <code>mov eax, var1</code> 是将 <code>var1</code> 指向的值复制到 <code>eax</code>，而不是将 <code>var1</code> 的地址赋值给 <code>eax</code> 了吧，因为此时操作码 <code>A1</code> 表示对随后的地址值解引用。</p></div></div><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p>正如在 4.2 中所说的，x86 的大多数指令不支持两个内存操作数。每条 <code>mov</code> 指令的操作码中，用于指定操作数的位域有限，无法同时编码两个完整的内存地址；并且早期 CPU 的寄存器才是真正进行移动操作的场所，内存只是数据的 “仓库”，需要使用寄存器作为中转：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">mov</span> <span class="built_in">eax</span>, var1</span><br><span class="line"><span class="keyword">mov</span> var2, <span class="built_in">eax</span></span><br></pre></td></tr></tbody></table></figure><p>现代 CPU 的存储转发机制可能会直接将 <code>var1</code> 的数据从 L1 数据缓存转发到 <code>var2</code> 的存储操作中，甚至不需要寄存器物理上 “持有” 数据。但指令集层面仍然要求程序员（或编译器）显式写出这个寄存器。</p></div></div><ul><li>直接寄存器寻址</li></ul><h3 id="7-10-示例-2"><a class="header-anchor" href="#7-10-示例-2"></a>7.10 示例 2</h3><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">INCLUDE Irvine32<span class="number">.</span><span class="keyword">inc</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">.data</span></span><br><span class="line">greeting <span class="built_in">byte</span> <span class="string">"Hello, World!"</span>, <span class="number">0</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">.code</span></span><br><span class="line">main PROC</span><br><span class="line"><span class="keyword">mov</span>  <span class="built_in">edx</span>, OFFSET greeting</span><br><span class="line"><span class="keyword">call</span> WriteString</span><br><span class="line"></span><br><span class="line">exit</span><br><span class="line">main ENDP</span><br><span class="line">END  main</span><br></pre></td></tr></tbody></table></figure><p>此处我调用了 <code>Irvine32.inc</code> 的 <code>WriteString</code> 函数。它以 <code>edx</code> 作为参数，接受字符串地址，将含终止符的字符串打印到标准输出。</p><h3 id="7-11-基本运算"><a class="header-anchor" href="#7-11-基本运算"></a>7.11 基本运算</h3><p>基本运算指令分为算术运算和逻辑运算。所有运算都会同步修改标志寄存器。</p><h4 id="7-11-1-加减运算"><a class="header-anchor" href="#7-11-1-加减运算"></a>7.11.1 加减运算</h4><p><code>INC</code> 和 <code>DEC</code> 指令的作用是对寄存器 / 内存的值递增 (Increase) 和递减 (Decrease) 1，操作数就一个，运算结果保存到操作数上。</p><p><code>ADD</code> 和 <code>SUB</code> 指令分别为加法 (Add) 和减法 (Substraction)，操作数是 <code>dest,src</code>，运算结果保存到 <code>dest</code>，不修改 <code>src</code></p><p><code>NEG</code> 是取反 (Negate) 指令，就是将寄存器 / 内存的值的符号位取反。</p><h4 id="7-11-2-乘除运算"><a class="header-anchor" href="#7-11-2-乘除运算"></a>7.11.2 乘除运算</h4><p><code>MUL</code> 是无符号数乘法 (unsigned Multiply)，只有一个操作数。<code>AX</code> 寄存器作为被乘数，操作数作为乘数。结果写回低位寄存器，若位数不足则溢出至高位寄存器 (<code>AH</code> / <code>DX</code>)。两个操作数的位数和是结果的位数。</p><p><code>CF</code> 标志用于检查高位进位。</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">mov</span> <span class="built_in">al</span>,<span class="number">5h</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">bl</span>,<span class="number">10h</span></span><br><span class="line"><span class="keyword">mul</span> <span class="built_in">bl</span> <span class="comment">; AX = 0050h, CF = 0</span></span><br></pre></td></tr></tbody></table></figure><p><code>IMUL</code> 是有符号乘法 (signed multiply)，可选 1、2、3 个操作数。</p><p>一个操作数时，行为类似 <code>MUL</code>；两个操作数时，第一个操作数作为被乘数和目标，第二个操作数作为乘数；三个操作数时，第一个操作数作为目标，第二个操作数作为被乘数，第三个操作数作为乘数。</p><p><code>IMUL</code> 需要注意 <code>CF</code> 和 <code>OF</code> 标志。如果结果的高位不能解释为低位的符号扩展，那么 <code>OF = 1</code></p><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p><code>OF</code> 标志主要看乘法结果是否在低位的有符号数表示范围内。</p></div></div><p><code>DIV</code> 是无符号数除法 (unsigned Divide)。除法比较特殊——带余数的整除法。</p><p><code>DIV</code> 只有一个操作数。<code>DX</code> 和 <code>AX</code> 作为被除数，操作数为除数。结果中，商写回低位寄存器，余数写回高位寄存器 (<code>AH</code> / <code>DX</code>)。两个操作数的位数差是结果的位数。</p><h4 id="7-11-3-位运算"><a class="header-anchor" href="#7-11-3-位运算"></a>7.11.3 位运算</h4><h2 id="8-分支与循环程序设计"><a class="header-anchor" href="#8-分支与循环程序设计"></a>8. 分支与循环程序设计</h2><p>默认情况下，CPU 按顺序加载和执行程序。但条件指令会根据 CPU 状态标志的值（<code>Zero</code>、<code>Sign</code>、<code>Carry</code> 等）将控制权转移到程序中的新位置。控制转移分为两种：无条件转移和条件转移。</p><p>循环在这里视为分支，因为它也可以使用条件转移指令实现。</p><h3 id="8-1-无条件转移"><a class="header-anchor" href="#8-1-无条件转移"></a>8.1 无条件转移</h3><p>使用 <code>JMP</code> 指令：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">JMP label</span></span><br></pre></td></tr></tbody></table></figure><p>CPU 将自动将 <code>label</code> 转换成偏移值，赋值给 <code>IP</code> 以在新位置执行代码。</p><p><code>JMP</code> 是创建循环的最简单方法，结合标签可以形成一个无限循环：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">top:</span></span><br><span class="line">  <span class="comment">; ...</span></span><br><span class="line">  <span class="keyword">jmp</span> top</span><br></pre></td></tr></tbody></table></figure><h3 id="8-2-条件转移"><a class="header-anchor" href="#8-2-条件转移"></a>8.2 条件转移</h3><p>只有判断标志寄存器的值满足条件时，条件指令才跳转。由于标志寄存器不能直接设定，因此需要搭配 <code>cmp</code> (compare) 或 <code>test</code> 指令使用。</p><p><code>cmp</code> 的底层逻辑是 <code>A - B</code>，用于判断两个数的大小。<code>test</code> 的底层逻辑是 <code>A &amp; B</code>，用于检查特定位数的状态（<code>test A,A</code> 可以判断 <code>A</code> 是否为 0）。两个指令均只修改 FLAGS 寄存器而不破坏元数据。</p><p>常见条件转移指令：</p><table><thead><tr><th>指令</th><th>英文全称</th><th>含义</th><th>判断标志位</th></tr></thead><tbody><tr><td><code>JE</code>, <code>JZ</code></td><td>jump equal，jump zero</td><td>结果为零则跳转 (相等时跳转)</td><td>ZF=1</td></tr><tr><td><code>JNE</code>, <code>JNZ</code></td><td>jump not equal，jump not zero</td><td>结果不为零则跳转 (不相等时跳转)</td><td>ZF=0</td></tr><tr><td><code>JS</code></td><td>jump sign</td><td>结果为负则跳转</td><td>SF=1</td></tr><tr><td><code>JNS</code></td><td>jump not sign</td><td>结果为非负则跳转</td><td>SF=0</td></tr><tr><td><code>JP</code>, <code>JPE</code></td><td>jump parity，jump parity even</td><td>结果中 1 的个数为偶数则跳转</td><td>PF=1</td></tr><tr><td><code>JNP</code>, <code>JPO</code></td><td>jump not parity，jump parity odd</td><td>结果中 1 的个数为偶数则跳转</td><td>PF=0</td></tr><tr><td><code>JO</code></td><td>jump overflow</td><td>结果溢出了则跳转</td><td>OF=1</td></tr><tr><td><code>JNO</code></td><td>jump not overflow</td><td>结果没有溢出则跳转</td><td>OF=0</td></tr><tr><td><code>JB</code>, <code>JNAE</code></td><td>jump below，jump not above equal</td><td>小于则跳转 (无符号数)</td><td>CF=1</td></tr><tr><td><code>JNB</code>, <code>JAE</code></td><td>jump not below，jump above equal</td><td>大于等于则跳转 (无符号数)</td><td>CF=0</td></tr><tr><td><code>JBE</code>, <code>JNA</code></td><td>jump below equal，jump not above</td><td>小于等于则跳转 (无符号数)</td><td>CF=1 or ZF=1</td></tr><tr><td><code>JNBE</code>, <code>JA</code></td><td>jump not below equal，jump above</td><td>大于则跳转 (无符号数)</td><td>CF=0 and ZF=0</td></tr><tr><td><code>JL</code>, <code>JNGE</code></td><td>jump less，jump not greater equal</td><td>小于则跳转 (有符号数)</td><td>SF≠ OF</td></tr><tr><td><code>JNL</code>, <code>JGE</code></td><td>jump not less，jump greater equal</td><td>大于等于则跳转 (有符号数)</td><td>SF=OF</td></tr><tr><td><code>JLE</code>, <code>JNG</code></td><td>jump less equal，jump not greater</td><td>小于等于则跳转 (有符号数)</td><td>ZF=1 or SF≠ OF</td></tr><tr><td><code>JNLE</code>, <code>JG</code></td><td>jump not less equal，jump greater</td><td>大于则跳转 (有符号数)</td><td>ZF=0 and SF=OF</td></tr></tbody></table><p>其实记忆这些指令并不难，因为它们都是 <code>JMP</code> + 条件缩写的形式。</p><p>条件转移可以形成一个有限循环：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">; ...</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">ecx</span>, a_len</span><br><span class="line"><span class="symbol">copy:</span></span><br><span class="line">    <span class="keyword">mov</span> <span class="built_in">eax</span>, a[<span class="built_in">esi</span>]</span><br><span class="line">    <span class="keyword">mov</span> b[<span class="built_in">esi</span>], <span class="built_in">eax</span></span><br><span class="line">    <span class="keyword">add</span> <span class="built_in">esi</span>, <span class="number">4</span></span><br><span class="line">    <span class="keyword">dec</span> <span class="built_in">ecx</span></span><br><span class="line">    <span class="keyword">cmp</span> <span class="built_in">ecx</span>, <span class="number">0</span></span><br><span class="line">    <span class="keyword">jne</span> copy</span><br><span class="line"><span class="comment">; ...</span></span><br></pre></td></tr></tbody></table></figure><p>有一个专门的指令 <code>LOOP</code> 同样实现了有限循环，以 <code>ECX</code> 作为循环次数，当其数值减少到 0 时，<code>LOOP</code> 指令就会停止，继续执行下面的指令。</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">; ...</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">ecx</span>, a_len</span><br><span class="line"><span class="symbol">copy:</span></span><br><span class="line">    <span class="keyword">mov</span> <span class="built_in">eax</span>, a[<span class="built_in">esi</span>]</span><br><span class="line">    mox b[<span class="built_in">esi</span>], <span class="built_in">eax</span></span><br><span class="line">    <span class="keyword">add</span> <span class="built_in">esi</span>, <span class="number">4</span></span><br><span class="line">    <span class="keyword">loop</span> copy</span><br><span class="line"><span class="comment">; ...</span></span><br></pre></td></tr></tbody></table></figure><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p>在进入 <code>LOOP</code> 循环体前，<strong>务必显式</strong>初始化 <code>ECX</code>！在循环体内，我们也不建议再修改 <code>ECX</code>。如果要修改，请先将 <code>ECX</code> 代表的循环次数保存，然后在退出一次循环前将次数恢复到 <code>ECX</code>。<br>对于嵌套循环，你同样需要先保存外层循环次数，再设置内层循环次数；内层循环结束后，及时将外层循环次数恢复到 <code>ECX</code>：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">.data</span></span><br><span class="line">count <span class="built_in">dword</span> ?</span><br><span class="line"><span class="meta">.code</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">ecx</span>,<span class="number">100</span> <span class="comment">; set outer loop count</span></span><br><span class="line"><span class="symbol">L1:</span></span><br><span class="line"><span class="keyword">mov</span> count,<span class="built_in">ecx</span> <span class="comment">; save outer loop count</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">ecx</span>,<span class="number">20</span> <span class="comment">; set inner loop count</span></span><br><span class="line"><span class="symbol">L2:</span></span><br><span class="line"><span class="comment">; ...</span></span><br><span class="line"><span class="keyword">loop</span> L2</span><br><span class="line"></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">ecx</span>,count <span class="comment">; restore outer loop count</span></span><br><span class="line"><span class="keyword">loop</span> L1</span><br></pre></td></tr></tbody></table></figure></div></div><h2 id="9-函数"><a class="header-anchor" href="#9-函数"></a>9. 函数</h2><p>通俗地说，我们可以将函数（<strong>Proc</strong>edure，本义为过程，有人也称为子程序）定义为一个返回语句结束的语句块。函数是使用 <code>PROC</code> 与 <code>ENDP</code> 指令声明的。它必须被赋予一个合法的标识符。</p><p>对于非入口点函数（即 <code>main</code>），使用 <code>RET</code> 作为返回语句：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">sample PROC</span><br><span class="line"><span class="comment">; ...</span></span><br><span class="line"><span class="keyword">ret</span></span><br><span class="line">sample ENDP</span><br></pre></td></tr></tbody></table></figure><p>函数内标签的作用域仅限于此函数内，这主要影响跳转与循环指令。虽然可以通过标签名后标识 <code>::</code> 来声明一个全局标签，但这样做容易破坏程序的运行时栈 (Runtime Stack)。关于运行时栈我们会更详细地介绍。</p><p>这是一个简单的加法函数，约定参数和返回值都通过寄存器传递，比较简单：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">SumOf PROC</span><br><span class="line">    <span class="keyword">add</span> <span class="built_in">eax</span>,<span class="built_in">ebx</span></span><br><span class="line">    <span class="keyword">add</span> <span class="built_in">eax</span>,<span class="built_in">ecx</span></span><br><span class="line">    <span class="keyword">ret</span></span><br><span class="line">SumOf ENDP</span><br></pre></td></tr></tbody></table></figure><p>现在你可以使用 <code>CALL</code> 指令调用函数了！<code>Irvine32.inc</code> 实现了一些简单的输入输出函数。你可以直接打开此文件查看此库声明了哪些函数。</p><h3 id="9-1-运行时栈"><a class="header-anchor" href="#9-1-运行时栈"></a>9.1 运行时栈</h3><p>运行时栈用于存储函数执行期间的必要的<strong>临时信息</strong>。和数据结构中的 “栈” 一样，运行时栈同样遵循 LIFO 规则。运行时栈通过 <code>ESP</code> 寄存器管理地址。一般来讲，我们不会直接修改 <code>ESP</code>，而是通过 <code>CALL</code>、<code>RET</code>、<code>PUSH</code> 和 <code>POP</code> 指令间接修改。</p><p><code>ESP</code> <strong>永远</strong>指向最后一个压入栈的值，即栈顶。这里需要注意一下，在操作系统中，栈是 “向下生长” 的，即栈的地址是从高到低的。每当我们 <code>PUSH</code> 一个值进入栈，<code>ESP</code> 的值会递减，然后将操作数复制到栈里。一个 16 bits 操作数会使 <code>ESP</code> 递减 2，32 bits 则递减 4。<code>PUSH</code> 的操作数可以是寄存器、内存地址或立即数。</p><p><code>POP</code> 会将 <code>ESP</code> 指向的栈内容复制到操作数中，然后递增 <code>ESP</code>。<code>POP</code> 的操作数可以是寄存器或内存地址。</p><h3 id="9-2-函数调用"><a class="header-anchor" href="#9-2-函数调用"></a>9.2 函数调用</h3><p><code>CALL</code> 指令可以让 CPU 跳转到函数内存位置以执行指令。与之配套的是函数内的 <code>RET</code> 语句。</p><p>具体来讲，<code>CALL</code> 将返回地址压入栈中，然后将目标函数地址赋值给 <code>EIP</code>。返回地址指向 <code>CALL</code> 的下一条语句。当函数 <code>RET</code> 时，栈中存放的返回地址赋值给 <code>EIP</code>，之后弹出。</p><p>因此，对于一个正常的程序，其调用函数前后的堆栈是<strong>平衡</strong>的，即在 <code>RET</code> 时 <code>ESP</code> 的值应该和 <code>CALL</code> 时返回地址压入后的 <code>ESP</code> 值相等，这样 <code>RET</code> 才能将正确的返回地址写入 <code>EIP</code>。</p><p>对于函数的嵌套调用同样如此。每 <code>CALL</code> 一个子函数，对应的返回地址就会压入栈中；系统在同一时间内只会执行位于运行时栈栈顶的那个函数；然后 <code>RET</code> 时不断 “溯源”，直到返回主函数。</p><h3 id="9-3-保存和恢复寄存器"><a class="header-anchor" href="#9-3-保存和恢复寄存器"></a>9.3 保存和恢复寄存器</h3><p>现在我们准备写一个更复杂的函数：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">;----------------------------------------------------</span></span><br><span class="line"><span class="comment">; ArraySum </span></span><br><span class="line"><span class="comment">;  </span></span><br><span class="line"><span class="comment">; Calculates the sum of an array of 32-bit integers. </span></span><br><span class="line"><span class="comment">; Receives: ESI = the array offset </span></span><br><span class="line"><span class="comment">;           ECX = number of elements in the array </span></span><br><span class="line"><span class="comment">; Returns: EAX = sum of the array elements </span></span><br><span class="line"><span class="comment">;----------------------------------------------------</span></span><br><span class="line">ArraySum PROC</span><br><span class="line"><span class="keyword">push</span> <span class="built_in">esi</span> <span class="comment">; save ESI, ECX</span></span><br><span class="line"><span class="keyword">push</span> <span class="built_in">ecx</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">eax</span>,<span class="number">0</span> <span class="comment">; set the sum to zero</span></span><br><span class="line"><span class="symbol">L1:</span></span><br><span class="line">  <span class="keyword">add</span> <span class="built_in">eax</span>,[<span class="built_in">esi</span>] <span class="comment">; add each integer to sum</span></span><br><span class="line">  <span class="keyword">add</span> <span class="built_in">esi</span>,TYPE <span class="built_in">DWORD</span> <span class="comment">; point to next integer</span></span><br><span class="line"><span class="keyword">loop</span> L1</span><br><span class="line"></span><br><span class="line"><span class="keyword">pop</span> <span class="built_in">ecx</span> <span class="comment">; restore ECX, ESI</span></span><br><span class="line"><span class="keyword">pop</span> <span class="built_in">esi</span></span><br><span class="line"><span class="keyword">ret</span></span><br><span class="line"></span><br><span class="line">ArraySum ENDP</span><br></pre></td></tr></tbody></table></figure><p>此函数通过寄存器传递参数和返回值，不使用特定标识符以提高兼容性。</p><p>不过我们不是想聊这个。看这个程序的开头，它将 <code>ESI</code> 和 <code>ECX</code> 的值压入栈中，而返回前又将其 <code>POP</code> 出来。这是大多数修改寄存器的函数的典型做法：始终保存并恢复被函数修改的寄存器，以确保调用者自身的寄存器值不会被覆盖。该规则的一个例外是用作返回值的寄存器，一般是 <code>EAX</code>。</p><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p>注意遵循堆栈的 “后进先出” 原则！</p></div></div><p>你可以通过 <code>USES</code> 指令让汇编器自动生成这类代码：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">ArraySum PROC USES <span class="built_in">esi</span> <span class="built_in">ecx</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">eax</span>,<span class="number">0</span> <span class="comment">; set the sum to zero</span></span><br><span class="line"><span class="symbol">L1:</span></span><br><span class="line">  <span class="keyword">add</span> <span class="built_in">eax</span>,[<span class="built_in">esi</span>] <span class="comment">; add each integer to sum</span></span><br><span class="line">  <span class="keyword">add</span> <span class="built_in">esi</span>,TYPE <span class="built_in">DWORD</span> <span class="comment">; point to next integer</span></span><br><span class="line"><span class="keyword">loop</span> L1</span><br><span class="line"></span><br><span class="line"><span class="keyword">ret</span></span><br><span class="line"></span><br><span class="line">ArraySum ENDP</span><br></pre></td></tr></tbody></table></figure><p><code>USES</code> 紧跟在 <code>PROC</code> 之后，寄存器列表中间无逗号。</p><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p><code>USES</code> 生成的代码会先于用户代码执行。例如：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">ArraySum PROC USES <span class="built_in">esi</span> <span class="built_in">ecx</span></span><br><span class="line"><span class="keyword">push</span> <span class="built_in">ebp</span></span><br><span class="line"><span class="keyword">mov</span>  <span class="built_in">ebp</span>,<span class="built_in">esp</span></span><br><span class="line"><span class="comment">; ...</span></span><br></pre></td></tr></tbody></table></figure><p>生成的是：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">push</span> <span class="built_in">esi</span></span><br><span class="line"><span class="keyword">push</span> <span class="built_in">ecx</span></span><br><span class="line"><span class="keyword">push</span> <span class="built_in">ebp</span></span><br><span class="line"><span class="keyword">mov</span>  <span class="built_in">ebp</span>,<span class="built_in">esp</span></span><br><span class="line"><span class="comment">; ...</span></span><br></pre></td></tr></tbody></table></figure><p>在后面章节有需要使用 <code>ebp</code> 间接寻址堆栈内容的地方。有时只看到显式 <code>push</code> 的寄存器，结果把 <code>USES</code> 忘了，脑子里想的堆栈和实际堆栈不一样</p></div></div><p>或者使用 <code>pushad</code> 和 <code>popad</code> （ad 代表 All Double）将所有的<strong>通用寄存器</strong>都 push/pop。</p><h3 id="9-4-用栈传递参数"><a class="header-anchor" href="#9-4-用栈传递参数"></a>9.4 用栈传递参数</h3><p>本节开头我们展示了如何用寄存器传递参数。然而，大多数现代语言中函数参数是通过堆栈传递的：在 32 位下，Windows API 的参数也通过栈传递。因此，<strong>必须学会</strong>如何用栈传递参数。</p><details class="callout" data-callout="note" data-callout-fold="-"><summary class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">为什么不继续使用寄存器？</div><div class="callout-fold"></div></summary><div class="callout-content"><p>和通过栈传递参数相比，寄存器传参更快（对于较早期 CPU）。然而，一旦程序规模开始膨胀，寄存器传参出现 bug 的概率就越高；寄存器数量有限，多传几个参数就不够用了</p><p>实际上，正由于寄存器及其有限，<code>fastcall</code> 只允许前两个参数使用寄存器（<code>ecx</code> 和 <code>edx</code>），之后的参数使用栈传参。对于可变数量参数，全部的参数都使用栈传递。</p><p>因此，<strong>在 x86 下</strong>，我们非常建议各位使用栈传参。如果使用寄存器传参，最好确保参数个数不超过 2 个，否则管理寄存器资源会变成噩梦 😦</p></div></details><h4 id="9-4-1-栈帧"><a class="header-anchor" href="#9-4-1-栈帧"></a>9.4.1 栈帧</h4><p>当函数被调用时，运行时栈会预留一块区域，称为栈帧（Stack Frame，或活动记录 Activation Record）。栈帧存放着函数的实参、返回地址、局部变量和保存的寄存器。一个栈帧由以下步骤建立：</p><ol><li>传递的实参被压入堆栈。</li><li>调用函数，使函数返回地址被推送到栈上。</li><li>当函数开始执行时，<code>EBP</code> 会被推送到堆栈上。</li><li><code>EBP</code> 设置成和 <code>ESP</code> 相等。从此，<code>EBP</code> 作为函数形参的基址参考。</li><li>如果存在局部变量，需要递减 <code>ESP</code> 以预留堆栈上的变量空间。</li><li>需要保护的寄存器被推送到堆栈中。</li></ol><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p>即使使用 <code>PUSHAD</code>，我们依然建议在此之前先单独 push 和设置 <code>EBP</code>。</p><p>使用 <code>ESP</code> 实现栈上数据的存储和逻辑删除。<code>EBP</code> 在当前栈帧内位置固定，因此函数中对大部分数据的访问都基于 <code>EBP</code> 进行。</p></div></div><p>汇编的传参形式有两种：值传参和引用传参。</p><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">压栈顺序</div></div><div class="callout-content"><p>需要注意的是，两种传参的参数压栈顺序都是<strong>倒序</strong>的。参考等效 C 语言格式：<code>int some_func(int var1, int var2)</code>，则 <code>var2</code> 先压入，<code>var1</code> 后压入，从右往左。</p></div></div><p>数组必定使用引用传参，因为值传参代表它需要将每个元素都压入栈。使用 <code>OFFSET</code> 指令。</p><h4 id="9-4-2-栈参数的调用和清理"><a class="header-anchor" href="#9-4-2-栈参数的调用和清理"></a>9.4.2 栈参数的调用和清理</h4><p>现在我们来一个示例：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">AddTwo PROC</span><br><span class="line">  <span class="keyword">push</span> <span class="built_in">ebp</span></span><br><span class="line">  <span class="keyword">mov</span>  <span class="built_in">ebp</span>,<span class="built_in">esp</span></span><br><span class="line">  <span class="keyword">mov</span>  <span class="built_in">eax</span>,[<span class="built_in">ebp</span> + <span class="number">12</span>]</span><br><span class="line">  <span class="keyword">add</span>  eba,[<span class="built_in">ebp</span> + <span class="number">8</span>]</span><br><span class="line">  <span class="keyword">pop</span>  <span class="built_in">ebp</span></span><br><span class="line">  <span class="keyword">ret</span></span><br><span class="line">AddTwo ENDP</span><br></pre></td></tr></tbody></table></figure><p>使用栈传参时，需要将 <code>EBP</code> 压入栈，<code>ESP</code> 由系统自动管理，不需要我们操心。</p><p>如果我们调用了 <code>AddTwo(5,6)</code>，即：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">push</span> <span class="number">6</span></span><br><span class="line"><span class="keyword">push</span> <span class="number">5</span></span><br><span class="line"><span class="keyword">call</span> AddTwo</span><br></pre></td></tr></tbody></table></figure><p>那么它的栈结构大概长这样：</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20260411002051973.png" alt="AddTwo(5,6)的栈结构" loading="lazy"></p><p>如果我们想访问参数，那么用相对寻址。像 <code>[ebp + 12]</code> 这样用表达式引用实参的，我们称为显式栈参数 (Explicit Stack Parameter)。</p><p>有一个问题不知道你发现了没有：既然返回地址在实参下面，而当返回地址被弹出时，函数也退出了，那么剩下的实参怎么处理？</p><p>很遗憾，操作系统并不会在程序运行过程中自动回收它们。忽略它们？如果只用一层调用还好，但如果是嵌套调用呢？内层函数残留的栈实参在外层函数返回地址的下面，而 <code>ESP</code> 会读取<strong>实参</strong>作为地址！还记得我们在 C/C++ 所说的吗？标准结局就是内存访问冲突。</p><p>清理的理由有了，但怎么清理？<code>POP</code> 可不能把立即数 <code>POP</code> 出去啊。那么，既然栈实参不能物理移除，可不可以直接跳过它呢……</p><h4 id="9-4-3-调用约定"><a class="header-anchor" href="#9-4-3-调用约定"></a>9.4.3 调用约定</h4><p>调用约定 (Calling Convention) 确定了函数传参的传参形式、压栈顺序、返回值存储和清除栈方式。在 x86 Windows 下有两个主要的调用约定：C 调用约定 (<code>CDECL</code>) 和 <code>STDCALL</code> 调用约定。</p><p>C 调用约定和 <code>STDCALL</code> 的压栈顺序一致，即从右到左倒序压栈。而清除栈方式不一样：</p><ul><li>C 调用约定是调用者清除 (Caller Cleanup)，在调用函数 <code>CALL</code> 的下一行对 <code>ESP</code> 进行加法，其值等于被调用函数参数的总大小。</li><li><code>STDCALL</code> 是被调用者清除 (Callee Cleanup)，给予被调用函数 <code>RET</code> 一个操作数，其值等于被调用函数参数的总大小。此时系统会自动向 <code>ESP</code> 增加值。</li></ul><p><code>STDCALL</code> 可以确保调用者不会忘记清理栈，而 C 调用约定允许可变数量参数。</p><p><code>FASTCALL</code> 使用 <code>ECX</code> 和 <code>EDX</code> 传递前两个参数，之后的参数使用栈传递。</p><p>所有调用约定的整数返回值均通过 <code>EAX</code> 返回。</p><details class="callout" data-callout="note" data-callout-fold="-"><summary class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">FASTCALL 的翻身</div><div class="callout-fold"></div></summary><div class="callout-content"><p>随着 CPU 的进步，寄存器的数量增加，<code>FASTCALL</code> 也迎来了升级。x86-64 Windows 允许前 4 个、x86-64 Linux 允许前 6 个参数使用寄存器传参（从左到右顺序），其他参数使用栈传参（从右往左）。</p><p><code>FASTCALL</code> 成为 x86-64 的<strong>唯一</strong>调用约定。不少函数实现了纯寄存器传参，因为长参数的函数还是少见的。</p></div></details><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p>虽然你的程序你做主，但最好和汇编器一样遵守调用约定……</p></div></div><p>如果压栈参数在寄存器里，将寄存器压入栈，那么由调用者恢复寄存器：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">mov</span> <span class="built_in">ecx</span>,<span class="built_in">eax</span></span><br><span class="line"><span class="keyword">push</span> <span class="built_in">ecx</span></span><br><span class="line"><span class="keyword">push</span> OFFSET Array</span><br><span class="line"><span class="keyword">call</span> some_func</span><br><span class="line"><span class="keyword">add</span> <span class="built_in">esp</span>,<span class="number">4</span></span><br><span class="line"><span class="keyword">pop</span> <span class="built_in">ecx</span></span><br></pre></td></tr></tbody></table></figure><p>压栈的参数长度必须为 4 字节（32 bit 下）。如果值传参发现参数长度不是 4 字节，则应该换用引用传参。</p><h3 id="9-5-引用传参的使用"><a class="header-anchor" href="#9-5-引用传参的使用"></a>9.5 引用传参的使用</h3><p>引用参数通常使用间接寻址访问。比如将一个数组的引用传递给 <code>ESI</code>：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">mov</span> <span class="built_in">esi</span>,[<span class="built_in">ebp</span>+<span class="number">12</span>] <span class="comment">; offset of array</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">ecx</span>,[<span class="built_in">ebp</span>+<span class="number">8</span>] <span class="comment">; array length</span></span><br><span class="line"><span class="comment">; ...</span></span><br><span class="line"><span class="keyword">mov</span> [<span class="built_in">esi</span>],<span class="built_in">ax</span> <span class="comment">; insert value in array</span></span><br><span class="line"><span class="keyword">add</span> <span class="built_in">esi</span>,TYPE <span class="built_in">WORD</span> <span class="comment">; move to next element</span></span><br><span class="line"><span class="comment">; ...</span></span><br></pre></td></tr></tbody></table></figure><h3 id="9-6-综合示例"><a class="header-anchor" href="#9-6-综合示例"></a>9.6 综合示例</h3><blockquote><p>对于计科的同学，课程要求就到这里。</p></blockquote><p>函数调用时的具体步骤如下：</p><ol><li>主调函数将被调函数所要求的参数，根据相应的函数调用约定，保存在运行时栈中。该操作会改变程序的栈指针。</li><li>主调函数将控制权移交给被调函数（使用 <code>CALL</code> 指令）。函数的返回地址（待执行的下条指令地址）保存在程序栈中（压栈操作隐含在 <code>CALL</code> 指令中）。</li><li>被调函数会设置帧基指针 <code>ESP</code></li><li>被调函数通过修改栈顶指针的值，为自己的局部变量在运行时栈中分配内存空间，并从帧基指针的位置处向低地址方向存放被调函数的局部变量和临时变量。</li><li>如有必要，被调函数会保存希望调用前后保持不变的寄存器值。</li><li>被调函数执行自己任务，此时可能需要访问由主调函数传入的参数。若被调函数返回一个值，该值通常保存在一个指定寄存器中 (如 EAX)。</li><li>一旦被调函数完成操作，为该函数局部变量分配的栈空间将被释放。这通常是步骤 4 的逆向执行。</li><li>恢复步骤 3 中保存的寄存器值，包含主调函数的帧基指针寄存器。</li><li>被调函数将控制权交还主调函数 (使用 ret 指令)。根据使用的函数调用约定，该操作也可能从程序栈上清除先前传入的参数。</li><li>主调函数再次获得控制权后，可能需要将先前的参数从栈上清除。在这种情况下，对栈的修改需要将帧基指针值恢复到步骤 1 之前的值。</li></ol><p>步骤 3 与步骤 4 在函数调用之初常一同出现，统称为函数序 (prologue)；步骤 6 到步骤 8 在函数调用的最后常一同出现，统称为函数跋 (epilogue)。</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">; lab5_2.asm - Watermelonabc 2026/4/18</span></span><br><span class="line"><span class="comment">; 本程序用于求给定有符号数列中，绝对值比目标数 X 更大的最小负奇数</span></span><br><span class="line"><span class="comment">; 若存在，输出此数的绝对值；若不存在，输出 0</span></span><br><span class="line"></span><br><span class="line">include Irvine32<span class="number">.</span><span class="keyword">inc</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">.data</span></span><br><span class="line">TAB <span class="built_in">dword</span> <span class="number">5</span> dup(?)</span><br><span class="line">datSize = ($ - TAB)/<span class="number">4</span></span><br><span class="line">X <span class="built_in">dword</span> <span class="number">9</span></span><br><span class="line">Min <span class="built_in">dword</span> ?</span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">.code</span></span><br><span class="line"></span><br><span class="line"><span class="comment">; dword _cdecl getMin(dword* src,dword goal,dword leng) [ebp+8,ebp+12,ebp+16]</span></span><br><span class="line"><span class="comment">; src 地址、goal 和 leng 通过堆栈传参</span></span><br><span class="line"><span class="comment">; 返回值通过 eax 返回，表示 Min 的绝对值</span></span><br><span class="line"></span><br><span class="line">getMin PROC</span><br><span class="line">    <span class="keyword">push</span> <span class="built_in">ebp</span></span><br><span class="line">    <span class="keyword">mov</span> <span class="built_in">ebp</span>,<span class="built_in">esp</span></span><br><span class="line">    <span class="keyword">push</span> <span class="built_in">esi</span></span><br><span class="line">    <span class="keyword">push</span> <span class="built_in">edx</span></span><br><span class="line">    <span class="keyword">push</span> <span class="built_in">ebx</span></span><br><span class="line">    <span class="keyword">mov</span> <span class="built_in">esi</span>,[<span class="built_in">ebp</span>+<span class="number">8</span>]</span><br><span class="line">    <span class="keyword">mov</span> <span class="built_in">ebx</span>,[<span class="built_in">ebp</span>+<span class="number">12</span>]</span><br><span class="line">    <span class="keyword">mov</span> <span class="built_in">ecx</span>,[<span class="built_in">ebp</span>+<span class="number">16</span>]</span><br><span class="line">    <span class="keyword">mov</span> <span class="built_in">eax</span>,<span class="number">0</span></span><br><span class="line">    <span class="keyword">mov</span> <span class="built_in">edx</span>,<span class="number">0</span></span><br><span class="line"><span class="symbol">    isMin:</span></span><br><span class="line">        <span class="keyword">mov</span> <span class="built_in">edx</span>,[<span class="built_in">esi</span>]</span><br><span class="line">        <span class="keyword">cmp</span> <span class="built_in">edx</span>,<span class="number">0</span></span><br><span class="line">        <span class="keyword">jge</span> notMin <span class="comment">; is below 0?</span></span><br><span class="line">        <span class="keyword">and</span> <span class="built_in">edx</span>,<span class="number">1h</span></span><br><span class="line">        <span class="keyword">cmp</span> <span class="built_in">edx</span>,<span class="number">1</span></span><br><span class="line">        <span class="keyword">jne</span> notMin <span class="comment">; is odd number？</span></span><br><span class="line">        <span class="keyword">mov</span> <span class="built_in">edx</span>,[<span class="built_in">esi</span>]</span><br><span class="line">        <span class="keyword">neg</span> <span class="built_in">edx</span></span><br><span class="line">        <span class="keyword">cmp</span> <span class="built_in">edx</span>,<span class="built_in">ebx</span></span><br><span class="line">        <span class="keyword">jle</span> notMin <span class="comment">; is bigger than X?</span></span><br><span class="line">        <span class="keyword">cmp</span> <span class="built_in">eax</span>,<span class="built_in">edx</span></span><br><span class="line">        <span class="keyword">jg</span> notMin <span class="comment">; is bigger than current Min?</span></span><br><span class="line">        <span class="keyword">mov</span> <span class="built_in">eax</span>,<span class="built_in">edx</span></span><br><span class="line"><span class="symbol">        notMin:</span></span><br><span class="line">        <span class="keyword">add</span> <span class="built_in">esi</span>,<span class="number">4</span></span><br><span class="line">    <span class="keyword">loop</span> isMin</span><br><span class="line">    <span class="keyword">pop</span> <span class="built_in">ebx</span></span><br><span class="line">    <span class="keyword">pop</span> <span class="built_in">edx</span></span><br><span class="line">    <span class="keyword">pop</span> <span class="built_in">esi</span></span><br><span class="line">    <span class="keyword">pop</span> <span class="built_in">ebp</span></span><br><span class="line">    <span class="keyword">ret</span></span><br><span class="line">getMin ENDP</span><br><span class="line"></span><br><span class="line">main PROC</span><br><span class="line">    <span class="keyword">mov</span> <span class="built_in">esi</span>,OFFSET TAB</span><br><span class="line">    <span class="keyword">mov</span> <span class="built_in">ecx</span>,datSize</span><br><span class="line"><span class="symbol">    input:</span></span><br><span class="line">        <span class="keyword">call</span> ReadInt <span class="comment">; read a signed 32 bits integer from console and put into EAX</span></span><br><span class="line">        <span class="keyword">mov</span> [<span class="built_in">esi</span>],<span class="built_in">eax</span></span><br><span class="line">        <span class="keyword">add</span> <span class="built_in">esi</span>,<span class="number">4</span></span><br><span class="line">    <span class="keyword">loop</span> input</span><br><span class="line">    <span class="keyword">push</span> datSize <span class="comment">; leng</span></span><br><span class="line">    <span class="keyword">push</span> X       <span class="comment">; goal</span></span><br><span class="line">    <span class="keyword">push</span> OFFSET TAB <span class="comment">; *src</span></span><br><span class="line">    <span class="keyword">call</span> getMin</span><br><span class="line">    <span class="keyword">add</span> <span class="built_in">esp</span>,<span class="number">12</span></span><br><span class="line">    <span class="keyword">mov</span> Min,<span class="built_in">eax</span></span><br><span class="line">    <span class="keyword">call</span> WriteDec <span class="comment">; get an unsigned 32 bits integer from EAX and write to console</span></span><br><span class="line">    exit</span><br><span class="line">main ENDP</span><br><span class="line"></span><br><span class="line">END main</span><br></pre></td></tr></tbody></table></figure><h3 id="9-7-局部变量"><a class="header-anchor" href="#9-7-局部变量"></a>9.7 局部变量</h3><p>和参数不一样，局部变量是顺序 “入栈” 的。局部变量的值不是 <code>PUSH</code> 入栈的，而是先在栈上用 <code>ESP</code> 预留空间，然后直接向预留的栈空间写入局部变量。比如，一个 C 函数：</p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="type">void</span> <span class="title function_">MySub</span><span class="params">()</span></span><br><span class="line">{</span><br><span class="line">  <span class="type">int</span> X = <span class="number">10</span>;</span><br><span class="line">  <span class="type">int</span> Y = <span class="number">20</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>在 x86 汇编中呈现为：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">MySub PROC</span><br><span class="line"><span class="keyword">push</span> <span class="built_in">ebp</span></span><br><span class="line"><span class="keyword">mov</span>  <span class="built_in">ebp</span>,<span class="built_in">esp</span></span><br><span class="line"><span class="keyword">sub</span>  <span class="built_in">esp</span>,<span class="number">8</span> <span class="comment">; reserve space for locals in stack</span></span><br><span class="line"><span class="keyword">mov</span>  <span class="built_in">dword</span> <span class="built_in">PTR</span> [<span class="built_in">ebp</span>-<span class="number">4</span>],<span class="number">10</span> <span class="comment">; X</span></span><br><span class="line"><span class="keyword">mov</span>  <span class="built_in">dword</span> <span class="built_in">PTR</span> [<span class="built_in">ebp</span>-<span class="number">8</span>],<span class="number">20</span> <span class="comment">; Y</span></span><br><span class="line"><span class="keyword">mov</span>  <span class="built_in">esp</span>,<span class="built_in">ebp</span> <span class="comment">; remove locals from stack</span></span><br><span class="line"><span class="keyword">pop</span>  <span class="built_in">ebp</span></span><br><span class="line"><span class="keyword">ret</span></span><br><span class="line">MySub ENDP</span><br></pre></td></tr></tbody></table></figure><p>栈帧大致表现为：</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20260411013833285.png" alt="MySub()的栈帧" loading="lazy"></p><p>注意此处由于只保存了 <code>ebp</code> 寄存器，而它又属于栈底，因此直接将 <code>esp</code> 移到 <code>ebp</code> 就好了。如果你还使用了其他寄存器，那么还请你手动清理，再移动。</p><p><code>LEAVE</code> 指令等效于清理局部变量的那两条指令。</p><p>如果是一个数组呢？同样预留空间，但是预留的空间应该符合<strong>字节对齐</strong>，宜大不宜小。并且用 <code>LEA</code> (Load Effective Address) 指令获取地址。<code>OFFSET</code> 对栈上地址没有用：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">makeArray PROC</span><br><span class="line">  <span class="keyword">push</span> <span class="built_in">ebp</span></span><br><span class="line">  <span class="keyword">mov</span>  <span class="built_in">ebp</span>,<span class="built_in">esp</span></span><br><span class="line">  <span class="keyword">sub</span>  <span class="built_in">esp</span>,<span class="number">32</span></span><br><span class="line">  <span class="keyword">lea</span>  <span class="built_in">esi</span>,[<span class="built_in">ebp</span>-<span class="number">30</span>] <span class="comment">; load address of myString</span></span><br><span class="line">  <span class="keyword">mov</span>  <span class="built_in">ecx</span>,<span class="number">30</span></span><br><span class="line"><span class="symbol">  L1:</span></span><br><span class="line">    <span class="keyword">mov</span> <span class="built_in">BYTE</span> <span class="built_in">PTR</span> [<span class="built_in">esi</span>],<span class="string">'*'</span></span><br><span class="line">    <span class="keyword">inc</span> <span class="built_in">esi</span></span><br><span class="line">  <span class="keyword">loop</span> L1</span><br><span class="line">  <span class="keyword">add</span>  <span class="built_in">esp</span>,<span class="number">32</span> <span class="comment">; remove the array (restore ESP)</span></span><br><span class="line">  <span class="keyword">pop</span>  <span class="built_in">ebp</span></span><br><span class="line">  <span class="keyword">ret</span></span><br><span class="line">makeArray ENDP</span><br></pre></td></tr></tbody></table></figure><p>同样有 <code>ENTER</code> 和 <code>LEAVE</code> 指令可以为我们预留局部变量的栈空间。</p><p><code>ENTER</code> 会 push <code>EBP</code>、设置 <code>EBP</code> 和 <code>ESP</code> 相等并减少 <code>ESP</code> 以预留栈空间。它有两个操作数：<code>numbytes, nestinglevel</code>。<code>numbytes</code> 是你希望预留的字节数，<code>nestinglevel</code> 决定了从前一帧复制到新栈帧中的栈帧指针数量。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p><code>nestinglevel</code> 中的 nesting 指的是嵌套函数。在嵌套函数中，函数作用域是既包含又独立的。如果不将外层函数的帧复制到内层函数，那么万一内层函数需要外层函数的变量，就没处找了！</p></div></div><p>在这里，我们将 <code>nestinglevel</code> 固定为 0，只修改 <code>numbytes</code>。</p><p><code>LEAVE</code> 没有操作数，它将 <code>ESP</code> 设置为和 <code>EBP</code> 相等并弹出 <code>EBP</code> 以恢复栈。</p><p>而 MASM 提供了一个 <code>ENTER</code> 的上位替代指令：<code>LOCAL</code>。它更接近我们使用的参数表：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">LOCAL temp:<span class="built_in">DWORD</span>, SwapFlag:<span class="built_in">BYTE</span> <span class="comment">; Two locals var: temp and SwapFlag</span></span><br><span class="line">LOCAL pArray:<span class="built_in">PTR</span> <span class="built_in">WORD</span> <span class="comment">; A pointer to a 16 bits integer</span></span><br><span class="line">LOCAL TempArray[<span class="number">10</span>]:<span class="built_in">DWORD</span> <span class="comment">; An array of 10 DWORD</span></span><br></pre></td></tr></tbody></table></figure><hr><h2 id="AP-CTF-中常见汇编知识"><a class="header-anchor" href="#AP-CTF-中常见汇编知识"></a>AP. CTF 中常见汇编知识</h2><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p>Source: <a href="https://hello-ctf.com/hc-reverse/Quick%20Start%EF%BC%9AASM%E6%B1%87%E7%BC%96/#quick-start">Quick Start：汇编语言 - Hello CTF</a> 和 <a href="https://www.52pojie.cn/thread-1379708-1-1.html">[调试逆向] 逆向基础笔记六 汇编跳转和比较指令 - 52pojie</a></p></div></div><p>了解了一些基本的汇编指令后，下面我们来看看 CTF 中常见的一些指令：</p><ol><li><code>loop</code> 循环指令：</li></ol><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">mov</span> <span class="built_in">rax</span>,<span class="number">0</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">rcx</span>,<span class="number">236</span></span><br><span class="line"><span class="symbol">s:</span></span><br><span class="line"><span class="keyword">add</span> <span class="built_in">rax</span>,<span class="number">123</span></span><br><span class="line"><span class="keyword">loop</span> s</span><br><span class="line"><span class="keyword">leave</span></span><br><span class="line"><span class="keyword">ret</span></span><br></pre></td></tr></tbody></table></figure><p>上面的指令执行的是对 123 累加 236 次，从以上代码中我们可以看到，<code>rcx</code> 寄存器保存的是循环次数，<code>loop</code> 指令每执行一次，rcx 的数值就会减少 1，当其数值减少到 0 时，<code>loop</code> 指令就会停止，继续执行下面的指令。</p><ol start="2"><li>无条件跳转指令：</li></ol><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">lable:</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">edx</span>,<span class="number">0</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">jmp</span> lable</span><br></pre></td></tr></tbody></table></figure><p>无条件跳转指令为 <code>jmp</code>，其意思从字面上就可以看出来，只要是执行到 <code>jmp</code> 这里，无论什么情况，都会直接跳转到 <code>lable</code> 的代码块中继续往下执行指令。</p><ol start="3"><li>条件跳转：</li></ol><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">lable:</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">ebx</span>,<span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">cmp</span> <span class="built_in">ebx</span>,<span class="number">0</span></span><br><span class="line"><span class="keyword">je</span> lable</span><br></pre></td></tr></tbody></table></figure><p>以上代码将 <code>ebx</code> 的值与 0 对比，如果相等，则会跳转到 <code>lable</code> 处，条件跳转指令 <code>je</code> 代表相等则跳转，还有其他与之条件不一样的条件跳转指令，一般条件跳转指令是与 <code>cmp</code>、<code>test</code> 指令混在一起用的。以上代码也可以用 <code>test</code> 来写：</p><figure class="highlight x86asm"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="symbol">lable:</span></span><br><span class="line"><span class="keyword">mov</span> <span class="built_in">ebx</span>,<span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">test</span> <span class="built_in">ebx</span>,<span class="number">0</span></span><br><span class="line"><span class="keyword">jnz</span> lable</span><br></pre></td></tr></tbody></table></figure><p><code>test</code> 是逻辑与指令，以上代表的即为 <code>ebx&amp;0</code>，<code>jnz</code> 代表标志位为 0 就跳转，其实现效果与 <code>cmp</code> 相同。</p><p>下面是一些常见的条件跳转指令：</p><table><thead><tr><th>指令</th><th>英文全称</th><th>含义</th><th>判断标志位</th></tr></thead><tbody><tr><td><code>JE</code>, <code>JZ</code></td><td>jump equal，jump zero</td><td>结果为零则跳转 (相等时跳转)</td><td>ZF=1</td></tr><tr><td><code>JNE</code>, <code>JNZ</code></td><td>jump not equal，jump not zero</td><td>结果不为零则跳转 (不相等时跳转)</td><td>ZF=0</td></tr><tr><td><code>JS</code></td><td>jump sign</td><td>结果为负则跳转</td><td>SF=1</td></tr><tr><td><code>JNS</code></td><td>jump not sign</td><td>结果为非负则跳转</td><td>SF=0</td></tr><tr><td><code>JP</code>, <code>JPE</code></td><td>jump parity，jump parity even</td><td>结果中 1 的个数为偶数则跳转</td><td>PF=1</td></tr><tr><td><code>JNP</code>, <code>JPO</code></td><td>jump not parity，jump parity odd</td><td>结果中 1 的个数为偶数则跳转</td><td>PF=0</td></tr><tr><td><code>JO</code></td><td>jump overflow</td><td>结果溢出了则跳转</td><td>OF=1</td></tr><tr><td><code>JNO</code></td><td>jump not overflow</td><td>结果没有溢出则跳转</td><td>OF=0</td></tr><tr><td><code>JB</code>, <code>JNAE</code></td><td>jump below，jump not above equal</td><td>小于则跳转 (无符号数)</td><td>CF=1</td></tr><tr><td><code>JNB</code>, <code>JAE</code></td><td>jump not below，jump above equal</td><td>大于等于则跳转 (无符号数)</td><td>CF=0</td></tr><tr><td><code>JBE</code>, <code>JNA</code></td><td>jump below equal，jump not above</td><td>小于等于则跳转 (无符号数)</td><td>CF=1 or ZF=1</td></tr><tr><td><code>JNBE</code>, <code>JA</code></td><td>jump not below equal，jump above</td><td>大于则跳转 (无符号数)</td><td>CF=0 and ZF=0</td></tr><tr><td><code>JL</code>, <code>JNGE</code></td><td>jump less，jump not greater equal</td><td>小于则跳转 (有符号数)</td><td>SF≠ OF</td></tr><tr><td><code>JNL</code>, <code>JGE</code></td><td>jump not less，jump greater equal</td><td>大于等于则跳转 (有符号数)</td><td>SF=OF</td></tr><tr><td><code>JLE</code>, <code>JNG</code></td><td>jump less equal，jump not greater</td><td>小于等于则跳转 (有符号数)</td><td>ZF=1 or SF≠ OF</td></tr><tr><td><code>JNLE</code>, <code>JG</code></td><td>jump not less equal，jump greater</td><td>大于则跳转 (有符号数)</td><td>ZF=0 and SF=OF</td></tr></tbody></table><p>下面是一些常见的位运算指令：</p><ul><li><code>AND</code>：与运算，<code>AND AX,BX</code> 将 <code>AX</code> 与 <code>BX</code> 进行逻辑与运算，并将结果保存到 <code>AX</code> 寄存器中</li><li><code>OR</code>：或运算，<code>OR AX,BX</code> 将 <code>AX</code> 与 <code>BX</code> 进行逻辑或运算，并将结果保存到 <code>AX</code> 寄存器中</li><li><code>XOR</code>：异或运算，<code>XOR AX,BX</code> 将 <code>AX</code> 与 <code>BX</code> 进行异或运算，并将结果保存到 <code>AX</code> 寄存器中</li><li><code>NOT</code>：取反操作，<code>NOT CX</code> 将 <code>CX</code> 进行取反，并将结果保存到 <code>CX</code> 寄存器中</li><li><code>TEST</code>：逻辑与运算，<code>TEST AX,BX</code> 将 <code>AX</code> 与 <code>BX</code> 进行与运算，并设置标志位，结果不保存</li></ul><ol start="4"><li>函数传参：</li></ol><p>在汇编中，我们有时候需要知道参数被保存在那个寄存器里，这里我列举一般情况：</p><p>通常函数的返回值保存在 <code>ax</code> 寄存器里，比如 <code>eax</code>，<code>rax</code> 等； 函数的参数一般按顺序保存在 <code>cx</code>、<code>dx</code>、<code>si</code> 中，在 64 位汇编中，一般按 <code>rcx</code>, <code>rdx</code>, <code>r8</code>, <code>r9</code>, <code>r10</code>, <code>r11</code>, ... 的顺序保存参数。</p><p>有时候根据函数调用约定以及编译器和平台的不同，这个储存规律也会发生改变，我们需要根据当时情况动态调整。</p><ol start="5"><li><code>lea</code> 地址加载：</li></ol><p>其使用格式为 <code>lea rdx,[my_var]</code>，将 <code>my_var</code> 的地址而不是内容赋值给 <code>rdx</code> 寄存器。</p><ol start="6"><li><code>xchg</code> 数值交换指令：</li></ol><p>其使用格式为 <code>xchg ax,bx</code> 将 <code>ax</code> 和 <code>bx</code> 的数值交换。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/57f94527/</id>
    <link href="https://watermelonabc.top/p/57f94527/" rel="alternate"/>
    <published>2026-03-24T12:22:30.000Z</published>
    <summary>x86 平台的汇编语言的笔记，本部分为语言知识</summary>
    <title>x86 汇编语言详解 -2</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="Writeup" scheme="https://watermelonabc.top/categories/Writeup/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="CTF" scheme="https://watermelonabc.top/tags/CTF/"/>
    <content>
      <![CDATA[<h2 id="杂记部分"><a class="header-anchor" href="#杂记部分"></a>杂记部分</h2><p>在广外的大学城校区比赛！体育场比 FZU 大太多了，而且貌似别的学校也有类似的规模的体育场所？！太羡慕了</p><p>被 Web 学长和 Pwn 队友带飞的一集，我这个 Re 手还是太 fw 了 QAQ</p><p>最终没有 AK 零食……</p><p>不过居然是一等奖！好欸！<sup>-</sup></p>]]>
    </content>
    <id>https://watermelonabc.top/p/c392bccc/</id>
    <link href="https://watermelonabc.top/p/c392bccc/" rel="alternate"/>
    <published>2026-03-23T12:25:51.000Z</published>
    <summary>蒟蒻的第一次 CCB 线下赛 ;)</summary>
    <title>CCB 2026 Half-Final Guangzhou</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="Writeup" scheme="https://watermelonabc.top/categories/Writeup/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="CTF" scheme="https://watermelonabc.top/tags/CTF/"/>
    <category term="Reverse" scheme="https://watermelonabc.top/tags/Reverse/"/>
    <content>
      <![CDATA[<div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p></p><p>本题为 “中国高校智能机器人创意大赛产教融合赛道 - 软件系统安全赛” 的 re1，可惜的是我在比赛期间没有解出。只能说恐怕离了 AI 我就啥也不是了哎 😔</p></div></div><h2 id="1-题目背景"><a class="header-anchor" href="#1-题目背景"></a>1. 题目背景</h2><p>本题的参考项目应该是这个：<a href="https://github.com/S3N4T0R-0X0/Malicious-PixelCode">Malicious-PixelCode</a>。Github 提交记录显示是 25 年 11 月上传的，算是一个 Real World 题目了。</p><p>首先，计算机中的视频本质上仍是一串字节序列，只要是字节序列就会有程序可以读取。</p><blockquote><p>你可以观看 <a href="https://www.bilibili.com/video/BV1NSC5BtEem/">不依赖三方库和框架，直接操纵像素在 CPU 上跑 Shader | Tsoding</a>，看看纯代码是如何生成简单图像和视频的。</p></blockquote><p>像素代码 (Pixel Code) 是以可视化像素的形式表示二进制数据的技术。每个像素通过将可执行字节转换为结构化的彩色矩阵来编码原始文件的一小部分，数据可以存储、传输或嵌入图像或视频中而不暴露原始形式。</p><p>该技术常被用于研究数据混淆、隐蔽存储和非常规编码通道。通过将恶意软件转化为基于像素的表示形式，攻击者可能试图将其负载伪装成无害的多媒体内容。这些编码文件随后可以上传到合法平台，绕过传统的安全过滤器，向外界传达一种可信赖的假象。攻击者控制的加载器或解码器随后可以检索视频并重建原始恶意文件。</p><p>整体流程是这样的：</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20260315000544252.jpg" alt="Pixel Code Workflow" loading="lazy"></p><ol><li>编写攻击负载并构建为可执行文件</li><li>生成的可执行文件会通过专门设计用于将二进制数据转换为像素代码的基于 Python 的工具进行处理。该工具将可执行文件转换为可视化的 MP4 视频，二进制字节以像素值的形式嵌入帧中。</li><li>生成 Pixel Code MP4 文件后，会作为标准视频上传到视频平台。</li><li>编写 Python Stager 脚本以从视频中重建代码</li><li>将 Stager 脚本转换为编码序列（这里是先转成 EXE 再 Base64 一次），嵌入加载器代码</li><li>构建加载器</li></ol><p>当目标机器下载并运行加载器后，加载器会自动从视频网站下载视频。然后加载器重建 Stager 脚本，Stager 脚本再从视频里重建攻击负载，最后攻击负载执行，实现攻击目的。</p><h2 id="2-题目分析"><a class="header-anchor" href="#2-题目分析"></a>2. 题目分析</h2><p>本题给了两个文件：ELF 格式的 <code>Loader</code> 和 <code>video.mp4</code>。打开 <code>video.mp4</code> 的话会看到一系列条码在 “滚动”。</p><p>加载 <code>Loader</code> 会发现附带调试信息，因此总体是比较清晰的：</p><figure class="highlight cpp"><figcaption><span>Loader</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> __fastcall <span class="title">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv, <span class="type">const</span> <span class="type">char</span> **envp)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">  __int64 v3; <span class="comment">// rax</span></span><br><span class="line">  __int64 v4; <span class="comment">// rax</span></span><br><span class="line">  __int64 v5; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">int</span> v6; <span class="comment">// ebx</span></span><br><span class="line">  __int64 v7; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">const</span> <span class="type">char</span> *file; <span class="comment">// rax</span></span><br><span class="line">  _BYTE v10[<span class="number">9</span>]; <span class="comment">// [rsp+7h] [rbp-99h] BYREF</span></span><br><span class="line">  _BYTE *v11; <span class="comment">// [rsp+10h] [rbp-90h]</span></span><br><span class="line">  _BYTE *v12; <span class="comment">// [rsp+18h] [rbp-88h]</span></span><br><span class="line">  __int64 videoFile[<span class="number">4</span>]; <span class="comment">// [rsp+20h] [rbp-80h] BYREF</span></span><br><span class="line">  __int64 src[<span class="number">4</span>]; <span class="comment">// [rsp+40h] [rbp-60h] BYREF</span></span><br><span class="line">  __int64 File[<span class="number">7</span>]; <span class="comment">// [rsp+60h] [rbp-40h] BYREF</span></span><br><span class="line"></span><br><span class="line">  File[<span class="number">5</span>] = __readfsqword(<span class="number">0x28u</span>);</span><br><span class="line">  *(_QWORD *)&amp;v10[<span class="number">1</span>] = v10;</span><br><span class="line">  std::string::<span class="built_in">basic_string</span>(videoFile, <span class="string">"video.mp4"</span>, v10);</span><br><span class="line">  std::__new_allocator&lt;<span class="type">char</span>&gt;::~__new_allocator(v10);</span><br><span class="line">  <span class="keyword">if</span> ( <span class="built_in">file_exists</span>(videoFile) )</span><br><span class="line">  {</span><br><span class="line">    v11 = v10;</span><br><span class="line">    std::string::<span class="built_in">basic_string</span>(</span><br><span class="line">      File,</span><br><span class="line">      stager_pyc_base64,                        <span class="comment">// "delete"</span></span><br><span class="line">      v10);                                     <span class="comment">// "delete"</span></span><br><span class="line">    <span class="built_in">base64_decode</span>(src, File);</span><br><span class="line">    std::string::~<span class="built_in">string</span>();</span><br><span class="line">    std::__new_allocator&lt;<span class="type">char</span>&gt;::~__new_allocator(v10);</span><br><span class="line">    v12 = v10;</span><br><span class="line">    std::string::<span class="built_in">basic_string</span>(File, <span class="string">"stager.pyc"</span>, v10);</span><br><span class="line">    std::__new_allocator&lt;<span class="type">char</span>&gt;::~__new_allocator(v10);</span><br><span class="line">    <span class="keyword">if</span> ( (<span class="type">unsigned</span> __int8)<span class="built_in">write_string_to_file</span>((__int64)File, src) == <span class="number">1</span> )</span><br><span class="line">    {</span><br><span class="line">      file = (<span class="type">const</span> <span class="type">char</span> *)std::string::<span class="built_in">c_str</span>(File);</span><br><span class="line">      <span class="built_in">chmod</span>(file, <span class="number">493u</span>);</span><br><span class="line">      <span class="built_in">run_python_script</span>(File);</span><br><span class="line">      v6 = <span class="number">0</span>;</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">else</span></span><br><span class="line">    {</span><br><span class="line">      v7 = std::<span class="keyword">operator</span>&lt;&lt;&lt;std::char_traits&lt;<span class="type">char</span>&gt;&gt;(&amp;std::cerr, <span class="string">"创建 stager.pyc 失败"</span>);</span><br><span class="line">      std::ostream::<span class="keyword">operator</span>&lt;&lt;(v7, &amp;std::endl&lt;<span class="type">char</span>,std::char_traits&lt;<span class="type">char</span>&gt;&gt;);</span><br><span class="line">      v6 = <span class="number">1</span>;</span><br><span class="line">    }</span><br><span class="line">    std::string::~<span class="built_in">string</span>();</span><br><span class="line">    std::string::~<span class="built_in">string</span>();</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  {</span><br><span class="line">    v3 = std::<span class="keyword">operator</span>&lt;&lt;&lt;std::char_traits&lt;<span class="type">char</span>&gt;&gt;(&amp;std::cerr, <span class="string">"错误：未找到视频文件 "</span>);</span><br><span class="line">    v4 = std::<span class="keyword">operator</span>&lt;&lt;&lt;<span class="type">char</span>&gt;(v3, videoFile);</span><br><span class="line">    std::ostream::<span class="keyword">operator</span>&lt;&lt;(v4, &amp;std::endl&lt;<span class="type">char</span>,std::char_traits&lt;<span class="type">char</span>&gt;&gt;);</span><br><span class="line">    v5 = std::<span class="keyword">operator</span>&lt;&lt;&lt;std::char_traits&lt;<span class="type">char</span>&gt;&gt;(&amp;std::cerr, <span class="string">"请确保 video.mp4 位于当前目录"</span>);</span><br><span class="line">    std::ostream::<span class="keyword">operator</span>&lt;&lt;(v5, &amp;std::endl&lt;<span class="type">char</span>,std::char_traits&lt;<span class="type">char</span>&gt;&gt;);</span><br><span class="line">    v6 = <span class="number">1</span>;</span><br><span class="line">  }</span><br><span class="line">  std::string::~<span class="built_in">string</span>();</span><br><span class="line">  <span class="keyword">return</span> v6;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p><code>Loader</code> 的逻辑是：</p><pre class="mermaid">graph LR  A(检查 video.mp4 是否存在) --&gt;|是| B(加载并解码脚本字节序列)  A --&gt;|否| C(抛出错误)  B --&gt; D(将解码结果写入 stager.pyc)  D --&gt;|成功| E(加权限，执行脚本)  D --&gt;|失败| F(抛出错误)</pre><p>这里出题者将 <code>Stager.pyc</code> 的字节序列删除了，只留下 <code>"delete"</code>，但是查看 <code>.data</code> 段会发现攻击用的负载编码器的编码序列没有删除。将其 dump 下来并保存为 <code>.pyc</code> 文件，反编译得到：</p><figure class="highlight python"><figcaption><span>payload.py</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"><span class="keyword">import</span> math</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> imageio</span><br><span class="line"><span class="keyword">from</span> tqdm <span class="keyword">import</span> tqdm</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">file_to_video</span>(<span class="params">input_file, width, height, pixel_size, fps, output_file = (<span class="params"><span class="number">640</span>, <span class="number">480</span>, <span class="number">8</span>, <span class="number">10</span>, <span class="string">'video.mp4'</span></span>)</span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(input_file):</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">None</span></span><br><span class="line">    file_size = <span class="literal">None</span>.path.getsize(input_file)</span><br><span class="line">    binary_string = <span class="string">''</span></span><br><span class="line">    <span class="keyword">with</span> <span class="literal">None</span>:</span><br><span class="line">        f = <span class="built_in">open</span>(input_file, <span class="string">'rb'</span>)</span><br><span class="line">        <span class="keyword">for</span> chunk <span class="keyword">in</span> <span class="literal">None</span>(<span class="literal">None</span>((<span class="keyword">lambda</span> : f.read(<span class="number">1024</span>)), <span class="string">b''</span>), math.ceil(file_size / <span class="number">1024</span>), <span class="string">'KB'</span>, <span class="string">'读取文件'</span>, **(<span class="string">'iterable'</span>, <span class="string">'total'</span>, <span class="string">'unit'</span>, <span class="string">'desc'</span>)):</span><br><span class="line">            binary_string += <span class="string">''</span>.join((<span class="keyword">lambda</span> <span class="number">.0</span>: <span class="keyword">pass</span>)(chunk))</span><br><span class="line">    xor_key = <span class="string">'10101010'</span></span><br><span class="line">    xor_binary_string = <span class="string">''</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(binary_string), <span class="number">8</span>):</span><br><span class="line">        chunk = binary_string[i:i + <span class="number">8</span>]</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">len</span>(chunk) == <span class="number">8</span>:</span><br><span class="line">            chunk_int = <span class="built_in">int</span>(chunk, <span class="number">2</span>)</span><br><span class="line">            key_int = <span class="built_in">int</span>(xor_key, <span class="number">2</span>)</span><br><span class="line">            xor_result = chunk_int ^ key_int</span><br><span class="line">            xor_binary_string += <span class="string">f'''<span class="subst">{xor_result:08b}</span>'''</span></span><br><span class="line">            <span class="keyword">continue</span></span><br><span class="line">        xor_binary_string += chunk</span><br><span class="line">    </span><br><span class="line">    binary_string = xor_binary_string</span><br><span class="line">    pixels_per_image = (width // pixel_size) * (height // pixel_size)</span><br><span class="line">    num_images = math.ceil(<span class="built_in">len</span>(binary_string) / pixels_per_image)</span><br><span class="line">    frames = []</span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> tqdm(<span class="built_in">range</span>(num_images), <span class="string">'生成视频帧'</span>, **(<span class="string">'desc'</span>,)):</span><br><span class="line">        start = i * pixels_per_image</span><br><span class="line">        bits = binary_string[start:start + pixels_per_image]</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">len</span>(bits) &lt; pixels_per_image:</span><br><span class="line">            bits = bits + <span class="string">'0'</span> * (pixels_per_image - <span class="built_in">len</span>(bits))</span><br><span class="line">        img = Image.new(<span class="string">'RGB'</span>, (width, height), <span class="string">'white'</span>, **(<span class="string">'color'</span>,))</span><br><span class="line">        <span class="keyword">for</span> r <span class="keyword">in</span> <span class="built_in">range</span>(height // pixel_size):</span><br><span class="line">            row_start = r * (width // pixel_size)</span><br><span class="line">            row_end = (r + <span class="number">1</span>) * (width // pixel_size)</span><br><span class="line">            row = bits[row_start:row_end]</span><br><span class="line">            <span class="keyword">for</span> c, bit <span class="keyword">in</span> <span class="built_in">enumerate</span>(row):</span><br><span class="line">                color = (<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>) <span class="keyword">if</span> bit == <span class="string">'1'</span> <span class="keyword">else</span> (<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>)</span><br><span class="line">                x1 = c * pixel_size</span><br><span class="line">                y1 = r * pixel_size</span><br><span class="line">                img.paste(color, (x1, y1, x1 + pixel_size, y1 + pixel_size))</span><br><span class="line">            </span><br><span class="line">        </span><br><span class="line">        frames.append(np.array(img))</span><br><span class="line">    </span><br><span class="line">    <span class="keyword">with</span> imageio.get_writer(output_file, fps, <span class="string">'libx264'</span>, **(<span class="string">'fps'</span>, <span class="string">'codec'</span>)) <span class="keyword">as</span> writer:</span><br><span class="line">        <span class="keyword">for</span> frame <span class="keyword">in</span> tqdm(frames, <span class="string">'写入视频帧'</span>, **(<span class="string">'desc'</span>,)):</span><br><span class="line">            writer.append_data(frame)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">'__main__'</span>:</span><br><span class="line">    input_path = <span class="string">'payload'</span></span><br><span class="line">    <span class="keyword">if</span> os.path.exists(input_path):</span><br><span class="line">        file_to_video(input_path)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        sys.exit(<span class="number">1</span>)</span><br></pre></td></tr></tbody></table></figure><p>对照原始项目脚本，将原始项目脚本修改为：</p><figure class="highlight python"><figcaption><span>payload_fixed.py</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"><span class="keyword">import</span> math, os</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">from</span> moviepy <span class="keyword">import</span> ImageSequenceClip</span><br><span class="line"><span class="keyword">from</span> tqdm <span class="keyword">import</span> tqdm</span><br><span class="line"></span><br><span class="line"><span class="comment"># tqdm 是进度条的库</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">file_to_video</span>(<span class="params">input_file, width=<span class="number">640</span>, height=<span class="number">480</span>, pixel_size=<span class="number">8</span>, fps=<span class="number">10</span></span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.isfile(input_file):</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f"Error: File '<span class="subst">{input_file}</span>' does not exist."</span>)</span><br><span class="line">        <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line">    file_size = os.path.getsize(input_file)</span><br><span class="line">    binary_string = <span class="string">""</span></span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(input_file, <span class="string">"rb"</span>) <span class="keyword">as</span> f:</span><br><span class="line">        <span class="keyword">for</span> chunk <span class="keyword">in</span> tqdm(iterable=<span class="built_in">iter</span>(<span class="keyword">lambda</span>: f.read(<span class="number">1024</span>), <span class="string">b""</span>), </span><br><span class="line">                         total=math.ceil(file_size/<span class="number">1024</span>), unit=<span class="string">"KB"</span>):</span><br><span class="line">            binary_string += <span class="string">""</span>.join(<span class="string">f"<span class="subst">{byte:08b}</span>"</span> <span class="keyword">for</span> byte <span class="keyword">in</span> chunk)</span><br><span class="line"></span><br><span class="line">    xor_key = <span class="string">'10101010'</span></span><br><span class="line">    xor_binary_string = <span class="string">''</span></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">0</span>, <span class="built_in">len</span>(binary_string), <span class="number">8</span>):</span><br><span class="line">        chunk = binary_string[i:i + <span class="number">8</span>]</span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">len</span>(chunk) == <span class="number">8</span>:</span><br><span class="line">            chunk_int = <span class="built_in">int</span>(chunk, <span class="number">2</span>)</span><br><span class="line">            key_int = <span class="built_in">int</span>(xor_key, <span class="number">2</span>)</span><br><span class="line">            xor_result = chunk_int ^ key_int</span><br><span class="line">            xor_binary_string += <span class="string">f'''<span class="subst">{xor_result:08b}</span>'''</span></span><br><span class="line">            <span class="keyword">continue</span></span><br><span class="line">        xor_binary_string += chunk</span><br><span class="line">    binary_string = xor_binary_string</span><br><span class="line"></span><br><span class="line">    pixels_per_image = (width // pixel_size) * (height // pixel_size)</span><br><span class="line">    num_images = math.ceil(<span class="built_in">len</span>(binary_string) / pixels_per_image)</span><br><span class="line">    frames = []</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> i <span class="keyword">in</span> tqdm(<span class="built_in">range</span>(num_images), desc=<span class="string">"Generating frames"</span>):</span><br><span class="line">        start = i * pixels_per_image</span><br><span class="line">        bits = binary_string[start:start + pixels_per_image]</span><br><span class="line">        img = Image.new(<span class="string">'RGB'</span>, (width, height), color=<span class="string">'white'</span>)</span><br><span class="line">        </span><br><span class="line">        <span class="keyword">if</span> <span class="built_in">len</span>(bits) &lt; pixels_per_image:</span><br><span class="line">            bits = bits + <span class="string">'0'</span> * (pixels_per_image - <span class="built_in">len</span>(bits))</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> r <span class="keyword">in</span> <span class="built_in">range</span>(height // pixel_size):</span><br><span class="line">            row = bits[r * (width // pixel_size):(r + <span class="number">1</span>) * (width // pixel_size)]</span><br><span class="line">            <span class="keyword">for</span> c, bit <span class="keyword">in</span> <span class="built_in">enumerate</span>(row):</span><br><span class="line">                color = (<span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>) <span class="keyword">if</span> bit == <span class="string">'1'</span> <span class="keyword">else</span> (<span class="number">255</span>, <span class="number">255</span>, <span class="number">255</span>)</span><br><span class="line">                x1, y1 = c * pixel_size, r * pixel_size</span><br><span class="line">                img.paste(color, (x1, y1, x1 + pixel_size, y1 + pixel_size))</span><br><span class="line">        </span><br><span class="line">        frames.append(np.array(img))</span><br><span class="line">        <span class="comment"># print(frames)</span></span><br><span class="line"></span><br><span class="line">    clip = ImageSequenceClip(frames, fps=fps)</span><br><span class="line">    clip.write_videofile(<span class="string">'video.mp4'</span>, fps=fps, codec=<span class="string">'libx264'</span>)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">"Video generated successfully: video.mp4"</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">"Convert file → video"</span>)</span><br><span class="line">    path = <span class="built_in">input</span>(<span class="string">"Enter file path: "</span>)</span><br><span class="line">    file_to_video(path)</span><br></pre></td></tr></tbody></table></figure><p>脚本主要分成两部分：将程序转化成二进制流并作按位异或处理；将二进制流以 8bits 为一个单位，设定位置和颜色，最终生成一个 640 × 480 @ 10FPS 的 mp4 视频文件。</p><div class="callout" data-callout="info"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-info"><circle cx="12" cy="12" r="10"></circle><path d="M12 16v-4"></path><path d="M12 8h.01"></path></svg></div><div class="callout-title-inner">Info</div></div><div class="callout-content"><p>我怎么发现这个 Github 项目的呢？我在解码 pyc 文件后，发现解码结果中间有一些合法的文件名，比如 <code>Payload_To_PixelCode_video.py</code>，于是我就拿到 Bing 上搜，一下就搜到了这个项目（</p></div></div><p>现在正向转换我们知道是怎么回事了，但逆过来呢？</p><p>背景项目提供了一个解码器：</p><figure class="highlight python"><figcaption><span>Stager_To_PixelCode_video.py</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> imageio</span><br><span class="line"><span class="keyword">import</span> numpy <span class="keyword">as</span> np</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">frames_to_bits_auto</span>(<span class="params">frames</span>):</span><br><span class="line">    bits_list = []</span><br><span class="line">    <span class="keyword">for</span> frame <span class="keyword">in</span> frames:</span><br><span class="line">        gray = np.mean(frame, axis=<span class="number">2</span>)</span><br><span class="line">        h, w = gray.shape</span><br><span class="line">        pixel_size_h = <span class="built_in">max</span>(<span class="number">1</span>, h // <span class="number">256</span>)</span><br><span class="line">        pixel_size_w = <span class="built_in">max</span>(<span class="number">1</span>, w // <span class="number">256</span>)</span><br><span class="line">        pixel_size = <span class="built_in">min</span>(pixel_size_h, pixel_size_w)</span><br><span class="line">        h_blocks = h // pixel_size</span><br><span class="line">        w_blocks = w // pixel_size</span><br><span class="line">        cropped = gray[:h_blocks * pixel_size, :w_blocks * pixel_size]</span><br><span class="line">        reshaped = cropped.reshape(h_blocks, pixel_size, w_blocks, pixel_size)</span><br><span class="line">        block_means = reshaped.mean(axis=(<span class="number">1</span>, <span class="number">3</span>))</span><br><span class="line">        block_bits = (block_means &lt; <span class="number">128</span>).astype(np.uint8)</span><br><span class="line">        bits_list.append(block_bits.ravel())</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> bits_list:</span><br><span class="line">        <span class="keyword">return</span> np.array([], dtype=np.uint8)</span><br><span class="line">    <span class="keyword">return</span> np.concatenate(bits_list)</span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bits_to_file</span>(<span class="params">bits, output_file</span>):</span><br><span class="line">    remainder = bits.size % <span class="number">8</span></span><br><span class="line">    <span class="keyword">if</span> remainder:</span><br><span class="line">        bits = bits[: bits.size - remainder]</span><br><span class="line">    <span class="keyword">if</span> bits.size == <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    packed = np.packbits(bits, bitorder=<span class="string">'big'</span>)</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(output_file, <span class="string">'wb'</span>) <span class="keyword">as</span> f:</span><br><span class="line">            f.write(packed.tobytes())</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">video_to_exe</span>(<span class="params">video_path, output_name=<span class="string">"Final_Result"</span></span>):</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> os.path.exists(video_path):</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        reader = imageio.get_reader(video_path, <span class="string">'ffmpeg'</span>)</span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line">    frames = []</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">for</span> frame <span class="keyword">in</span> reader:</span><br><span class="line">            frames.append(frame)</span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        reader.close()</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    reader.close()</span><br><span class="line"></span><br><span class="line">    bits = frames_to_bits_auto(frames)</span><br><span class="line">    <span class="keyword">return</span> bits_to_file(bits, output_name)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">"__main__"</span>:</span><br><span class="line">    video_file = <span class="string">"Pixel_Code_Video.mp4"</span></span><br><span class="line">    out_exe = <span class="string">"Final_Result"</span></span><br><span class="line">    success = video_to_exe(video_file, out_exe)</span><br><span class="line">    <span class="keyword">if</span> success <span class="keyword">and</span> os.path.exists(out_exe):</span><br><span class="line">        <span class="keyword">try</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">"Reconstruction Success.\n"</span>)</span><br><span class="line">            <span class="comment"># os.startfile(out_exe)  </span></span><br><span class="line">        <span class="keyword">except</span>:</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">"Reconstruction Failed.\n"</span>)</span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><p>对比原项目提供的编码器，我们发现题目中编码器只修改了两点：一是程序字节转二进制流时的按位异或，二是二进制流数据不够时补 0。第二点在逆向时不需要关注，因此我们只需要确定这个异或操作应该出现在解码器的哪个位置。</p><p>从编码器来看，异或操作位于程序字节转成二进制流之后，那么编码器生成二进制流之后需要经过一次异或才是原始程序字节。逆异或操作位于 numpy 打包完成二进制流之后：</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># ...</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">undo_xor</span>(<span class="params">data</span>):</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">bytes</span>([b ^ <span class="number">0xAA</span> <span class="keyword">for</span> b <span class="keyword">in</span> data]) <span class="comment"># 0xAAh = 10101010b</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">bits_to_file</span>(<span class="params">bits, output_file</span>):</span><br><span class="line">    remainder = bits.size % <span class="number">8</span></span><br><span class="line">    <span class="keyword">if</span> remainder:</span><br><span class="line">        bits = bits[: bits.size - remainder]</span><br><span class="line">    <span class="keyword">if</span> bits.size == <span class="number">0</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line">    packed = np.packbits(bits, bitorder=<span class="string">'big'</span>)</span><br><span class="line">    decoded = undo_xor(packed.tobytes())</span><br><span class="line">    <span class="keyword">try</span>:</span><br><span class="line">        <span class="keyword">with</span> <span class="built_in">open</span>(output_file, <span class="string">'wb'</span>) <span class="keyword">as</span> f:</span><br><span class="line">            f.write(decoded)</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">True</span></span><br><span class="line">    <span class="keyword">except</span>:</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">False</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># ...</span></span><br></pre></td></tr></tbody></table></figure><p>执行修改后的脚本，得到 <code>Final_Result</code>。使用 IDA 反编译，查看 <code>.rodata</code> 段，得到 “提示：每个 MD5 哈希对应一个 ASCII 字符，按顺序组合这些字符即可得到 flag。” 以及 20 个 MD5 值。解密这些 MD5 值，得到 flag：</p><p><code>dart{2b1f8-3045e76c}</code></p>]]>
    </content>
    <id>https://watermelonabc.top/p/698c60bb/</id>
    <link href="https://watermelonabc.top/p/698c60bb/" rel="alternate"/>
    <published>2026-03-19T11:13:43.000Z</published>
    <summary>何等 Pixel Art 的代码</summary>
    <title>视频也可以含恶意代码吗</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="杂记" scheme="https://watermelonabc.top/categories/%E6%9D%82%E8%AE%B0/"/>
    <category term="other" scheme="https://watermelonabc.top/tags/other/"/>
    <content>
      <![CDATA[<p>封面来源：新华社 <a href="https://www.xinhuanet.com/photo/20260101/300cb3814aa04482872bd01e942d9b50/c.html?page=2">你好，2026</a></p><div class="tag-plugin image"><div class="image-bg" style="padding:8px;aspect-ratio:1676/1148;width:400px;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20260101132018453.png" alt="和ROIS队友们联机Minecraft" data-fancybox="true" onerror="this.src='/asset/image/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(/asset/image/Fructose-Content-running-medium.webp);"></div></div><div class="image-meta"><span class="image-caption center">和 ROIS 队友们联机 Minecraft</span></div></div><p>Hi，这里是 Watermelonabc</p><p>不知不觉间，又来到 2026 年，我已经迎来人生的第 2 个 10 周年。再过三周，我的博客也将迎来建站的 1 周年（以 Git 提交时间计）</p><p>老实说，我现在的感受有点…… 暗淡？因为我实在没有什么认为值得说道的，也许是终于加入了 ROIS 团队，认识了一群可亲可爱的队友和学长？在 ROIS，我也实现了人生中第一次出省旅行（9th XCTF Finals，浙江宁波，比赛主要是学长在打哈 X^X）</p><p>但除了这些小浪花呢？每天仿佛是一样的过，上课、呆实验室、呆宿舍。上半年我还有闲情雅致出校游玩，但进入大二，工作日奉献给了教室，而周末则一头扎进实验室或者在宿舍赋闲，顶多去趟学生街，基本没出过校园范围。</p><p>讲真这样的生活确实有些单调，更可怕的是我已经没有能力为这无聊的生活增添些许色彩的平衡。</p><p>我追求完美，但这世界总有缺陷，因此经常会构建一种 “完美” 的自己，并陷入其中。我们常常将这种想象称为 “白日梦”“中二病”。然而泡泡是脆弱的，现实并不会放任它膨胀，于是想象过后是落差的羞耻。有言道，“知耻而后勇”，但在我这里，很多时候往往是 “知耻而后退”。于是，没有进一步的勇气，只好搁置那想象中的 “理想自我”，最后腐烂。</p><p>这 “完美” 要命的点在于，人们总觉得干 “正事” 才会追求完美，但对于我而言，干 “不那么正的事” 同样要追求完美，故培养兴趣的时候，我总是 “三分钟热度”，干柴烈火一番后认识到落差，便迅速冷却。换句话说，我好像没有一个认为值得拿出来谈论的所谓 “兴趣爱好”。</p><p>由 “完美” 又引出 “控制欲”，因为那想象中的 “完美” 自己是得心应手、掌控一切的。于是你会发现这会影响我生活的方方面面：我不希望别人中途打扰我的工作，也难以开口求助；我倾向于模拟经营类游戏，且会开 Trainer（单人情况下，联机还是要遵守服务器规则的）…… 一点点变量的引入都可能会导致自娱自乐的小框架的崩塌。（虽然这框架本就摇摇欲坠）</p><p>“你以后想干什么？” 从家庭、学校到社会，我被持续地追问这个问题，然而，我竟不能给出一个令我自己信服的答案，每次都是敷衍了事。所以我到底是个什么东西呢？答案依然在风中飘 -^- 或许也是我无法设计出自己的兽设的原因吧，毕竟若如许多大大所说的 “furry 是真实自我的展现” 的话，那么当我自己被虚假的期望包裹时，又如何知晓那个 “真实的自己” 是个什么样子呢？</p><div class="tag-plugin image"><div class="image-bg" style="padding:8px;aspect-ratio:2310/3120;width:250px;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20260101140431492.jpg" alt="和一位Furry老师的合影，也是跨年夜唯一一张集邮🥲" data-fancybox="true" onerror="this.src='/asset/image/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(/asset/image/Fructose-Content-running-medium.webp);"></div></div><div class="image-meta"><span class="image-caption center">和一位 Furry 老师的合影，也是跨年夜唯一一张集邮🥲</span></div></div><p>多么可笑啊，明明自己为了和毛毛互动才搭地铁到宝龙，但真的见到 TA 们上毛的时候，却没有勇气上前拍照合影，只敢在一旁看着，但这倒显得我像个神必跟踪狂了。无论如何都无法完美啊。</p><p>总之，日子依然要一天天过下去……</p>]]>
    </content>
    <id>https://watermelonabc.top/p/12511374/</id>
    <link href="https://watermelonabc.top/p/12511374/" rel="alternate"/>
    <link href="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/2026-sunrise.webp" rel="enclosure" type="image/webp"/>
    <published>2025-12-31T14:31:49.000Z</published>
    <summary>也许是2025年总结（负能量致歉！）</summary>
    <title>Hello,2026</title>
    <updated>2025-12-31T17:31:49.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="复习笔记" scheme="https://watermelonabc.top/categories/%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="FZU" scheme="https://watermelonabc.top/tags/FZU/"/>
    <content>
      <![CDATA[<h2 id="LightSummary"><a class="header-anchor" href="#LightSummary"></a>LightSummary</h2><h3 id="基础数据结构"><a class="header-anchor" href="#基础数据结构"></a>基础数据结构</h3><p>数组 (Array) 占据一块连续的内存，索引和遍历速度快 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span>)，但其他操作就慢了（插入、删除的时间复杂度是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span>），大小也不能伸缩</p><p>动态数组 (Dynamic Array) 可以随着数据量的增加而扩展（但理论上不能缩小），C++ 的 <code>vector&lt;T&gt;</code> 实现了这个数据结构。但是插入和删除依然很慢。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>可以参照一般数组使用，因此在使用下标访问时，请确保 <code>vector</code> 已经分配内存。圆括号用于指定空间大小，如果需要追加数据，请使用 <code>push_back()</code> 方法。</p></div></div><p>链表 (linked List) 基于节点 (node) 组成，在内存中一般不连续，C++ 的 <code>list&lt;T&gt;</code> 实现了这个数据结构（双向链表）。链表可以在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span> 复杂度下实现插入和删除操作，但访问操作又退化到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>n</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord mathnormal">n</span><span class="mclose">)</span></span></span></span> 了，所以很多时候也挺慢 😦</p><figure class="highlight cpp"><figcaption><span>双向链表的定义</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">struct</span> <span class="title class_">Node</span></span><br><span class="line">{</span><br><span class="line"><span class="type">int</span> data;</span><br><span class="line">Node* pNext;</span><br><span class="line">Node* pPrev;</span><br><span class="line">};</span><br></pre></td></tr></tbody></table></figure><p>数组的下标只能是非负整数，而散列表 (Hash Table) 可以以任意标识访问元素，因为它是键值对 (key-value pair) 组成的。散列表的查询、插入和删除速度都很快 (理论上是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span></span>)。C++ 的 <code>unordered_map&lt;T, P&gt;</code> 和 <code>unordered_set&lt;T&gt;</code> 实现了这个数据结构。两者的不同在于 <code>map</code> 有键值对，是标准的散列表；而 <code>set</code> 没有，更像数学中的 “集合” 概念（既然是集合，那么 <code>set</code> 中的元素都是<strong>不重复</strong>的）。</p><blockquote><p>注意到 “unordered” 了吗？散列表是不能排序的</p></blockquote><p>先考虑最简单的情况，仅用一个数组来实现哈希表。在哈希表中，我们将数组中的每个空位称为桶 (bucket)，每个桶可存储一个键值对。因此，查询操作就是找到 <code>key</code> 对应的桶，并在桶中获取 <code>value</code>。</p><p>如何基于 <code>key</code> 定位对应的桶呢？这是通过散列函数 (hash function) 实现的。换句话说，我们通过散列函数为每个 <code>key</code> 分配（唯一的）桶位。</p><figure class="highlight cpp"><figcaption><span>一个简单的散列函数</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">size_t</span> <span class="title">hash</span><span class="params">(<span class="type">int</span> key)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="keyword">return</span> key % n; <span class="comment">// n 为桶的数量</span></span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><blockquote><p>散列函数本身也是有运行成本的！</p></blockquote><p>使用上面的散列函数，我们很快遇到一个问题：有好几个 <code>key</code> 指向同一个桶位！我们称之为散列冲突 (Hash Collision)。</p><p>散列冲突的一个解决方法是链式地址 (separate chaining)。我们将冲突的键值对通过链表（有时也用 <code>vector&lt;T&gt;</code>）连接起来，输入 <code>key</code> 后先遍历桶，再遍历桶下的冲突链。</p><hr><p>队列 (Queue) 和栈 (Stack) 都是关于 <code>push</code>（推入）和 <code>pop</code>（弹出）的数组 / 队列，区别在于队列是先进先出 (FIFO) 的，栈是后进先出 (LIFO) 的。C++ 分别用 <code>queue&lt;T&gt;</code> 和 <code>stack&lt;T&gt;</code> 实现</p><p>二叉树 (Binary Tree) 是一个树状数据结构，用于快速搜索、插入和删除。它经常作为散列表的替代，速度稍慢 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>O</mi><mo stretchy="false">(</mo><mi>log</mi><mo>⁡</mo><mi>N</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">O(\log{N})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="mopen">(</span><span class="mop">lo<span style="margin-right:0.0139em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">N</span></span><span class="mclose">)</span></span></span></span>)，但使用时是排序好的</p><p>堆 (Heap) 是一种二叉树的特例，用数组实现，常用于优先队列 (priority queue)</p><h2 id="实践部分"><a class="header-anchor" href="#实践部分"></a>实践部分</h2><p>有些算法和数据结构可以直接用标准库的，毕竟这篇是 “功利性质” 的，就没有重复造轮子的必要了。</p><p>注意 “数据保证 XX”，这说明我们不需要考虑判断输入的数据是否符合 XX 条件，因为已经保证它符合这个 XX 条件了（系统不会在酒吧里点炒饭的）</p><p>考 FZU DS <strong>原题</strong>，分为栈、队列、排序、二叉搜索树以及图和路径</p><p>CPP “万能” 文件头：<code>&lt;bits/stdc++.h&gt;</code></p><p>下面是 DS 题目与配套的 AC 代码（感谢 LuminaryDawn 整理提供 😃）</p><p>另附 <code>.pbs</code> 文件，你可以导入小熊猫 C++ 实现本地自动判题：<a href="https://watermelonabc.top/asset/FZU_DS.pbs">FZU DS.pbs</a></p><blockquote><p>如果你想 “背诵”，建议背关键算法的描述，除非你认为自己真的能像背课文那样把一行行代码背下来</p></blockquote><blockquote><p>实际考试为了降低难度，较简单题的分数是比较高的。<br>注意 PTA 的补全提示很少，复习时不要依赖 IDE 的补全<br>如果想通过，总分应该在 50 分以上</p></blockquote><h2 id="表"><a class="header-anchor" href="#表"></a>表</h2><h3 id="亚克星上的军队"><a class="header-anchor" href="#亚克星上的军队"></a>亚克星上的军队</h3><p><strong>★实验任务</strong></p><p>亚克星上住着许多神奇的生物。其中有聪慧的人族、优雅的精灵、彪悍的野蛮猪、粗鲁的首任驻….有一天，住在湛蓝球上的恶魔们突破空间的封锁入侵这个美丽的星球。为了保卫共同的家园，亚克星各族不得不摒弃前嫌，组成联盟。为了更有利的反击恶魔们的入侵，他们建立了统一的军事指挥中心。在前期，指挥中心会不停的发布军队调动命令，可是，麻烦来了。为了更好的做出决策，指挥中心必须迅速了解己方的各地区的军事力量详情。你能否帮帮这些可怜的种族呢？</p><p>每个地区有一个编号（从 1 到 N），如果一个地区有军队的话，这些军队将组成一个军团。指挥中心将发布的命令如下：</p><p><code>U a b</code>:将 b 地区军团的调到 a 地区，从而组成一个新的军团。为了便于管理，每次新加入的军队将按顺序加入到 a 军团后面。数据保证 a 与 b 不相同。</p><p><code>I a x</code>:将一支人数为 x 的军队调到 a 地区。为了便于管理，每次新加入的军队将加入到 a 军团前面。</p><p><code>D a x</code>:将 a 地区中军队人数为 x 的调走。若不存在，则不执行。</p><p><code>Q a</code>：询问 a 地区的具体军事信息（即按顺序输出该军团中每个军队的人数）。</p><p><strong>★数据输入</strong></p><p>输入第一行为两个正整数 N ,M (2 &lt;= N,M &lt;= 1000)。</p><p>接下来 N 行，每行第一个数 K 表示该地区军队的个数 K (1&lt;=K&lt;=100)，接下来 K 个数, 表示各个军队的人数信息 (0&lt;=a_i&lt;2^31)。</p><p>接下来 M 行，每行一个操作。</p><p><strong>★数据输出</strong></p><p>对于每个询问操作，输出一行表示 a 地区具体军事信息，每两个数之间空格隔开，行末无空格。若 a 内无元素，输出 -1。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">typedef</span> <span class="type">long</span> <span class="type">long</span> ll;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="comment">// 基于流的 I/O 优化</span></span><br><span class="line"><span class="comment">// std::cin.tie(nullptr); // 解除关联</span></span><br><span class="line"><span class="comment">// std::ios::sync_with_stdio(false); // 关闭同步</span></span><br><span class="line"></span><br><span class="line">ll n,m; <span class="comment">// n: 区域数；m: 操作数</span></span><br><span class="line">cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line"></span><br><span class="line">vector&lt;list&lt;ll&gt;&gt; <span class="built_in">listt</span>(n); <span class="comment">// 存储各区域的军事信息</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (ll i = <span class="number">0</span>; i &lt; n; i++) {</span><br><span class="line">ll t;</span><br><span class="line">cin &gt;&gt; t; <span class="comment">// t: 军队个数</span></span><br><span class="line"><span class="keyword">for</span> (ll j = <span class="number">0</span>; j &lt; t; j++) {</span><br><span class="line">ll temp;</span><br><span class="line">cin &gt;&gt; temp; <span class="comment">// temp: 各军队人数</span></span><br><span class="line">listt[i].<span class="built_in">push_back</span>(temp);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (ll i = <span class="number">0</span>; i &lt; m; i++) {</span><br><span class="line"><span class="type">char</span> type;</span><br><span class="line">cin &gt;&gt; type;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (type == <span class="string">'U'</span>) {</span><br><span class="line">ll a,b;</span><br><span class="line">cin &gt;&gt; a &gt;&gt; b;</span><br><span class="line">a--;</span><br><span class="line">b--; <span class="comment">// 编号从 1 到 N，减 1 和数组下标对齐</span></span><br><span class="line">listt[a].<span class="built_in">splice</span>(listt[a].<span class="built_in">end</span>(), listt[b]); <span class="comment">// splice(a, b) 将 b 的内容转移到 this*，位置为 a</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (type == <span class="string">'I'</span>) {</span><br><span class="line">ll a,x;</span><br><span class="line">cin &gt;&gt; a &gt;&gt; x;</span><br><span class="line">a--;</span><br><span class="line">listt[a].<span class="built_in">push_front</span>(x); <span class="comment">// list 的向前插入</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (type == <span class="string">'D'</span>) {</span><br><span class="line">ll a,x;</span><br><span class="line">cin &gt;&gt; a &gt;&gt; x;</span><br><span class="line">a--;</span><br><span class="line">listt[a].<span class="built_in">remove</span>(x); <span class="comment">// remove() 移除符合特定条件的元素</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (type == <span class="string">'Q'</span>) {</span><br><span class="line">ll y;</span><br><span class="line">cin &gt;&gt; y;</span><br><span class="line">y--;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (listt[y].<span class="built_in">empty</span>()) {</span><br><span class="line">cout &lt;&lt; <span class="string">"-1\n"</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> {</span><br><span class="line"><span class="type">bool</span> first = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">auto</span> j : listt[y]) {</span><br><span class="line"><span class="keyword">if</span> (!first) cout &lt;&lt; <span class="string">" "</span>;</span><br><span class="line">cout &lt;&lt; j;</span><br><span class="line">first = <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line">cout &lt;&lt; <span class="string">"\n"</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><h3 id="洗盘子"><a class="header-anchor" href="#洗盘子"></a>洗盘子</h3><p><strong>★实验任务</strong></p><p>猪妈妈有很多小猪仔，每次吃完饭洗盘子是一个很大的问题。这天猪妈妈想出了一个方法。她让小猪们排成一队，从 2 开始给他们编号。每次排在最前面的不用洗盘子（假设它的编号是 i ），但是，排在它后面的第 i 只 ，2 <em>i 只，3</em> i 只… 的小猪要洗盘子。让排在最前面以及要洗盘子的小猪出队，然后重复上述过程。那些不用洗盘子的小猪被称为幸运猪（lucky pigs），把它们的编号从小到大排序，现在要问第 n 个幸运猪的编号是多少。</p><p>比如说一开始，在最前面的小猪编号是 2，那么它不用洗盘子，出队。在它后面的第 2 只小猪，就是编号为 4 的小猪要洗盘子，编号为 6, 8, 10… 的小猪都要洗盘子，然后它们都出队。其中编号为 2 的小猪就是第一只幸运猪了。接下排在最前面的小猪编号是 3，它是幸运猪，出队。在它后面的第 3 只，就是编号为 9 的小猪要洗盘子，出队。以此类推。</p><p><strong>★数据输入</strong></p><p>输入第一行为 T ，代表接下去有 T 个询问， 0 &lt; T &lt;=300</p><p>接下去有 T 行，每行一个数 n ，0 &lt; n &lt;=3000</p><p><strong>★数据输出</strong></p><p>对于每个询问输出一行，为第 n 个幸运猪的编号。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="type">int</span> T;</span><br><span class="line">cin &gt;&gt; T;</span><br><span class="line"></span><br><span class="line">vector&lt;<span class="type">int</span>&gt; luckyPigs;</span><br><span class="line">vector&lt;<span class="type">int</span>&gt; pigs;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">2</span>; i &lt;= <span class="number">100000</span>; i++) {</span><br><span class="line">pigs.<span class="built_in">push_back</span>(i); <span class="comment">// 初始化猪仔编号向量</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (luckyPigs.<span class="built_in">size</span>() &lt; <span class="number">3000</span> &amp;&amp; !pigs.<span class="built_in">empty</span>()) { <span class="comment">// 限制求解规模</span></span><br><span class="line"><span class="type">int</span> lucky = pigs[<span class="number">0</span>]; <span class="comment">// 每次排在最前面的不用洗盘子</span></span><br><span class="line">luckyPigs.<span class="built_in">push_back</span>(lucky); <span class="comment">// 编号推入 luckyPigs 向量</span></span><br><span class="line"></span><br><span class="line">vector&lt;<span class="type">int</span>&gt; keep; <span class="comment">// 没被叫去洗盘子</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">1</span>; j &lt; pigs.<span class="built_in">size</span>(); j++) {</span><br><span class="line"><span class="keyword">if</span> ((j % lucky) != <span class="number">0</span>) {</span><br><span class="line">keep.<span class="built_in">push_back</span>(pigs[j]);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">pigs = keep;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> (T--) {</span><br><span class="line"><span class="type">int</span> n;</span><br><span class="line">cin &gt;&gt; n;</span><br><span class="line">cout &lt;&lt; luckyPigs[n - <span class="number">1</span>] &lt;&lt; endl;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><h2 id="队列"><a class="header-anchor" href="#队列"></a>队列</h2><h3 id="Rescue-the-princess"><a class="header-anchor" href="#Rescue-the-princess"></a>Rescue the princess</h3><p><strong>★实验任务</strong></p><p>有一天，公主被一个魔王抓走关在一个城堡里面，城堡可以用 <code>N * M</code> 的矩阵来描述，<code>1 &lt; N, M &lt;= 200</code>。监狱由 <code>N * M</code> 个方格组成，每个方格中可能为墙壁，空地，怪物，公主或者是勇士。</p><p>现在勇士想去营救公主。他的任务是找到公主。约定，“找到公主” 的意思是到达公主被关的位置。如果勇士想到达某个方格，但方格中有怪物，那么必须杀死怪物，才能到达这个方格。假设勇士只能向上，下，左，右四个方向移动一步。移动一步的需要花费 1 个单位的时间，杀死怪物也需要一个单位的时间。</p><p>试着计算勇士找到公主需要多长时间。只能上，下，左，右移动，而且墙壁不能通过。</p><p><strong>★数据输入</strong></p><p>输入第一行包含 2 个整数 N，M，接下来 N 行，每行 M 个字符：<code>.</code> 代表空地，<code>a</code>” 表示公主，<code>r</code> 表示勇士， <code>#</code> 代表墙壁， <code>x</code> 表示怪物。（测试数据中 <code>a</code> 和 <code>r</code> 只有一个）。</p><p><strong>★数据输出</strong></p><p>输出一个整数，表示找到公主所需要最短的时间。如果无法找到公主，输出 -1。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">Node</span> {</span><br><span class="line"><span class="type">int</span> x, y, time;</span><br><span class="line"><span class="comment">// 重载大于运算符，比较两个 Node 等价于比较两个 Node.time</span></span><br><span class="line"><span class="type">bool</span> <span class="keyword">operator</span>&gt;(<span class="type">const</span> Node&amp; other) <span class="type">const</span> {</span><br><span class="line"><span class="keyword">return</span> time &gt; other.time;</span><br><span class="line">}</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="type">int</span> n, m;</span><br><span class="line">cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line"><span class="function">vector&lt;string&gt; <span class="title">grid</span><span class="params">(n)</span></span>;</span><br><span class="line"><span class="type">int</span> start_x=<span class="number">-1</span>, start_y =<span class="number">-1</span>, end_x=<span class="number">-1</span>, end_y=<span class="number">-1</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 读入地图，初始化坐标</span></span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt; n;i++){</span><br><span class="line">cin &gt;&gt; grid[i];</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> j=<span class="number">0</span>;j&lt;m;j++){</span><br><span class="line"><span class="keyword">if</span>(grid[i][j] == <span class="string">'r'</span>){</span><br><span class="line">start_x = i;</span><br><span class="line">start_y = j;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span>(grid[i][j] == <span class="string">'a'</span>){</span><br><span class="line">end_x = i;</span><br><span class="line">end_y = j;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 方向向量，表示移动方式</span></span><br><span class="line"><span class="type">int</span> dx[<span class="number">4</span>] = {<span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">-1</span>}; <span class="comment">// 上：-1，下：1</span></span><br><span class="line"><span class="type">int</span> dy[<span class="number">4</span>] = {<span class="number">1</span>, <span class="number">-1</span>, <span class="number">0</span>, <span class="number">0</span>}; <span class="comment">// 左：-1，右：1</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 每个格子相对于起点的路径距离（时间成本），初始化为“无穷大”</span></span><br><span class="line">vector&lt;vector&lt;<span class="type">int</span>&gt;&gt; <span class="built_in">dist</span>(n, <span class="built_in">vector</span>&lt;<span class="type">int</span>&gt;(m, INT_MAX));</span><br><span class="line">dist[start_x][start_y] = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 定义最小堆，堆顶元素必定最小。great 表示大于队尾元素的插入元素进入队尾，否则插入队尾元素之前。最大堆用 less</span></span><br><span class="line">    <span class="comment">// 存储待探索的点，按距离升序排序</span></span><br><span class="line">priority_queue&lt;Node, vector&lt;Node&gt;, greater&lt;Node&gt;&gt; pq;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 起点作为第一个待探索点</span></span><br><span class="line">pq.<span class="built_in">push</span>({start_x, start_y, <span class="number">0</span>});</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span>(!pq.<span class="built_in">empty</span>())</span><br><span class="line">{</span><br><span class="line">Node curr = pq.<span class="built_in">top</span>(); <span class="comment">// 当前位置</span></span><br><span class="line">pq.<span class="built_in">pop</span>(); <span class="comment">// 将该点弹出待探索堆。之后此点不再探索</span></span><br><span class="line"><span class="type">int</span> x = curr.x;</span><br><span class="line"><span class="type">int</span> y = curr.y;</span><br><span class="line"><span class="type">int</span> time = curr.time;</span><br><span class="line">        <span class="comment">// 剪枝。这说明你是从较远路径来到这个点的，而根据我们的走法，已经有“人”探索接下来的路了，因此不要重复探索。</span></span><br><span class="line"><span class="keyword">if</span>(time &gt; dist[x][y]){</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line">}</span><br><span class="line"><span class="comment">// 向 4 个方向探索</span></span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">0</span>;i&lt;<span class="number">4</span>;i++){</span><br><span class="line"><span class="type">int</span> nx = x + dx[i];</span><br><span class="line"><span class="type">int</span> ny = y + dy[i];</span><br><span class="line"><span class="comment">// 探测边界和墙壁</span></span><br><span class="line"><span class="keyword">if</span>(nx &lt; <span class="number">0</span> || nx &gt;= n || ny &lt; <span class="number">0</span> || ny &gt; m || grid[nx][ny] == <span class="string">'#'</span>){</span><br><span class="line"><span class="keyword">continue</span>;</span><br><span class="line">}</span><br><span class="line"><span class="type">int</span> new_time = time + <span class="number">1</span>; <span class="comment">// 前进 1 步</span></span><br><span class="line"><span class="comment">// 遇怪增加时间</span></span><br><span class="line"><span class="keyword">if</span>(grid[nx][ny] == <span class="string">'x'</span>){</span><br><span class="line">new_time ++;</span><br><span class="line">}</span><br><span class="line"><span class="comment">// 如果找到更短路径，则更新路径距离</span></span><br><span class="line"><span class="keyword">if</span>(new_time &lt; dist[nx][ny]){</span><br><span class="line">dist[nx][ny] = new_time;</span><br><span class="line">pq.<span class="built_in">push</span>({nx, ny, new_time}); <span class="comment">// 把点推入待探索堆中</span></span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span>(dist[end_x][end_y] != INT_MAX){</span><br><span class="line">cout &lt;&lt; dist[end_x][end_y] &lt;&lt; <span class="string">"\n"</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line">cout &lt;&lt; <span class="string">"-1"</span> &lt;&lt; <span class="string">"\n"</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="交易"><a class="header-anchor" href="#交易"></a>交易</h3><blockquote><p>考了</p></blockquote><p><strong>★实验任务</strong></p><p>作为炉石传说的发牌员，你的任务就是发牌。从上到下有 n 张牌，编号 1~n。因为你和选手进行了一次 “交易”，所以当至少还剩两张牌时，发出最上面的牌，第二张牌放到最下面，重复这个过程直到只剩下一张牌。输出发牌的序列和最后剩下的牌。</p><p><strong>★数据输入</strong></p><p>第一行 1 个正整数 n (1=&lt;n&lt;1000)</p><p><strong>★数据输出</strong></p><p>输出一行为发牌的序列，一行为最后剩下的牌。两个数字之间用空格隔开，末尾没有空格。</p><p><strong>★Hint</strong></p><p>第一个样例 n=1, 只输出一行。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="type">int</span> n;</span><br><span class="line">cin &gt;&gt; n;</span><br><span class="line">queue&lt;<span class="type">int</span>&gt; card;</span><br><span class="line">    <span class="comment">// 初始化牌堆</span></span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;i++){</span><br><span class="line">card.<span class="built_in">push</span>(i);</span><br><span class="line">}</span><br><span class="line"><span class="type">bool</span> isFirst = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span>(!isFirst){</span><br><span class="line">cout &lt;&lt; <span class="string">" "</span>;</span><br><span class="line">}</span><br><span class="line">        <span class="comment">// 输出第一张牌</span></span><br><span class="line">cout &lt;&lt; card.<span class="built_in">front</span>();</span><br><span class="line">card.<span class="built_in">pop</span>();</span><br><span class="line">isFirst = <span class="literal">false</span>;</span><br><span class="line">        <span class="comment">// 第二张牌排到队尾</span></span><br><span class="line"><span class="keyword">if</span>(!card.<span class="built_in">empty</span>()){</span><br><span class="line"><span class="type">int</span> second = card.<span class="built_in">front</span>();</span><br><span class="line">card.<span class="built_in">pop</span>();</span><br><span class="line">card.<span class="built_in">push</span>(second);</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">while</span>(card.<span class="built_in">size</span>() &gt;= <span class="number">2</span>);</span><br><span class="line">cout &lt;&lt; endl;</span><br><span class="line"><span class="keyword">if</span>(!card.<span class="built_in">empty</span>()){</span><br><span class="line">cout &lt;&lt; card.<span class="built_in">front</span>();</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="栈"><a class="header-anchor" href="#栈"></a>栈</h2><h3 id="火车"><a class="header-anchor" href="#火车"></a>火车</h3><blockquote><p>考了</p></blockquote><p><strong>★实验任务</strong></p><p>TonyY 等火车无聊的时候，会去观察火车的排列，有一天他思考这么一个问题，火车总站的火车只能进站，要出站的话只能先出最后进站的那辆车，那么知道火车的进站顺序，能不能把它的出站顺序调整成火车站想要的呢？</p><p><strong>★数据输入</strong></p><p>输入第一行为一个正整数 n 表示火车辆数 (编号 1-n)（1&lt;=n&lt;=9）。</p><p>然后为两个长度为 n 的序列，表示火车的进站顺序和出站顺序。每辆火车刚好进出站各一次。</p><p><strong>★数据输出</strong></p><p>如果可以调整，输出 Yes 和出入站顺序。</p><p>如果不能，输出 No。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stack&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line"><span class="type">int</span> n;</span><br><span class="line">cin &gt;&gt; n;</span><br><span class="line"></span><br><span class="line">string in_seq, out_seq;</span><br><span class="line">cin &gt;&gt; in_seq &gt;&gt; out_seq;</span><br><span class="line"></span><br><span class="line">stack&lt;<span class="type">int</span>&gt; station;</span><br><span class="line"><span class="type">int</span> out_index = <span class="number">0</span>;  <span class="comment">// 当前应该出站的元素索引</span></span><br><span class="line"><span class="type">bool</span> possible = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 模拟过程判断是否可能，并记录操作序列</span></span><br><span class="line">string operations[<span class="number">20</span>]; <span class="comment">// 最多 2 * 9 = 18 次操作</span></span><br><span class="line"><span class="type">int</span> op_count = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) { <span class="comment">// 由于出入站是单行的，因此每列列车有且只有一次进站和出站操作</span></span><br><span class="line"><span class="comment">// 入站</span></span><br><span class="line">station.<span class="built_in">push</span>(in_seq[i] - <span class="string">'0'</span>);</span><br><span class="line">operations[op_count++] = <span class="string">"in"</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 检查能否出站，while 应对连续出站情况</span></span><br><span class="line"><span class="keyword">while</span> (!station.<span class="built_in">empty</span>() &amp;&amp; station.<span class="built_in">top</span>() == out_seq[out_index] - <span class="string">'0'</span>) {</span><br><span class="line">station.<span class="built_in">pop</span>();</span><br><span class="line">operations[op_count++] = <span class="string">"out"</span>;</span><br><span class="line">out_index++;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 检查是否所有元素都正确出栈</span></span><br><span class="line"><span class="keyword">if</span> (out_index != n) {</span><br><span class="line">possible = <span class="literal">false</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (possible) {</span><br><span class="line">cout &lt;&lt; <span class="string">"Yes"</span> &lt;&lt; endl;</span><br><span class="line"><span class="comment">// 输出缓存的操作序列</span></span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; op_count; i++) {</span><br><span class="line">cout &lt;&lt; operations[i] &lt;&lt; endl;</span><br><span class="line">}</span><br><span class="line">} <span class="keyword">else</span> {</span><br><span class="line">cout &lt;&lt; <span class="string">"No"</span> &lt;&lt; endl;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="价值"><a class="header-anchor" href="#价值"></a>价值</h3><p><strong>★实验任务</strong></p><p>K 神最近喜欢上了刷题，一天不刷浑身难受。最近他研究发现，自己的人生价值在于他某段时间内的刷题总数乘上这几天刷题数的最小值，现在 K 神很寂寞（无敌是多么寂寞），想知道他人生价值最高的时候究竟有多高（krz）</p><p><strong>★数据输入</strong></p><p>第一行为总天数 N (1&lt;=N&lt;=100000)</p><p>接下来一行 N 个整数 ai（1&lt;=ai&lt;=100000），表示 K 神第 i 天的刷题数。</p><p><strong>★数据输出</strong></p><p>输出 K 神在连续一段时间内可能的最高价值 W。</p><blockquote><p>对每个元素 <code>a[i]</code>，把它当作 “区间最小值”，看它能控制的最大区间，然后计算 <code>a[i] * (这个区间的元素和)</code>，取最大值。</p></blockquote><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span>{</span><br><span class="line"><span class="type">int</span> n;</span><br><span class="line">cin&gt;&gt;n;</span><br><span class="line"><span class="type">int</span> num=n<span class="number">+5</span>;</span><br><span class="line">vector&lt;<span class="type">int</span>&gt;<span class="built_in">a</span>(num), <span class="built_in">left</span>(num), <span class="built_in">right</span>(num);</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;i++){</span><br><span class="line">cin&gt;&gt;a[i];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 求前缀和，便于求区间和，例如区间 [a,b) 内的和为 sums[b-1] - sums[a]</span></span><br><span class="line">vector&lt;<span class="type">long</span> <span class="type">long</span>&gt;<span class="built_in">sums</span>(n<span class="number">+1</span>,<span class="number">0</span>);</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;i++){</span><br><span class="line">sums[i]=sums[i<span class="number">-1</span>]+a[i];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 求区间和就需要求上下边界</span></span><br><span class="line">    <span class="comment">// 将刷题数序列的每一个值都认为是属于某个区间的最小值，现在就是求最大的区间。</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// 使用单调栈排序下标</span></span><br><span class="line">stack&lt;<span class="type">int</span>&gt;st;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 左边界，从左到右选择</span></span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;i++){</span><br><span class="line">        <span class="comment">// 如果当前栈顶的元素不小于要插入的元素，则弹出栈顶元素。注意一定要带等号，不然会出错</span></span><br><span class="line"><span class="keyword">while</span>(!st.<span class="built_in">empty</span>() &amp;&amp; a[st.<span class="built_in">top</span>()]&gt;=a[i]){</span><br><span class="line">st.<span class="built_in">pop</span>();</span><br><span class="line">}</span><br><span class="line">left[i]=st.<span class="built_in">empty</span>()?<span class="number">0</span>:st.<span class="built_in">top</span>();</span><br><span class="line">st.<span class="built_in">push</span>(i);</span><br><span class="line">}</span><br><span class="line">    <span class="comment">// 清空栈</span></span><br><span class="line"><span class="keyword">while</span>(!st.<span class="built_in">empty</span>())</span><br><span class="line">st.<span class="built_in">pop</span>();</span><br><span class="line">    <span class="comment">// 右边界，从右到左选择</span></span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=n;i&gt;=<span class="number">1</span>;i--){</span><br><span class="line">        <span class="comment">// 如果当前栈顶的元素小于要插入的元素，则弹出栈顶元素</span></span><br><span class="line"><span class="keyword">while</span>(!st.<span class="built_in">empty</span>() &amp;&amp; a[st.<span class="built_in">top</span>()]&gt;a[i]){</span><br><span class="line">st.<span class="built_in">pop</span>();</span><br><span class="line">}</span><br><span class="line">right[i]=st.<span class="built_in">empty</span>()?(n<span class="number">+1</span>):st.<span class="built_in">top</span>();</span><br><span class="line">st.<span class="built_in">push</span>(i);</span><br><span class="line">}</span><br><span class="line"><span class="type">long</span> <span class="type">long</span> maxx=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;i++){</span><br><span class="line"><span class="type">long</span> <span class="type">long</span> sum=sums[right[i]<span class="number">-1</span>]-sums[left[i]];</span><br><span class="line"><span class="type">long</span> <span class="type">long</span> cur=a[i]*sum;</span><br><span class="line">maxx=<span class="built_in">max</span>(maxx, cur);</span><br><span class="line">}</span><br><span class="line">cout&lt;&lt;maxx&lt;&lt;endl;</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="排序与选择"><a class="header-anchor" href="#排序与选择"></a>排序与选择</h2><h3 id="魔音吉他"><a class="header-anchor" href="#魔音吉他"></a>魔音吉他</h3><blockquote><p>考了</p></blockquote><p><strong>★问题描述</strong></p><p>少年甲很喜欢音乐，有一天他来到了少年乙的村落。少年甲一曲高山流水，寻觅到了乙这位知音。然而，天下没有不散的宴席，少年甲要回村杀猪了，离别在即，少年乙拿出了自己珍藏多年的吉他，作为离别的礼物。就在少年甲欣喜之际，少年乙说，这把吉他变幻莫测，每次你拿起它的时候，它会有 n 根弦，每根弦可以演奏出<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn> 10</mn><mn>18</mn></msup><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">10^{18}+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">18</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 个音符，而这<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn> 10</mn><mn>18</mn></msup><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">10^{18}+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">18</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 个音符是连续的，取决于它每根弦的第一个音符（请看样例说明）。<br>此时，少年甲提出了一个疑问，如果给定一个区间 l，r（包括端点），里面共有几种不同的音符呢？少年乙对此谙熟于心，但是他想考验一下你，于是将这个问题抛给了你。</p><p><strong>★数据输入</strong></p><p>第一行一个正整数 n (1&lt;=n&lt;=100,000)，表示吉他有几根弦。<br>第二行共 n 个数 x，即代表对应弦的第一个音符 (0&lt;=x&lt;=<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>10</mn><mn>18</mn></msup></mrow><annotation encoding="application/x-tex">10^{18}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8141em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">18</span></span></span></span></span></span></span></span></span></span></span></span>)。<br>第三行一个正整数 q (1&lt;=q&lt;=100,000)，表示少年甲的询问次数。<br>接下来 q 行，每行两个数 l，r (0&lt;=l, r&lt;=<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>10</mn><mn>18</mn></msup><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">10^{18}+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mord"><span class="mord">0</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">18</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>)，表示少年甲想要询问的区间。</p><p><strong>★数据输出</strong></p><p>输出共 q 个数，表示对应 q 个询问的答案。即询问区间内有多少个不同的音符。以空格隔开。</p><p><strong>★样例说明</strong></p><p>对应弦的第一个音符：3 1 4 1 5 9</p><p>列下标：0 1 2 3 4 5 ……<br>弦一： 3 4 5 6 7 8 ……<br>弦二： 1 2 3 4 5 6 ……<br>弦三： 4 5 6 7 8 9 ……<br>弦四： 1 2 3 4 5 6 ……<br>弦五： 5 6 7 8 9 10 ……<br>弦六： 9 10 11 12 13 14 ……</p><p>在第一根弦（最低音为 1）遇到的音符为 1、2、3，一共 3 个新音符。<br>在第二根弦（最低音为 3）遇到的音符为 3、4、5，一共 2 个新音符。<br>在第三根弦（最低音为 4）遇到的音符为 4、5、6，一共 1 个新音符。<br>在第四根弦（最低音为 5）遇到的音符为 5、6、7，一共 1 个新音符。<br>在第五根弦（最低音为 9）遇到的音符为 9、10、11，一共 3 个新音符。<br>区间 [0,2] 内有 1、2、3、4、5、6、7、9、10、11，共 10 个不同的音符。</p><p><strong>★Hint</strong></p><p>（1）询问区间 l，r 即为样例说明中的列下标。<br>（2）所谓不同音符个数，即区间 l，r 内 n 行内不同的数字个数。<br>（3）由于 l，r 的范围巨大，请思考其与每行第一个数字的关系（即给出的第一个音符）。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 由“样例说明”可知，从第二根弦开始每根弦遇到的新音符数量受其与上一跟弦的差值影响即 a[i] - a[i-1]（比如 a[2] - a[1] = 3 - 1 =2, a[3] - a[2] = 4 - 3 = 1)，但如果其差值大于询问的区间长度 (r-l+1)，其增长的值就为其区间范围的值</span></span><br><span class="line"><span class="comment">// 则总的音符数为基弦的音符数（区间长度）+ 后面弦的新增音符数</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    cin &gt;&gt; n;</span><br><span class="line">    <span class="function">vector&lt;<span class="type">long</span> <span class="type">long</span>&gt; <span class="title">first</span><span class="params">(n)</span></span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) {</span><br><span class="line">        cin &gt;&gt; first[i];</span><br><span class="line">    }</span><br><span class="line">    <span class="comment">//把弦的起始音符排个序</span></span><br><span class="line">    <span class="built_in">sort</span>(first.<span class="built_in">begin</span>(), first.<span class="built_in">end</span>());</span><br><span class="line">    <span class="comment">//求出相邻弦之间的差值</span></span><br><span class="line">    vector&lt;<span class="type">long</span> <span class="type">long</span>&gt; diff;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt; n; i++) {</span><br><span class="line">        diff.<span class="built_in">push_back</span>(first[i] - first[i - <span class="number">1</span>]);</span><br><span class="line">    }</span><br><span class="line">    <span class="built_in">sort</span>(diff.<span class="built_in">begin</span>(), diff.<span class="built_in">end</span>());</span><br><span class="line">    <span class="comment">//计算前缀和（为了后面快速求和）</span></span><br><span class="line">    <span class="function">vector&lt;<span class="type">long</span> <span class="type">long</span>&gt; <span class="title">pre</span><span class="params">(diff.size() + <span class="number">1</span>, <span class="number">0</span>)</span></span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; (<span class="type">int</span>)diff.<span class="built_in">size</span>(); i++) {</span><br><span class="line">        pre[i + <span class="number">1</span>] = pre[i] + diff[i];</span><br><span class="line">    }</span><br><span class="line">    <span class="type">int</span> q;</span><br><span class="line">    cin &gt;&gt; q;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> t = <span class="number">0</span>; t &lt; q; t++) {</span><br><span class="line">        <span class="type">long</span> <span class="type">long</span> l, r;</span><br><span class="line">        cin &gt;&gt; l &gt;&gt; r;</span><br><span class="line">        <span class="comment">// 区间长度（包括两端）</span></span><br><span class="line">        <span class="type">long</span> <span class="type">long</span> len = (r &gt;= l) ? (r - l + <span class="number">1</span>) : <span class="number">0</span>;</span><br><span class="line">        <span class="comment">// 找出 &lt;= len 的差值数量</span></span><br><span class="line">        <span class="type">int</span> k=<span class="built_in">upper_bound</span>(diff.<span class="built_in">begin</span>(),diff.<span class="built_in">end</span>(),len)-diff.<span class="built_in">begin</span>();</span><br><span class="line">        <span class="comment">// 计算 sum(min(len, diff[i]))</span></span><br><span class="line">        <span class="type">long</span> <span class="type">long</span> summin = pre[k] + (<span class="type">long</span> <span class="type">long</span>)(diff.<span class="built_in">size</span>() - k) * len;</span><br><span class="line">        <span class="comment">// 最终结果（音符总数）</span></span><br><span class="line">        <span class="type">long</span> <span class="type">long</span> ans = len + summin;</span><br><span class="line">        cout &lt;&lt; ans; <span class="comment">// 输出</span></span><br><span class="line">        <span class="keyword">if</span> (t != q - <span class="number">1</span>) cout &lt;&lt; <span class="string">" "</span>;</span><br><span class="line">    }</span><br><span class="line">    cout &lt;&lt; endl;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="Just-Sort"><a class="header-anchor" href="#Just-Sort"></a>Just Sort</h3><p><strong>★实验任务</strong></p><p>给定两个序列 a, b，序列 a 原先是一个单调递增的正数序列，但是由于某些原因，使得序列乱序了，并且一些数丢失了（用 0 表示）。经过数据恢复后，找到了正数序列 b ，且序列 a 中 0 的个数等于序列 b 的个数，打算使用序列 b 恢复序列 a。</p><p>对于序列 a 来说，我们可以交换两个位置上的非零的数，并且可以交换任意次。序列 b 同样也可以进行任意次交换。</p><p>现在要将序列 b 填充到序列 a 中的值丢失的位置上，序列 b 中的每个数只能填充一次，问最后构成的序列是否是单调递增的，如果是，则输出填充后的序列，否则输出 -1。</p><p><strong>★数据输入</strong></p><p>输入给定 N, M，表示序列 a 和序列 b 的长度。</p><p>第一行为序列 a，第二行为序列 b。题目保证除了 0 以外的数，在序列 a 和 b 中只出现一次。</p><p>数据保证:</p><p>80% 的数据，N, M &lt;= 100</p><p>100% 的数据，N, M &lt;= 100000, 0 &lt;= a [i] &lt;= 100000, 0 &lt; b [i] &lt;= 100000</p><p><strong>★数据输出</strong></p><p>如果最后序列 a 是单调递增的，输出该序列，否则输出 -1。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N = <span class="number">1e5</span> + <span class="number">10</span>;</span><br><span class="line"><span class="type">int</span> a[N], b[N], c[N], vis[N];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">solve</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="type">int</span> n, m;</span><br><span class="line">cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line"><span class="type">int</span> idx = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;i++){</span><br><span class="line"><span class="type">int</span> x;</span><br><span class="line">cin &gt;&gt; x;</span><br><span class="line"><span class="keyword">if</span>(x==<span class="number">0</span>){</span><br><span class="line">vis[i] = <span class="number">1</span>; <span class="comment">// 标记序列 a 中缺失元素的位置</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line">a[++idx] = x; <span class="comment">// 收集 a 中非 0 的数</span></span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i = <span class="number">1</span>; i &lt;= m; i++)</span><br><span class="line">{</span><br><span class="line">cin &gt;&gt; b[i];</span><br><span class="line">}</span><br><span class="line">    <span class="comment">// 允许任意交换意味着原始位置已经不重要了，只剩下“数的集合”重要</span></span><br><span class="line">    <span class="comment">// 问题变成：能否把“a 的非零数和 b 中的数”重新排列，按原位置规则放回（形成新序列），使整个序列严格递增？</span></span><br><span class="line"><span class="built_in">sort</span>(a + <span class="number">1</span>, a + idx + <span class="number">1</span>); <span class="comment">// std::sort(container.begin(), container.end());</span></span><br><span class="line"><span class="built_in">sort</span>(b + <span class="number">1</span>, b + m + <span class="number">1</span>);</span><br><span class="line"><span class="type">int</span> idx1 = <span class="number">0</span>, idx2 = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;i++){</span><br><span class="line"><span class="keyword">if</span>(vis[i]){</span><br><span class="line">c[i] = b[++idx1]; <span class="comment">// 如果此位置是 a 中缺失的元素位置，那么用序列 b 填充</span></span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line">c[i] = a[++idx2]; <span class="comment">// 如果没缺失，则用 a 中原本没缺失的元素填充</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(i &gt; <span class="number">1</span>){</span><br><span class="line">            <span class="comment">// 发现填充违规，说明当前最小可用的数都不够大，而换用更大的数会把这个较小数留给后面更大的数，更难实现递增</span></span><br><span class="line"><span class="keyword">if</span>(c[i] &lt;= c[i - <span class="number">1</span>]){</span><br><span class="line">cout &lt;&lt; <span class="string">"-1"</span> &lt;&lt; <span class="string">"\n"</span>;</span><br><span class="line"><span class="keyword">return</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">for</span>(<span class="type">int</span> i=<span class="number">1</span>;i&lt;=n;i++){</span><br><span class="line"><span class="keyword">if</span>(i != <span class="number">1</span>){</span><br><span class="line">cout &lt;&lt; <span class="string">" "</span>;</span><br><span class="line">}</span><br><span class="line">cout &lt;&lt; c[i];</span><br><span class="line">}</span><br><span class="line">cout &lt;&lt; <span class="string">"\n"</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="built_in">solve</span>();</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="树"><a class="header-anchor" href="#树"></a>树</h2><h3 id="文件管理器"><a class="header-anchor" href="#文件管理器"></a>文件管理器</h3><blockquote><p>好难 QAQ</p></blockquote><p><strong>背景</strong></p><p>操作系统具有对计算机硬件资源管理和调度的功能。文件是对占用了硬盘一定空间的对象的描述和抽象。考虑一般的文件具有文件名、大小和创建时间。文件管理在任何操作系统中都是必不可少的。文件管理器是用户用来观察和操作文件的一个软件。考虑一个简易的文件管理器，用户可以通过这个简易的文件管理器对某个目录下文件最大/小、文件名 (字符串) 字典序最大/最小的一些文件，即按 XX 排序功能，此外文件管理器具有删除和添加文件的功能。输入保证目录只有一级，操作随机。</p><p><strong>输入及输出格式</strong></p><p>第 1 行输入一个 Q (1&lt;=Q&lt;=100000)，表示操作的次数。</p><p>第 2-Q+1 行输入一行操作序列</p><p>操作序列的格式为 <code>op args</code></p><p>当 op=1, 即第一种操作时，args 的格式为 <code>folder name size</code>，表示将要在某个 folder 目录 (1&lt;=folder&lt;=5 的整数) 下添加文件名为 name (1&lt;=name&lt;=100000 的整数) 的文件，文件大小为 size (1&lt;=size&lt;=100000 的整数)，如果文件名重复，就先删除原来的文件再进行 1 操作；</p><p>当 op=2, 即第二种操作时，args 的格式为 <code>folder name</code>，表示将要在某个 folder 目录 (1&lt;=folder&lt;=5 的整数) 下删除文件名为 name (1&lt;=name&lt;=100000 的整数) 的文件，如果文件名不存在，操作不执行；</p><p>当 op=3, 即第三种操作时，args 的格式为 <code>folder k</code>，表示输出某个目录下文件大小最大至第 k 大的文件名，如果大小相同按文件名数字从小到大输出，如果不满 k 个文件只需要输出已有的文件名，如果文件夹为空或不存在则输出一个空行；</p><p>当 op=4, 即第四种操作时，args 的格式为 <code>folder k</code>，表示输出某个目录下文件名数字大小最小至第 k 小的文件名，如果不满 k 个文件只需要输出已有的文件名，如果文件夹为空或不存在则输出一个空行；</p><p>保证 1&lt;= k &lt;=10</p><p><strong>备注</strong></p><p>输出文件名以空格隔开，不输出多余的换行和空格</p><p><strong>样例说明</strong></p><p>样例输出为 8 个空行</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">node</span>{</span><br><span class="line"><span class="type">int</span> name,size;</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">cmp</span>{</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">bool</span> <span class="title">operator</span><span class="params">()</span><span class="params">(<span class="type">const</span> node&amp;x,<span class="type">const</span> node&amp;y)</span><span class="type">const</span></span>{</span><br><span class="line"><span class="keyword">if</span>(x.size!=y.size){</span><br><span class="line"><span class="keyword">return</span> x.size&gt;y.size;</span><br><span class="line">}<span class="keyword">else</span>{</span><br><span class="line"><span class="keyword">return</span> x.name&lt;y.name;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line">map&lt;<span class="type">int</span>,<span class="type">int</span>&gt;folder[<span class="number">7</span>];</span><br><span class="line">set&lt;node,cmp&gt;s1[<span class="number">7</span>];</span><br><span class="line"><span class="comment">//set&lt;string&gt;s2[7];</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">solve</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line"><span class="type">int</span> op,idx,name,size,k;</span><br><span class="line"></span><br><span class="line">cin&gt;&gt;op&gt;&gt;idx;</span><br><span class="line"></span><br><span class="line"><span class="keyword">switch</span>(op){</span><br><span class="line"><span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">cin&gt;&gt;name&gt;&gt;size;</span><br><span class="line">node t;</span><br><span class="line">t.name=name,t.size=size;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(folder[idx].<span class="built_in">count</span>(name)){</span><br><span class="line">s1[idx].<span class="built_in">erase</span>(s1[idx].<span class="built_in">find</span>({name,folder[idx][name]}));</span><br><span class="line">}</span><br><span class="line"><span class="comment">/*else{</span></span><br><span class="line"><span class="comment">s2[idx].insert(to_string(name));</span></span><br><span class="line"><span class="comment">}*/</span></span><br><span class="line"></span><br><span class="line">s1[idx].<span class="built_in">insert</span>(t);</span><br><span class="line">folder[idx][name]=size;</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">cin&gt;&gt;name;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(folder[idx].<span class="built_in">count</span>(name)){</span><br><span class="line"><span class="keyword">auto</span> it=s1[idx].<span class="built_in">find</span>({name,folder[idx][name]});</span><br><span class="line"></span><br><span class="line">s1[idx].<span class="built_in">erase</span>(it);</span><br><span class="line"></span><br><span class="line"><span class="comment">//s2[idx].erase(to_string(name));</span></span><br><span class="line">folder[idx].<span class="built_in">erase</span>(name);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line">cin&gt;&gt;k;</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(!s1[idx].<span class="built_in">empty</span>()){</span><br><span class="line"><span class="type">int</span> cnt=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> el:s1[idx]){</span><br><span class="line"><span class="keyword">if</span>(cnt){</span><br><span class="line">cout&lt;&lt;<span class="string">' '</span>;</span><br><span class="line">}</span><br><span class="line">cout&lt;&lt;el.name;</span><br><span class="line">cnt++;</span><br><span class="line"><span class="keyword">if</span>(cnt==k){</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">cout&lt;&lt;<span class="string">'\n'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">case</span> <span class="number">4</span>:</span><br><span class="line">cin&gt;&gt;k;</span><br><span class="line"></span><br><span class="line"><span class="comment">/*if(!s2[idx].empty()){</span></span><br><span class="line"><span class="comment">int cnt=0;</span></span><br><span class="line"><span class="comment">for(auto el:s2[idx]){</span></span><br><span class="line"><span class="comment">if(cnt){</span></span><br><span class="line"><span class="comment">cout&lt;&lt;' ';</span></span><br><span class="line"><span class="comment">}</span></span><br><span class="line"><span class="comment">cout&lt;&lt;el;</span></span><br><span class="line"><span class="comment">cnt++;</span></span><br><span class="line"><span class="comment">if(cnt==k){</span></span><br><span class="line"><span class="comment">break;</span></span><br><span class="line"><span class="comment">}</span></span><br><span class="line"><span class="comment">}</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">}*/</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span>(!folder[idx].<span class="built_in">empty</span>()){</span><br><span class="line"><span class="type">int</span> cnt=<span class="number">0</span>;</span><br><span class="line"><span class="keyword">for</span>(<span class="keyword">auto</span> el : folder[idx]){</span><br><span class="line"><span class="keyword">if</span>(cnt){</span><br><span class="line">cout&lt;&lt;<span class="string">' '</span>;</span><br><span class="line">}</span><br><span class="line">cout&lt;&lt;el.first;</span><br><span class="line">cnt++;</span><br><span class="line"><span class="keyword">if</span>(cnt==k){</span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">cout&lt;&lt;<span class="string">'\n'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">break</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">ios::<span class="built_in">sync_with_stdio</span>(<span class="number">0</span>);</span><br><span class="line">cin.<span class="built_in">tie</span>(<span class="number">0</span>); cout.<span class="built_in">tie</span>(<span class="number">0</span>);</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> t=<span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">cin&gt;&gt;t;</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span>(t--){</span><br><span class="line"><span class="built_in">solve</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><h3 id="鼹鼠报数"><a class="header-anchor" href="#鼹鼠报数"></a>鼹鼠报数</h3><blockquote><p>考了</p></blockquote><p><strong>★实验任务</strong></p><p>Winder 养了一群会报数的鼹鼠，而且 Winder 喜欢用数字给他的鼹鼠们编号，如 “311”、“1048” 等。当然，为了不混淆，鼹鼠们的编号都是不同的。为了锻炼鼹鼠们的身体健康，Winder 决定让鼹鼠们进行掘土训练，顺便提高鼹鼠们的挖掘能力。<br>鼹鼠们排成一列，由第一个开始向下挖洞，并待在洞中。第二只与第一只相比，若编号值大的鼹鼠，则向右下方挖洞，否则向左下方。接下来的鼹鼠们以此类推，若比洞中所在鼹鼠编号值大，则向右下方走，否则向左下方。<br>训练结束后，Winder 会让他的鼹鼠们报数（既报出各自的编号）。通过报数的序列 Winder 想知道经过训练之后，鼹鼠们的位置是怎样的。<br>报数规则为：如果 A 鼹鼠的下方分别存在 ALeft 鼹鼠和 ARight 鼹鼠，则 ALeft 鼹鼠在 ARight 鼹鼠之前报数，ARight 鼹鼠在 A 鼹鼠之前报数。<br>位置表达式规则为：“根节点 &lt;左子树表达式&gt;&lt;右子树表达式&gt;”, 如左子树不存在, 则只输出 “根节点 &lt;右子树表达式&gt;”，右子树同理。</p><p><strong>★数据输入</strong></p><p>第一行为 N（2&lt;N&lt;=1000），表示有 N 只鼹鼠。<br>第二行为 N 个整数 bi（0&lt;bi&lt;10000），表示报数顺序。</p><p><strong>★数据输出</strong></p><p>输出鼹鼠们的位置表达式。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 报数过程就是二叉树的后序遍历</span></span><br><span class="line"><span class="comment">// 问题转化成：已知一棵 BST 的后序遍历序列，输出它的 “位置表达式”（先根 + 左右子树）</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> MAX = <span class="number">10000</span>;</span><br><span class="line"><span class="type">int</span> a[MAX], n;</span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dfs</span><span class="params">(<span class="type">int</span> * a, <span class="type">int</span> begin, <span class="type">int</span> end)</span> </span>{</span><br><span class="line"><span class="type">bool</span> l = <span class="number">1</span>;</span><br><span class="line"><span class="type">bool</span> r = <span class="number">1</span>;</span><br><span class="line">cout &lt;&lt; a[end]; <span class="comment">// 后序遍历的最后一个一定是根</span></span><br><span class="line"><span class="type">int</span> i = begin;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// [ begin ... i-1 ] &lt; root → 左子树</span></span><br><span class="line">    <span class="comment">// [ i ... end-1 ] &gt; root → 右子树</span></span><br><span class="line"><span class="keyword">while</span> (i &lt; end &amp;&amp; a[i]&lt;a[end]) {</span><br><span class="line">        i++;</span><br><span class="line">    }</span><br><span class="line"><span class="keyword">if</span> (i==begin) {</span><br><span class="line">        l=<span class="number">0</span>;</span><br><span class="line">    }</span><br><span class="line"><span class="keyword">if</span> (i==end) {</span><br><span class="line">        r=<span class="number">0</span>;</span><br><span class="line">    }</span><br><span class="line"><span class="keyword">if</span> (l) {</span><br><span class="line">cout &lt;&lt; <span class="string">"&lt;"</span>;</span><br><span class="line"><span class="built_in">dfs</span>(a, begin, i - <span class="number">1</span>);</span><br><span class="line">cout &lt;&lt; <span class="string">"&gt;"</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (r) {</span><br><span class="line">cout &lt;&lt; <span class="string">"&lt;"</span>;</span><br><span class="line"><span class="built_in">dfs</span>(a, i, end - <span class="number">1</span>);</span><br><span class="line">cout &lt;&lt; <span class="string">"&gt;"</span>;</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span> <span class="params">()</span> </span>{</span><br><span class="line">cin &gt;&gt; n;</span><br><span class="line"><span class="keyword">for</span> (<span class="type">int</span> i=<span class="number">1</span>; i&lt;=n; i++){</span><br><span class="line">        cin&gt;&gt;a[i];</span><br><span class="line">    }</span><br><span class="line"><span class="built_in">dfs</span>(a, <span class="number">1</span>, n);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="散列表"><a class="header-anchor" href="#散列表"></a>散列表</h2><h3 id="Sins-of-a-Solar-Empire-P7"><a class="header-anchor" href="#Sins-of-a-Solar-Empire-P7"></a>Sins of a Solar Empire P7</h3><p><strong>★实验任务</strong></p><p>正如你所知道 sins 是一个贪玩的不得了的小 P 孩（如果你非常讨厌他可以直接跳到第二段），你也知道他最近很喜欢玩一个叫做太阳帝国的原罪的策略游戏我向你保证这是太阳帝国原罪系列的第七章了。<br>现在 sins 拥护 N 个星球，每个星球 m 种不同的资源，每个资源都拥有一个编号 A，对于 sins 来说 N 个星球都有的资源才是最宝贵的，他想知道这样的资源有哪些？</p><p><strong>★数据输入</strong></p><p>第 1 行是正整数 N（1&lt;=N&lt;=1000）。<br>第 2~N+1 行各有一个正整数 m 和 m 个正整数编号 A (有重复)，（0&lt;m&lt;=1000, 0 &lt;= A &lt;=10^9）.</p><p><strong>★数据输出</strong></p><p>第一行一个整数 S，表示 N 个星球都拥有的资源个数。<br>如果 S 不等于 0 输出第二行，按照升序输出 S 个整数表示资源编号 (无重复)，资源编号之间有空格，结尾没有空格。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unordered_map&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unordered_set&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">    <span class="type">int</span> N;</span><br><span class="line">    cin &gt;&gt; N;</span><br><span class="line">    unordered_map&lt;<span class="type">int</span>, <span class="type">int</span>&gt; Count;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; N; ++i) {</span><br><span class="line">        <span class="type">int</span> m;</span><br><span class="line">        cin &gt;&gt; m;</span><br><span class="line">        unordered_set&lt;<span class="type">int</span>&gt; only;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; m; ++j) {</span><br><span class="line">            <span class="type">int</span> A;</span><br><span class="line">            cin &gt;&gt; A;</span><br><span class="line">            only.<span class="built_in">insert</span>(A);</span><br><span class="line">        }</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> res : only) {</span><br><span class="line">            Count[res]++;</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line">    vector&lt;<span class="type">int</span>&gt; common;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">const</span> <span class="keyword">auto</span>&amp; pair : Count) {</span><br><span class="line">        <span class="keyword">if</span> (pair.second == N) {</span><br><span class="line">            common.<span class="built_in">push_back</span>(pair.first);</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line">    <span class="built_in">sort</span>(common.<span class="built_in">begin</span>(), common.<span class="built_in">end</span>());</span><br><span class="line">    cout &lt;&lt; common.<span class="built_in">size</span>() &lt;&lt; endl;</span><br><span class="line">    <span class="keyword">if</span> (!common.<span class="built_in">empty</span>()) {</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; common.<span class="built_in">size</span>(); ++i) {</span><br><span class="line">            <span class="keyword">if</span> (i &gt; <span class="number">0</span>) {</span><br><span class="line">                cout &lt;&lt; <span class="string">" "</span>;</span><br><span class="line">            }</span><br><span class="line">            cout &lt;&lt; common[i];</span><br><span class="line">        }</span><br><span class="line">        cout &lt;&lt; endl;</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="特殊匹配R"><a class="header-anchor" href="#特殊匹配R"></a>特殊匹配 R</h3><p><strong>★实验任务</strong></p><p>定义一种语言 L，L 语言中所有的字符串只能由 abc 三个字母组成。<br>在语言 L 之上定义一种特殊匹配规则 R，R 的定义如下：假设有两个字符串 x 和 y，x 和 y 等长，且 x 与 y 有且只有一个位置上的字符不同。<br>例如字符串 x 为 “abc”：<br>（1）若字符串 y 为 ”abb”，这 x 与 y 符合 R 匹配；<br>（2）若 y 为 ”abc” 或 ”bbb” 或 ”abcc”，则 x 与 y 不符合 R 匹配。<br>现给定一个由 n 个 x 字符串构成的匹配表 r，然后进行 m 次询问。每次询问输入一个 y 字符串，然后判断 r 表中是否存在与 y 符合 R 匹配的 x 字符串，若有输出 ”YES”，否则输出 ”NO”。</p><p><strong>★数据输入</strong></p><p>输入中第一行给出一整数 n，m（1&lt;=n,m&lt;=1000）。<br>接下来 n 行给出 n 个 x 字符串。<br>接下来 m 行，每行输入一个 y 字符串进行询问。<br>题目保证每一个字符串的长度在 1000 以内。</p><p><strong>★数据输出</strong></p><p>对于 m 个询问，每个询问输出在 x 个字符串中是否有与 y 字符串符合 R 匹配的字符串，若有输出 ”YES”，否则输出 ”NO”。</p><p><strong>★提示</strong><br>60% 的数据 n&lt;=100,m&lt;=100<br>100% 的数据 n&lt;=1000,m&lt;=1000</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;string&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;unordered_set&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">    <span class="type">int</span> n, m;</span><br><span class="line">    cin &gt;&gt; n &gt;&gt; m;</span><br><span class="line">    unordered_set&lt;string&gt; x_set;</span><br><span class="line">    vector&lt;string&gt; x_list;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; n; i++) {</span><br><span class="line">        string x;</span><br><span class="line">        cin &gt;&gt; x;</span><br><span class="line">        x_set.<span class="built_in">insert</span>(x);</span><br><span class="line">        x_list.<span class="built_in">push_back</span>(x);</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; m; i++) {</span><br><span class="line">        string y;</span><br><span class="line">        cin &gt;&gt; y;</span><br><span class="line">        <span class="type">int</span> len = y.<span class="built_in">length</span>();</span><br><span class="line">        <span class="type">bool</span> found = <span class="literal">false</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">const</span> string&amp; x : x_list) {</span><br><span class="line">            <span class="keyword">if</span> (x.<span class="built_in">length</span>() != len) <span class="keyword">continue</span>;</span><br><span class="line">            <span class="type">int</span> diff_count = <span class="number">0</span>;</span><br><span class="line">            <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">0</span>; j &lt; len; j++) {</span><br><span class="line">                <span class="keyword">if</span> (x[j] != y[j]) {</span><br><span class="line">                    diff_count++;</span><br><span class="line">                    <span class="keyword">if</span> (diff_count &gt; <span class="number">1</span>) <span class="keyword">break</span>;</span><br><span class="line">                }</span><br><span class="line">            }</span><br><span class="line">            <span class="keyword">if</span> (diff_count == <span class="number">1</span>) {</span><br><span class="line">                found = <span class="literal">true</span>;</span><br><span class="line">                <span class="keyword">break</span>;</span><br><span class="line">            }</span><br><span class="line">        }</span><br><span class="line">        cout &lt;&lt; (found ? <span class="string">"YES"</span> : <span class="string">"NO"</span>) &lt;&lt; endl;</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><h2 id="优先队列"><a class="header-anchor" href="#优先队列"></a>优先队列</h2><h3 id="哈夫曼问题"><a class="header-anchor" href="#哈夫曼问题"></a>哈夫曼问题</h3><p><strong>★问题描述</strong></p><p>对于给定的一个数列，求出用该数列构造 Huffman 树的总费用。</p><p>给出一列数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">}</mo><mo>=</mo><msub><mi>p</mi><mn>0</mn></msub><mo separator="true">,</mo><msub><mi>p</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>p</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">\{p_i\}=p_0, p_1, …, p_{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>，用这列数构造 Huffman 树的过程如下：</p><ol><li>找到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{p_i\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span> 中<strong>最小的两个数</strong>，设为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">p_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">p_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">b</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，将 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>a</mi></msub></mrow><annotation encoding="application/x-tex">p_a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">p_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">b</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{p_i\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span> 中<strong>删除</strong>掉，然后将它们的<strong>和</strong>加入到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{p_i\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span> 中。这个过程的费用记为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mi>a</mi></msub><mo>+</mo><msub><mi>p</mi><mi>b</mi></msub></mrow><annotation encoding="application/x-tex">p_a + p_b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">a</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">b</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</li><li>重复步骤 1，直到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{p_i\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span> 中<strong>只剩下一个数</strong>。</li></ol><p>在上面的操作过程中，把所有的费用相加，就得到了构造 Huffman 树的总费用。</p><p>例如，对于数列<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false"> {</mo><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{p_i\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span>={5, 3, 8, 2, 9}，Huffman 树的构造过程如下：</p><ol><li>找到 {5, 3, 8, 2, 9} 中最小的两个数，分别是 2 和 3，从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{p_i\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span> 中删除它们并将和 5 加入，得到 {5, 8, 9, 5}，费用为 5。</li><li>找到 {5, 8, 9, 5} 中最小的两个数，分别是 5 和 5，从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{p_i\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span> 中删除它们并将和 10 加入，得到 {8, 9, 10}，费用为 10。</li><li>找到 {8, 9, 10} 中最小的两个数，分别是 8 和 9，从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{p_i\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span> 中删除它们并将和 17 加入，得到 {10, 17}，费用为 17。</li><li>找到 {10, 17} 中最小的两个数，分别是 10 和 17，从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">{</mo><msub><mi>p</mi><mi>i</mi></msub><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">\{p_i\}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">{</span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">}</span></span></span></span> 中删除它们并将和 27 加入，得到 {27}，费用为 27。</li><li>现在，数列中只剩下一个数 27，构造过程结束，总费用为 5+10+17+27=59。</li></ol><p><strong>★数据输入</strong></p><p>输入的第一行包含一个正整数 n（n&lt;=100）。</p><p>接下来是 n 个正整数，表示 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>p</mi><mn>0</mn></msub><mo separator="true">,</mo><msub><mi>p</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>p</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">p_0, p_1, …, p_{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">p</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>，每个数不超过 1000。</p><p><strong>★数据输出</strong></p><p>用这些数构造 Huffman 树的总费用。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    cin&gt;&gt;n;</span><br><span class="line">    <span class="type">int</span> a[<span class="number">100</span>];</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i=<span class="number">0</span>;i&lt;n;i++)</span><br><span class="line">    {</span><br><span class="line">        cin&gt;&gt;a[i];</span><br><span class="line">    }</span><br><span class="line">    <span class="type">int</span> len=n;</span><br><span class="line">    <span class="type">int</span> total=<span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span>(len&gt;<span class="number">1</span>)</span><br><span class="line">    {</span><br><span class="line">        <span class="type">int</span> min1=<span class="number">0</span>,min2=<span class="number">1</span>;</span><br><span class="line">        <span class="keyword">if</span> (a[min1]&gt;a[min2])</span><br><span class="line">            <span class="built_in">swap</span>(min1,min2);</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> i=<span class="number">2</span>;i&lt;len;i++)</span><br><span class="line">        {</span><br><span class="line">            <span class="keyword">if</span> (a[i]&lt;a[min1])</span><br><span class="line">            {</span><br><span class="line">                min2=min1;</span><br><span class="line">                min1=i;</span><br><span class="line">            }</span><br><span class="line">            <span class="keyword">else</span> <span class="keyword">if</span>(a[i]&lt;a[min2])</span><br><span class="line">            {</span><br><span class="line">                min2=i;</span><br><span class="line">            }</span><br><span class="line">        }</span><br><span class="line">        <span class="type">int</span> sum=a[min1]+a[min2];</span><br><span class="line">        total+=sum;</span><br><span class="line">        a[min1]=sum;</span><br><span class="line">        a[min2]=a[len<span class="number">-1</span>];</span><br><span class="line">        len--;</span><br><span class="line">    }</span><br><span class="line">    cout&lt;&lt;total&lt;&lt;endl;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="森林冰火人"><a class="header-anchor" href="#森林冰火人"></a>森林冰火人</h3><p>★实验任务</p><p>火人喜欢堆雪人。</p><p>已知火人在接下来的 N 天中，每天早上都会堆一个大小为 vi 的雪人。</p><p>但是火人的温度太高了！每天晚上，所有已存在的雪人的体积都会由于融化而减少 ti（若雪人体积不足 ti，则雪人体积融化至 0）。</p><p>问，每天融化的总体积为多少？</p><p>★数据输入</p><p>输入第一行为正整数 N (1&lt;=N&lt;=10^5)</p><p>第二行为 N 个正整数 vi (1&lt;=vi&lt;=10^5)，代表每天堆的雪人的体积。</p><p>第三行为 N 个正整数 ti (1&lt;=ti&lt;=10^5)，表示每天雪人融化的体积。</p><p>对于 80% 的数据， 1&lt;=N&lt;=100</p><p>对于 100% 的数据， 1&lt;=N&lt;=10^5</p><p>★数据输出</p><p>输出 N 个整数，代表每天融化的体积。（整数间以空格分隔）</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;bits/stdc++.h&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="keyword">typedef</span> <span class="type">long</span> <span class="type">long</span> ll;</span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">    <span class="type">int</span> N;</span><br><span class="line">    cin &gt;&gt;N;</span><br><span class="line">    <span class="function">vector&lt;ll&gt; <span class="title">v</span><span class="params">(N)</span>,<span class="title">t</span><span class="params">(N)</span></span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i=<span class="number">0</span>;i&lt;N;i++)</span><br><span class="line">        cin&gt;&gt;v[i];</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i=<span class="number">0</span>;i&lt;N;i++)</span><br><span class="line">        cin&gt;&gt;t[i];</span><br><span class="line"><span class="keyword">struct</span> <span class="title class_">compare</span> {</span><br><span class="line">    <span class="function"><span class="type">bool</span> <span class="title">operator</span><span class="params">()</span><span class="params">(ll a,ll b)</span> </span>{</span><br><span class="line">        <span class="keyword">return</span> a&gt;b;</span><br><span class="line">    }</span><br><span class="line">};</span><br><span class="line">    priority_queue&lt;ll,vector&lt;ll&gt;,compare&gt; pq_min;<span class="comment">//最小堆</span></span><br><span class="line">    ll sum=<span class="number">0</span>;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i=<span class="number">0</span>;i&lt;N;i++) {</span><br><span class="line">        pq_min.<span class="built_in">push</span>(v[i]+sum);</span><br><span class="line">        ll melt=<span class="number">0</span>;</span><br><span class="line">        <span class="keyword">while</span>(!pq_min.<span class="built_in">empty</span>() &amp;&amp;pq_min.<span class="built_in">top</span>()&lt;=sum+t[i]){</span><br><span class="line">            melt+=pq_min.<span class="built_in">top</span>()-sum;</span><br><span class="line">            pq_min.<span class="built_in">pop</span>();</span><br><span class="line">        }</span><br><span class="line">        melt+=pq_min.<span class="built_in">size</span>()*t[i];</span><br><span class="line">        sum+=t[i];</span><br><span class="line">        cout&lt;&lt;melt&lt;&lt;<span class="string">" "</span>;</span><br><span class="line">    }</span><br><span class="line">    cout&lt;&lt;endl;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></tbody></table></figure><h2 id="并查集"><a class="header-anchor" href="#并查集"></a>并查集</h2><h3 id="转移炸弹"><a class="header-anchor" href="#转移炸弹"></a>转移炸弹</h3><p><strong>★实验任务</strong></p><p>A 国有 N 个城市，这些城市编号为 1 到 N，有一天，他们调查出恐怖分子在每个城市中都安放了炸弹，于是他们给炸弹也编上了序号，第 i 个城市里的炸弹编号为 i。现在他们想把这些炸弹转移，以便于销毁炸弹。</p><p>由于炸弹是通过不同人转移的，所以需要一个指挥部门来记录转移炸弹的信息，以便于有些人要查询这些信息。我们有两个操作：</p><p>1. 将 a 炸弹目前所在城市中所有的炸弹转移到 b 炸弹所在的城市。</p><p>2. 询问 a 炸弹目前在哪个城市编号和这个城市中有炸弹个数。</p><p><strong>★数据输入</strong></p><p>输入第一行包含两个数 N,Q（1&lt;=N&lt;=500000 , 1&lt;=Q&lt;=120000）。分别表示城市的个数和操作数。</p><p>接下来有 Q 行，每行表示一个操作，第一种操作输入格式为 1 a b，第二种操作输入格式为 2 a。（1&lt;=a,b&lt;=N）</p><p><strong>★数据输出</strong></p><p>对于第一个操作，如果两个炸弹在同一个城市里，输出 “ERROR”，并不执行此操作。否则执行操作并不输出任何东西。</p><p>对于第二种操作，输出一行两个数表示炸弹所在的城市编号和该城市中炸弹个数，用一个空格分开。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="keyword">define</span> MAXN 500005</span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> parent[MAXN];  <span class="comment">// 父节点</span></span><br><span class="line"><span class="type">int</span> city[MAXN];    <span class="comment">// 炸弹当前所在的城市编号</span></span><br><span class="line"><span class="type">int</span> size[MAXN];    <span class="comment">// 城市中的炸弹数量</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 查找根节点（带路径压缩）</span></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">find</span><span class="params">(<span class="type">int</span> x)</span> </span>{</span><br><span class="line">    <span class="keyword">if</span> (parent[x] != x) {</span><br><span class="line">        parent[x] = <span class="built_in">find</span>(parent[x]);</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> parent[x];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">    <span class="type">int</span> N, Q;</span><br><span class="line">    <span class="built_in">scanf</span>(<span class="string">"%d %d"</span>, &amp;N, &amp;Q);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 初始化</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= N; i++) {</span><br><span class="line">        parent[i] = i;</span><br><span class="line">        city[i] = i;    <span class="comment">// 初始时炸弹i在城市i</span></span><br><span class="line">        size[i] = <span class="number">1</span>;    <span class="comment">// 每个城市初始有1个炸弹</span></span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (Q--) {</span><br><span class="line">        <span class="type">int</span> op, a, b;</span><br><span class="line">        <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;op);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (op == <span class="number">1</span>) {</span><br><span class="line">            <span class="built_in">scanf</span>(<span class="string">"%d %d"</span>, &amp;a, &amp;b);</span><br><span class="line">            <span class="type">int</span> ra = <span class="built_in">find</span>(a);</span><br><span class="line">            <span class="type">int</span> rb = <span class="built_in">find</span>(b);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (ra == rb) {</span><br><span class="line">                <span class="built_in">printf</span>(<span class="string">"ERROR\n"</span>);</span><br><span class="line">            } <span class="keyword">else</span> {</span><br><span class="line">                <span class="comment">// 把a所在城市的所有炸弹转移到b所在城市</span></span><br><span class="line">                <span class="comment">// 合并集合，以rb为新的根</span></span><br><span class="line">                parent[ra] = rb;</span><br><span class="line">                size[rb] += size[ra];</span><br><span class="line">                size[ra] = <span class="number">0</span>;</span><br><span class="line">                <span class="comment">// 更新城市编号：整个集合现在都在city[rb]城市</span></span><br><span class="line">                city[rb] = city[rb]; <span class="comment">// 保持不变</span></span><br><span class="line">                <span class="comment">// 注意：这里不需要更新city[ra]，因为ra不再是根节点</span></span><br><span class="line">            }</span><br><span class="line">        } <span class="keyword">else</span> {</span><br><span class="line">            <span class="built_in">scanf</span>(<span class="string">"%d"</span>, &amp;a);</span><br><span class="line">            <span class="type">int</span> root = <span class="built_in">find</span>(a);</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">"%d %d\n"</span>, city[root], size[root]);</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="道路"><a class="header-anchor" href="#道路"></a>道路</h3><p><strong>★实验任务</strong></p><p>某省调查城镇交通状况，得到现有城镇道路统计表，现给出每条道路连接的城镇编号，问当前的道路设计方案是否合理。</p><p>合理的方案为任意两个城镇之间可以相互到达，有且只有一条通路。</p><p><strong>★数据输入</strong></p><p>输入 a b (1&lt;=a,b&lt;=10,000)，表示城镇 a 和城镇 b 连通。输入包含多组数据，每组数据以 <code>0 0</code> 结束。</p><p>整个文件以 <code>-1 -1</code> 结尾</p><p><strong>★数据输出</strong></p><p>如果方案合法，输出 "Yes", 否则输出 "No"。</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span><span class="string">&lt;unordered_set&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> MAXN = <span class="number">10005</span>;</span><br><span class="line"><span class="type">int</span> parent[MAXN];</span><br><span class="line">unordered_set&lt;<span class="type">int</span>&gt; nodes;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">find</span><span class="params">(<span class="type">int</span> x)</span> </span>{</span><br><span class="line">    <span class="keyword">if</span> (parent[x] != x) {</span><br><span class="line">        parent[x] = <span class="built_in">find</span>(parent[x]);</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> parent[x];</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">init</span><span class="params">()</span> </span>{</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt; MAXN; ++i) {</span><br><span class="line">        parent[i] = i;</span><br><span class="line">    }</span><br><span class="line">    nodes.<span class="built_in">clear</span>();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">    <span class="type">int</span> a, b;</span><br><span class="line">    <span class="keyword">while</span> (cin &gt;&gt; a &gt;&gt; b) {</span><br><span class="line">        <span class="keyword">if</span> (a == <span class="number">-1</span> &amp;&amp; b == <span class="number">-1</span>) <span class="keyword">break</span>;</span><br><span class="line">        <span class="built_in">init</span>();</span><br><span class="line">        <span class="type">bool</span> has_cycle = <span class="literal">false</span>;</span><br><span class="line">        <span class="type">int</span> edge_count = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">while</span> (a != <span class="number">0</span> || b != <span class="number">0</span>) {</span><br><span class="line">            nodes.<span class="built_in">insert</span>(a);</span><br><span class="line">            nodes.<span class="built_in">insert</span>(b);</span><br><span class="line">            edge_count++;</span><br><span class="line">            <span class="type">int</span> rootA = <span class="built_in">find</span>(a);</span><br><span class="line">            <span class="type">int</span> rootB = <span class="built_in">find</span>(b);</span><br><span class="line">            <span class="keyword">if</span> (rootA == rootB) {</span><br><span class="line">                has_cycle = <span class="literal">true</span>;</span><br><span class="line">            }</span><br><span class="line"><span class="keyword">else</span> {</span><br><span class="line">                parent[rootA] = rootB;</span><br><span class="line">            }</span><br><span class="line">            cin &gt;&gt; a &gt;&gt; b;</span><br><span class="line">        }</span><br><span class="line">        <span class="keyword">if</span> (has_cycle) {</span><br><span class="line">            cout &lt;&lt; <span class="string">"No\n"</span>;</span><br><span class="line">        }</span><br><span class="line"><span class="keyword">else</span> {</span><br><span class="line">            <span class="keyword">if</span> (nodes.<span class="built_in">empty</span>()) {</span><br><span class="line">                cout &lt;&lt; <span class="string">"Yes\n"</span>;</span><br><span class="line">            }</span><br><span class="line"><span class="keyword">else</span> {</span><br><span class="line">                <span class="type">int</span> root = <span class="built_in">find</span>(*nodes.<span class="built_in">begin</span>());</span><br><span class="line">                <span class="type">bool</span> connected = <span class="literal">true</span>;</span><br><span class="line">                <span class="keyword">for</span> (<span class="type">int</span> node : nodes) {</span><br><span class="line">                    <span class="keyword">if</span> (<span class="built_in">find</span>(node) != root) {</span><br><span class="line">                        connected = <span class="literal">false</span>;</span><br><span class="line">                        <span class="keyword">break</span>;</span><br><span class="line">                    }</span><br><span class="line">                }</span><br><span class="line">                <span class="keyword">if</span> (connected &amp;&amp; edge_count == nodes.<span class="built_in">size</span>() - <span class="number">1</span>) {</span><br><span class="line">                    cout &lt;&lt; <span class="string">"Yes\n"</span>;</span><br><span class="line">                }</span><br><span class="line"><span class="keyword">else</span> {</span><br><span class="line">                    cout &lt;&lt; <span class="string">"No\n"</span>;</span><br><span class="line">                }</span><br><span class="line">            }</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="图"><a class="header-anchor" href="#图"></a>图</h2><h3 id="图论难题"><a class="header-anchor" href="#图论难题"></a>图论难题</h3><blockquote><p>好难 QAQ<br>考了</p></blockquote><p><strong>★问题描述</strong></p><p>数据结构与算法课程里面有各种求解最短路的算法，比如 floyd 算法、dijkstra 算法、bellman 算法。但该难题需要求解的不是最短路，而是求最短路的路径条数。</p><p><strong>★实验任务</strong></p><p>我们定义从 source 到达 target 的路径：source → u → v → target 是最短路，当且仅当该路径里面的所有边 (u，v) 满足：存在一条从 v 出发到终点的路径长度小于任意一条从 u 出发到终点的路径长度。</p><p>对于给定的一个无向无自环的图给你一个起点和一个终点，求出从起点到终点的最短路的路径条数。</p><p><strong>★数据输入</strong></p><p>第一行有两个正整数 N (1&lt;=N&lt;=1000), M (0&lt;=M&lt;=<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mrow><mi>N</mi><mo stretchy="false">(</mo><mi>N</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><mn>2</mn></mfrac></mrow><annotation encoding="application/x-tex">\frac{N(N-1)}{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.355em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.01em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.485em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.109em;">N</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.109em;">N</span><span class="mbin mtight">−</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>)。N 代表图 G 的顶点个数, M 代表图 G 有 M 条边。</p><p>接下来一共有 M 条边的描述，每条边的描述有三个整数 u (1&lt;=u&lt;=N), v (1&lt;=v&lt;=N), len (1&lt;=len&lt;=1000)。代表从 u 点到 v 点有一条边，且边的长度为 len。数据保证 u!=v 且不会出现重边。</p><p>最后一行有两个整数 S (1&lt;=S&lt;=N), T (1&lt;=T&lt;=N)，分别表示起点和终点。</p><p><strong>★数据输出</strong></p><p>输出一行为从 S 到 T 的最短路条数，如果 S 根本就走不到 T 就输出 -1</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;vector&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;queue&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;algorithm&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="type">long</span> <span class="type">long</span> ll;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> MAXN = <span class="number">1005</span>;</span><br><span class="line"><span class="type">const</span> <span class="type">int</span> INF = <span class="number">0x3f3f3f3f</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> N, M, S, T;</span><br><span class="line">vector&lt;pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt;&gt; graph[MAXN];</span><br><span class="line"><span class="type">int</span> dist[MAXN];</span><br><span class="line"><span class="type">bool</span> visited[MAXN];</span><br><span class="line">vector&lt;<span class="type">int</span>&gt; dag[MAXN];</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">dijkstra</span><span class="params">(<span class="type">int</span> start)</span> </span>{</span><br><span class="line">    <span class="built_in">memset</span>(dist, <span class="number">0x3f</span>, <span class="built_in">sizeof</span>(dist));</span><br><span class="line">    <span class="built_in">memset</span>(visited, <span class="literal">false</span>, <span class="built_in">sizeof</span>(visited));</span><br><span class="line">    dist[start] = <span class="number">0</span>;</span><br><span class="line">    priority_queue&lt;pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt;, vector&lt;pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt;&gt;, greater&lt;pair&lt;<span class="type">int</span>, <span class="type">int</span>&gt;&gt;&gt; pq;</span><br><span class="line">    pq.<span class="built_in">push</span>({<span class="number">0</span>, start});</span><br><span class="line"></span><br><span class="line">    <span class="keyword">while</span> (!pq.<span class="built_in">empty</span>()) {</span><br><span class="line">        <span class="type">int</span> d = pq.<span class="built_in">top</span>().first;</span><br><span class="line">        <span class="type">int</span> u = pq.<span class="built_in">top</span>().second;</span><br><span class="line">        pq.<span class="built_in">pop</span>();</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> (visited[u]) <span class="keyword">continue</span>;</span><br><span class="line">        visited[u] = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> &amp;e : graph[u]) {</span><br><span class="line">            <span class="type">int</span> v = e.first;</span><br><span class="line">            <span class="type">int</span> w = e.second;</span><br><span class="line">            <span class="keyword">if</span> (dist[v] &gt; d + w) {</span><br><span class="line">                dist[v] = d + w;</span><br><span class="line">                pq.<span class="built_in">push</span>({dist[v], v});</span><br><span class="line">            }</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">    cin &gt;&gt; N &gt;&gt; M;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; M; i++) {</span><br><span class="line">        <span class="type">int</span> u, v, len;</span><br><span class="line">        cin &gt;&gt; u &gt;&gt; v &gt;&gt; len;</span><br><span class="line">        graph[u].<span class="built_in">push_back</span>({v, len});</span><br><span class="line">        graph[v].<span class="built_in">push_back</span>({u, len});</span><br><span class="line">    }</span><br><span class="line">    cin &gt;&gt; S &gt;&gt; T;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 计算从T到所有点的最短距离</span></span><br><span class="line">    <span class="built_in">dijkstra</span>(T);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (dist[S] == INF) {</span><br><span class="line">        cout &lt;&lt; <span class="number">-1</span> &lt;&lt; endl;</span><br><span class="line">        <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 构建DAG：只包含从距离大的点指向距离小的点的边</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> u = <span class="number">1</span>; u &lt;= N; u++) {</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">auto</span> &amp;e : graph[u]) {</span><br><span class="line">            <span class="type">int</span> v = e.first;</span><br><span class="line">            <span class="comment">// 只添加满足条件的边：dist[u] &gt; dist[v]</span></span><br><span class="line">            <span class="keyword">if</span> (dist[u] &gt; dist[v]) {</span><br><span class="line">                dag[u].<span class="built_in">push_back</span>(v);</span><br><span class="line">            }</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 按到T的距离升序排序所有顶点（距离小的先处理）</span></span><br><span class="line">    vector&lt;<span class="type">int</span>&gt; nodes;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= N; i++) {</span><br><span class="line">        <span class="keyword">if</span> (dist[i] &lt; INF) {</span><br><span class="line">            nodes.<span class="built_in">push_back</span>(i);</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line">    <span class="built_in">sort</span>(nodes.<span class="built_in">begin</span>(), nodes.<span class="built_in">end</span>(), [](<span class="type">int</span> a, <span class="type">int</span> b) {</span><br><span class="line">        <span class="keyword">return</span> dist[a] &lt; dist[b];</span><br><span class="line">    });</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 动态规划计算路径条数</span></span><br><span class="line">    <span class="function">vector&lt;ll&gt; <span class="title">dp</span><span class="params">(N + <span class="number">1</span>, <span class="number">0</span>)</span></span>;</span><br><span class="line">    dp[T] = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> v : nodes) {</span><br><span class="line">        <span class="keyword">if</span> (v == T) <span class="keyword">continue</span>;</span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> u : dag[v]) {</span><br><span class="line">            dp[v] += dp[u];</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 输出路径条数</span></span><br><span class="line">    cout &lt;&lt; dp[S] &lt;&lt; endl;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h3 id="最小生成树"><a class="header-anchor" href="#最小生成树"></a>最小生成树</h3><p><strong>★问题描述</strong></p><p>给定平面上的 n 个点，添加一些边使得任何两个点之间都能相互到达，求添加的边的长度总和最小为多少</p><p><strong>★数据输入</strong></p><p>第一行一个正整数 n (1&lt;=n&lt;=5000)，表示序列有 n 个点，<br>接下来有 n 行，每行两个整数 xi 和 yi，（-1000000≤xi,yi≤1000000），表示 n 个点的坐标</p><p><strong>★数据输出</strong></p><p>添加的边的长度总和的最小值，四舍五入保留两位小数</p><figure class="highlight c++"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;iostream&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cmath&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;cstring&gt;</span></span></span><br><span class="line"><span class="keyword">using</span> <span class="keyword">namespace</span> std;</span><br><span class="line"></span><br><span class="line"><span class="type">const</span> <span class="type">int</span> N = <span class="number">5005</span>;</span><br><span class="line"><span class="type">double</span> x[N], y[N]; <span class="comment">// 坐标</span></span><br><span class="line"><span class="type">double</span> dist[N]; <span class="comment">// 边长</span></span><br><span class="line"><span class="type">bool</span> vis[N]; <span class="comment">// 树</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">int</span> <span class="title">main</span><span class="params">()</span> </span>{</span><br><span class="line">    <span class="type">int</span> n;</span><br><span class="line">    cin &gt;&gt; n;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++)</span><br><span class="line">        cin &gt;&gt; x[i] &gt;&gt; y[i];</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++)</span><br><span class="line">        dist[i] = <span class="number">1e18</span>;</span><br><span class="line"></span><br><span class="line">    dist[<span class="number">1</span>] = <span class="number">0</span>;        <span class="comment">// 从第 1 个点开始做 Prim</span></span><br><span class="line">    <span class="type">double</span> ans = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1</span>; i &lt;= n; i++) {</span><br><span class="line">        <span class="type">int</span> u = <span class="number">-1</span>;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 找当前未加入 MST 的最近点</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> j = <span class="number">1</span>; j &lt;= n; j++) {</span><br><span class="line">            <span class="keyword">if</span> (!vis[j] &amp;&amp; (u == <span class="number">-1</span> || dist[j] &lt; dist[u]))</span><br><span class="line">                u = j;</span><br><span class="line">        }</span><br><span class="line"></span><br><span class="line">        vis[u] = <span class="literal">true</span>;</span><br><span class="line">        ans += dist[u];</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 用 u 更新其他点的最小连边</span></span><br><span class="line">        <span class="keyword">for</span> (<span class="type">int</span> v = <span class="number">1</span>; v &lt;= n; v++) {</span><br><span class="line">            <span class="keyword">if</span> (!vis[v]) {</span><br><span class="line">                <span class="type">double</span> dx = x[u] - x[v];</span><br><span class="line">                <span class="type">double</span> dy = y[u] - y[v];</span><br><span class="line">                <span class="type">double</span> d = <span class="built_in">sqrt</span>(dx*dx + dy*dy);</span><br><span class="line">                <span class="keyword">if</span> (d &lt; dist[v]) dist[v] = d;</span><br><span class="line">            }</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"%.2f\n"</span>, ans);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><h2 id="理论部分"><a class="header-anchor" href="#理论部分"></a>理论部分</h2><p>破防了！弃坑！</p>]]>
    </content>
    <id>https://watermelonabc.top/p/d5d6cc48/</id>
    <link href="https://watermelonabc.top/p/d5d6cc48/" rel="alternate"/>
    <published>2025-12-21T13:02:31.000Z</published>
    <summary>情况真是急转直下啊（</summary>
    <title>2025 福州大学算法与数据结构复习</title>
    <updated>2026-08-04T09:53:10.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="复习笔记" scheme="https://watermelonabc.top/categories/%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="FZU" scheme="https://watermelonabc.top/tags/FZU/"/>
    <content>
      <![CDATA[<p>试卷结构：</p><ul><li>单选题 20 * 1</li><li>多选题 10 * 2</li><li>简答题 4 * 5</li><li>材料分析题 20</li><li>论述题 20</li></ul><p>单选题和多选题有题库；简答题有题纲；材料题关注教材第十一章（民生）；论述题关注二十届四中全会公报</p><h2 id="简答题部分"><a class="header-anchor" href="#简答题部分"></a>简答题部分</h2><p>一题就 5 分，不用多答</p><h3 id="第一章"><a class="header-anchor" href="#第一章"></a>第一章</h3><ol><li>简述当前我国主要矛盾<br>人民日益增长的美好生活需要和不平衡不充分的发展之间的矛盾</li><li>如何理解 “四个全面” 战略布局新内涵<br>“全面建成小康社会、全面深化改革、全面依法治国、全面从严治党”。全面建成小康社会后，又发展出 “全面建设社会主义现代化国家”</li><li>中国共产党的初心使命是什么<br>为中国人民谋幸福，为中华民族谋复兴</li></ol><h3 id="第二章"><a class="header-anchor" href="#第二章"></a>第二章</h3><ol><li>什么是中国梦<br>实现中华民族伟大复兴</li><li>如何理解中国式现代化是人口规模巨大的现代化<br>我国全体人民整体迈入现代化，规模超过现有发达国家人口的总和，将极大地改变现代化的世界版图</li><li>如何理解中国式现代化是全体人民共同富裕的现代化<br>中国式现代化坚持以人民为中心，突出现代化方向的人民性，在高质量发展中不断增进人民福祉，扎实推动全体人民共同富裕</li><li>如何理解中国式现代化是物质文明和精神文明相协调的现代化<br>物质贫困不是社会主义，精神贫乏也不是社会主义。物质富足、精神富有是社会主义现代化的根本要求</li><li>如何理解中国式现代化是人与自然和谐共生的现代化<br>中国式现代化坚持绿色发展，统筹推进经济社会发展和环境保护，确保可持续发展</li><li>如何理解中国式现代化是走和平发展道路的现代化<br>中国式现代化坚持独立自主、自力更生，依靠全体人民的辛勤劳动和创新创造发展壮大自己</li></ol><h3 id="第三章"><a class="header-anchor" href="#第三章"></a>第三章</h3><ol><li>简述 “两个拥护” 的内涵<br>坚决维护习近平总书记党中央的核心、全党的核心地位，坚决维护党中央权威和集中统一领导</li><li>如何理解中国共产党在国家政治生活中的领导核心地位<br>在当今中国，没有大于中国共产党的政治力量或其他什么力量。党政军民学，东西南北中，党是领导一切的，是最高的政治领导力量。</li><li>如何理解民主集中制基本原则中第一条的内涵<br>党员个人服从党的组织，少数服从多数，下级组织服从上级组织，全党各个组织和全体党员服从党的全国代表大会和中央委员会</li><li>简述 “四个意识” 的内涵<br>政治意识、大局意识、核心意识、看齐意识</li></ol><h3 id="第四章"><a class="header-anchor" href="#第四章"></a>第四章</h3><ol><li>如何理解 “人民是历史的创造者，是真正的英雄”<br>人民群众是社会物质财富、精神财富的创造者和社会变革的决定性力量</li><li>如何理解 “人民立场”<br>政治立场是一个政党观察、认识、处理政治问题的立足点，反映了这个政党的世界观、方法论和执政理念，体现了这个党的根本属性。人民立场是中国共产党的根本政治立场，是我们党区别于其他政党的显著标志</li><li>如何依靠人民创造历史伟业<br>尊重人民的主体地位，尊重群众的首创精神</li></ol><h3 id="第五章"><a class="header-anchor" href="#第五章"></a>第五章</h3><ol><li>简述全面深化改革的总目标<br>完善和发展中国特色社会主义制度，推进国家治理体系和治理能力现代化</li><li>简述国家治理体系的内涵<br>国家治理体系是在党领导下管理国家的制度体系，包括经济、政治、文化、社会、生态文明和党的建设等各领域体制机制、法律法规安排，也就是一整套紧密相连、相互协调的国家制度</li><li>简述国家治理能力的内涵<br>国家治理能力是运用国家制度管理社会各方面事务的能力，包括改革发展稳定、内政外交国防、治党治国治军等各个方面</li></ol><h3 id="第六章"><a class="header-anchor" href="#第六章"></a>第六章</h3><ol><li>简述新发展理念的内容<br>创新、协调、绿色、开放、共享的发展方式</li><li>简述社会主义基本经济制度的新概括<br>公有制为主体、多种所有制经济共同发展；按劳分配为主体、多种分配方式并存；社会主义市场经济体制</li><li>简述公有制经济的组成<br>国有经济、集体经济和混合所有制经济中的国有成分与集体成分</li><li>简述非公有制经济的组成<br>个体经济、私营经济、港澳台投资、外商投资（外资经济）和混合所有制经济中的非国有成分与非集体成分</li><li>简述两个 “毫不动摇” 的内容<br>毫不动摇地<strong>巩固和发展</strong>公有制经济，毫不动摇地<strong>鼓励、支持和引导</strong>非公有制经济发展</li><li>简述新发展格局的内涵<br>以国内大循环为主体、国内国际双循环相互促进的经济发展模式</li></ol><h3 id="第八章"><a class="header-anchor" href="#第八章"></a>第八章</h3><ol><li>简要回答 “全过程人民民主” 的内涵<br>全过程人民民主实现了过程民主和成果民主、程序民主和实质民主、直接民主和间接民主、人民民主和国家意志相统一，是全链条、全方位、全覆盖的民主，是最广泛、最真实、最管用的社会主义民主。</li><li>坚持走中国特色社会主义政治发展道路的三个支点是什么<br>党的领导、人民当家作主、依法治国有机统一</li><li>简述人民当家作主的制度保障<br>人民代表大会制度（根本）；中国共产党领导的多党合作和政治协商制度、民族区域自治制度、基层群众自治制度（基本、重要）</li></ol><h3 id="第十章"><a class="header-anchor" href="#第十章"></a>第十章</h3><ol><li>如何理解文化自信<br>文化自信是<strong>更基础、更广泛、更深层</strong>的自信，是一个国家、一个民族发展过程中<strong>最基本、最深沉、最持久</strong>的力量</li><li>简述 “两个结合” 的内容<br>把马克思主义基本原理同中国具体实际相结合、同中华优秀传统文化相结合</li><li>什么是中华优秀传统文化的创造性转化和创新性发展<br>创造性转化，就是要按照时代特点和要求，对那些至今仍有借鉴价值的内涵和陈旧的表现形式加以改造，赋予其新的时代内涵和现代表达形式，激活其生命力。创新性发展，就是要按照时代的新进步新进展，对中华优秀传统文化的内涵加以补充、拓展、完善，增强其影响力和感召力。</li><li>简述文化发展 “二为” 方向的内容<br>为人民服务，为社会主义服务</li><li>简述 “双百” 方针的内容<br>百花齐放，百家争鸣</li><li>简述 “文化软实力” 的内涵<br>文化软实力集中体现了一个国家基于文化而具有的<strong>凝聚力和生命力</strong>，以及由此产生的<strong>吸引力和影响力</strong>。</li></ol><h3 id="第十一章"><a class="header-anchor" href="#第十一章"></a>第十一章</h3><ol><li>简述 “民生” 的内涵<br>民生是老百姓最关心的问题，涉及分配、就业、教育、医疗、住房、社会保障等方面。随着经济社会的发展进步，人民生活品质的不断提高，民生内涵也在不断丰富</li><li>简述社会保障体系的内涵<br>社会保障体系是由国家立法规定并以国家作为给付义务主体，为保障社会成员的基本生活和福利、对生活困难社会成员给予物质或服务帮助的各项措施的统称，主要涉及社会保险、社会救助、社会福利、社会优抚等方面。</li><li>如何理解社会治理体系中的 “共建” 原则<br>共建是共同参与社会<strong>建设</strong>，要求突出制度和体系建设的基础性、战略性地位，是社会治理的<strong>基础</strong></li><li>如何理解社会治理体系中的 “共治” 原则<br>共治是共同参与社会<strong>治理</strong>，要求树立大社会观、大治理观，打造全民参与的开放治理体系，是社会治理的<strong>关键</strong></li><li>如何理解社会治理体系中的 “共享” 原则<br>共享是共同<strong>享有</strong>社会治理<strong>成果</strong>，要求社会治理的成效更多更惠及全体人民，是社会治理的<strong>目标</strong></li></ol><h3 id="第十二章"><a class="header-anchor" href="#第十二章"></a>第十二章</h3><ol><li>简述 “两山理论” 的内容<br>一是既要绿水青山，也要金山银山；二是宁要绿水青山，不要金山银山；三是绿水青山就是金山银山</li><li>简述 “双碳” 目标的内容<br>2030 年前实现碳达峰，2060 年前实现碳中和</li><li>简述 “人与自然生命共同体” 的内涵<br>生态是统一的自然系统，是相互依存、紧密联系的有机链条。人的命脉在田，田的命脉在水，水的命脉在山，山的命脉在土，土的命脉在林和草，这个生命共同体是人类生存发展的<strong>物质基础</strong></li><li>如何理解全球生态治理过程中的中国角色<br>中国致力于推动共建地球生命共同体，积极参与全球环境治理，是全球生态文明建设的重要<strong>参与者、贡献者、引领者</strong></li></ol><h3 id="第十三章"><a class="header-anchor" href="#第十三章"></a>第十三章</h3><ol><li>简述国家安全的内涵<br>国家安全是指国家政权、主权、统一和领土完整、人民福祉、经济社会可持续发展和国家其他重大利益相对处于没有危险和不受内外威胁的状态，以及保障持续安全状态的能力</li><li>如何理解政治安全<br>政治安全涉及国家主权、政权、制度和意识形态的稳固，是一个国家最根本的需求，是国家赖以生存和发展的基础条件</li><li>如何理解 “统筹发展与安全”<br>发展是安全的基础和目的，安全是发展的条件和保障，要坚持发展和安全并重</li><li>列举 5 个中国国家安全重点领域<br>国土安全、经济安全、社会安全、网络安全、生物安全、公共卫生安全、外部安全等</li></ol><h3 id="第十六章"><a class="header-anchor" href="#第十六章"></a>第十六章</h3><ol><li>简述 “推动构建新型国际关系” 的内涵<br>推动构建新型国际关系，就是要秉持相互尊重、公平正义、合作共赢原则，走出一条对话而不对抗、结伴而不结盟的国与国外交新路。</li><li>什么是中国外交的神圣使命<br>维护国家主权、安全和发展利益</li><li>简述一带一路倡议的内涵<br>共建 “一带一路” 是对中国与世界实现开放共赢路径的顶层设计，是推动构建人类命运共同体的实践平台。</li><li>简述 “外交为民” 的内涵<br>中国外交始终坚守外交为民的宗旨，把为民服务、为民解忧作为重要职责，把人民的满意度作为重要标尺，坚持把中国人民的利益和全人类共同利益联系在一起，促进各国人民相互了解、相互支持、相互帮助</li><li>简述 “建设五个世界” 总目标内容<br>坚持对话协商，建设一个<strong>持久和平</strong>的世界；坚持共建共享，建设一个<strong>普遍安全</strong>的世界；坚持合作共赢，建设一个<strong>共同繁荣</strong>的世界；坚持交流互鉴，建设一个<strong>开放包容</strong>的世界；坚持绿色低碳，建设一个<strong>清洁美丽</strong>的世界。</li></ol><hr><h2 id="B3-卷考后回忆版"><a class="header-anchor" href="#B3-卷考后回忆版"></a>B3 卷考后回忆版</h2><h3 id="客观题部分"><a class="header-anchor" href="#客观题部分"></a>客观题部分</h3><p>难度不会太大，建议找个同伴齐头复习，随时提问。有些题目的答案甚至会在其他题目的题干中有所呈现。</p><h3 id="简答题部分-2"><a class="header-anchor" href="#简答题部分-2"></a>简答题部分</h3><ol><li>简述 “四个全面” 战略布局新的时代内涵</li><li>如何理解 “人民立场”</li><li>简述国家治理能力的内涵</li><li>如何理解 “统筹发展与安全”</li></ol><h3 id="材料题部分"><a class="header-anchor" href="#材料题部分"></a>材料题部分</h3><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">材料</div></div><div class="callout-content"><p>为人民而生，因人民而兴，始终同人民在一起，为人民利益而奋斗，是我们党立党兴党强党的根本出发点和落脚点。习近平总书记指出：“中国共产党始终代表最广大人民根本利益，与人民休戚与共、生死相依，没有任何自己特殊的利益，从来不代表任何利益集团、任何权势团体、任何特权阶层的利益。” 100 年来，为了人民幸福和民族复兴，我们党团结带领中国人民，以 “为有牺牲多壮志，敢教日月换新天” 的大无畏气概，书写了中华民族几千年历史上最恢宏的史诗，创造了新民主主义革命的伟大成就，创造了社会主义革命和建设的伟大成就，创造了改革开放和社会主义现代化建设的伟大成就，创造了新时代中国特色社会主义的伟大成就。特别是党的十八大以来，中国特色社会主义进入新时代，我们党团结带领中国人民，自信自强、守正创新，统揽伟大斗争、伟大工程、伟大事业、伟大梦想，党和国家事业取得历史性成就、发生历史性变革，中华民族迎来了从站起来、富起来到强起来的伟大飞跃，实现中华民族伟大复兴进入了不可逆转的历史进程！<br>——人民日报<a href="http://theory.people.com.cn/n1/2021/0811/c40531-32188852.html">《人民对美好生活的向往就是我们的奋斗目标》</a></p></div></div><p>结合材料内容和所学知识，谈谈为什么让人民生活幸福是 “国之大者”。</p><h3 id="论述题部分"><a class="header-anchor" href="#论述题部分"></a>论述题部分</h3><p>阅读（<s>实际上并没给任何材料</s>）二十届四中全会公报内容，结合所学知识和党的创新理论，谈谈如何推动高质量发展。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/7c6cc5e4/</id>
    <link href="https://watermelonabc.top/p/7c6cc5e4/" rel="alternate"/>
    <published>2025-12-02T12:57:06.000Z</published>
    <summary>燃尽了</summary>
    <title>2025 福州大学习概期末复习</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="学习笔记" scheme="https://watermelonabc.top/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="CTF" scheme="https://watermelonabc.top/tags/CTF/"/>
    <category term="Reverse" scheme="https://watermelonabc.top/tags/Reverse/"/>
    <content>
      <![CDATA[<p>Frida 是一个知名的 Hook 框架<br>接下来我们主要以 Android Hook 为主题进行讲解</p><h2 id="环境配置"><a class="header-anchor" href="#环境配置"></a>环境配置</h2><p>分别在 PC 和目标 Android 上配置 Frida：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 我使用 UV 管理 Python，因此没有一个全局的 Python</span></span><br><span class="line"><span class="comment"># uv venv --seed --clear venv</span></span><br><span class="line"><span class="comment"># venv\Scripts\activate</span></span><br><span class="line"></span><br><span class="line">pip install frida frida-tools</span><br></pre></td></tr></tbody></table></figure><p>记住 Frida 版本：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">$ pip show frida</span><br><span class="line"></span><br><span class="line">Name: frida</span><br><span class="line">Version: 17.5.1</span><br></pre></td></tr></tbody></table></figure><p>在 ADB shell 中查看 Android 设备架构：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$ <span class="built_in">uname</span> -m</span><br><span class="line"></span><br><span class="line">aarch64</span><br></pre></td></tr></tbody></table></figure><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>一般来讲，模拟器采用 x86-64，真机采用 arm64（即此处的 aarch64）</p></div></div><p>在 <a href="https://github.com/frida/frida/releases">Releases · frida/frida</a> 下载对应版本的 Frida-server，例如此处应下 frida-server-17.5.1-android-arm64.xz。</p><p>解压得到的文件传输到 Android 上：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb push frida-server-17.5.1-android-arm64 /data/local/tmp/</span><br></pre></td></tr></tbody></table></figure><p>在 Android 上启动服务端：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">adb shell</span><br><span class="line">su <span class="comment"># 需要在 Root 下运行，否则 SELinux 会报错</span></span><br><span class="line"><span class="built_in">cd</span> /data/local/tmp</span><br><span class="line"><span class="built_in">chmod</span> +x ./frida-server-17.5.1-android-arm64 <span class="comment"># 赋予执行权限</span></span><br><span class="line">./frida-server-17.5.1-android-arm64</span><br><span class="line"> <span class="comment"># 无报错即服务端正常运行</span></span><br></pre></td></tr></tbody></table></figure><p>现在就可以用 Frida 了 😊</p><h2 id="Frida-调试基础"><a class="header-anchor" href="#Frida-调试基础"></a>Frida 调试基础</h2><p>Android 每个 APP 都运行在自己独立的虚拟机和沙盒中，如果每个 APP 的运行时环境都不共享，那么资源消耗是很恐怖的。而 Android 提供了 <code>Zygote</code> 进程，所有 APP 都是由&nbsp;<code>Zygote</code>&nbsp;fork 出来的：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">init&nbsp;</span><br><span class="line">└── Zygote（已预加载所有 Framework 类）</span><br><span class="line">    ├── system_server</span><br><span class="line">    ├── com.tencent.mm</span><br><span class="line">    └── com.example.yourapp &nbsp;← 你要分析的 APP</span><br></pre></td></tr></tbody></table></figure><p><code>Zygote</code> 的作用是：提前把 Android Framework 所有的类加载好，每次 fork 新进程时直接继承，不用重新初始化。这样做可以实现极速启动和节省内存.</p><p>两种模式：Spawn（生成）和 Attach（附加）。Spawn 模式是从头启动应用并调试，Attach 模式是在应用运行时才开始调试。Spawn 模式下，Frida 利用 <code>Zygote</code> 控制进程创建，可以在业务代码运行前完成 Hook；Attach 模式下，APP 的&nbsp;<code>Application.onCreate</code>&nbsp;等初始化逻辑已经执行完，注入太晚。因此对抗加固的场景大多用&nbsp;Spawn&nbsp;模式。</p><p>但 Spawn 模式也可以被某些 APP 检测到。</p><p>Spawn 模式：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">frida -U -f &lt;TARGET&gt; -l &lt;SCRIPT&gt;</span><br></pre></td></tr></tbody></table></figure><ul><li><code>TARGET</code>：APP 包名或可执行文件名</li><li><code>SCRIPT</code>：用于调试的 Python, JS 或 TS 脚本。自己写或者用已有的。如果不附带脚本，则进入交互式调试。</li></ul><p><code>TARGET</code> 需要的包名可以通过 <code>frida-ps -Ua</code>（运行中的应用）/<code>frida-ps -Uai</code>（安装的应用）得到。</p><p>Spawn 方式启动后，会立刻暂停运行。需要继续运行，需要手动输入：<code>%resume</code></p><p>旧版本有一个 <code>--no-pause</code> 会自动运行，但新版本已不支持。</p><hr><p>Attach 模式：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">frida -U -N TARGET -l SCRIPT</span><br></pre></td></tr></tbody></table></figure><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">如何处理 I/O error</div></div><div class="callout-content"><p></p><p>解决方法：Root + 设置 <code>setenforce 0</code> + Reboot</p><p><a href="https://github.com/frida/frida/issues/3602">"Failed to enumerate processes: unable to perform ptrace pokedata: I/O error” on rooted Android (SELinux Enforcing)</a></p><p><a href="https://github.com/frida/frida/issues/3519">frida-ps -U Failed to enumerate processes: unable to perform ptrace pokedata: I/O error</a></p></div></div><h3 id="怎么写好一个调试脚本"><a class="header-anchor" href="#怎么写好一个调试脚本"></a>怎么写好一个调试脚本</h3><p>脚本主要有三类内容：</p><ul><li><code>Interceptor</code>（拦截器）：实现 Hook 函数、打印参数等调试操作。每次匹配到（对应函数），都会触发执行代码。</li><li><code>ApiResolver</code>（解析器）：模糊查找相关函数。只有第一次（解析时）匹配到，才会执行。</li><li><code>Stalker</code>（跟踪器）：跟踪代码的实际运行的过程。期间可以打印和查看对应的值，便于实现调试真正代码运行的逻辑。</li></ul><p>对于 JS 脚本，一个简单的 CTF 示例如下：</p><figure class="highlight js"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 所有 Java API 调用必须在 Java.perform() 回调中执行</span></span><br><span class="line"><span class="title class_">Java</span>.<span class="title function_">perform</span>(<span class="keyword">function</span> (<span class="params"></span>) {</span><br><span class="line">  <span class="comment">// 获取目标类的引用</span></span><br><span class="line">  <span class="keyword">var</span> <span class="title class_">Vault</span> = <span class="title class_">Java</span>.<span class="title function_">use</span>(<span class="string">"com.heroctf.freeda1.utils.Vault"</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 尝试调用目标方法并处理异常。延迟 1000ms 执行以减少 bug</span></span><br><span class="line">  <span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) {</span><br><span class="line">    <span class="keyword">try</span> {</span><br><span class="line">      <span class="keyword">var</span> flag = <span class="title class_">Vault</span>.<span class="title function_">get_flag</span>();</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"[SUCCESS] Flag: "</span> + flag);</span><br><span class="line">    } <span class="keyword">catch</span> (e) {</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"[ERROR] "</span> + e);</span><br><span class="line">    }</span><br><span class="line">  }, <span class="number">1000</span>);</span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><p>这个的脚本的目的是直接获取 <code>Vault</code> 类下的 <code>get_flag()</code> 方法的输出，得到 flag。</p><p>一些常用方法：</p><table><thead><tr><th>API 名称</th><th>描述</th></tr></thead><tbody><tr><td><code>Java.use(className)</code></td><td>获取指定的 Java 类并使其在 JavaScript 代码中可用。</td></tr><tr><td><code>Java.perform(callback)</code></td><td>确保回调函数在 Java 的主线程上执行。</td></tr><tr><td><code>Java.choose(className, callbacks)</code></td><td>枚举指定类的所有实例。</td></tr><tr><td><code>Java.cast(obj, cls)</code></td><td>将一个 Java 对象转换成另一个 Java 类的实例。</td></tr><tr><td><code>Java.enumerateLoadedClasses(callbacks)</code></td><td>枚举进程中已经加载的所有 Java 类。</td></tr><tr><td><code>Java.enumerateClassLoaders(callbacks)</code></td><td>枚举进程中存在的所有 Java 类加载器。</td></tr><tr><td><code>Java.enumerateMethods(targetClassMethod)</code></td><td>枚举指定类的所有方法。</td></tr></tbody></table><h3 id="绕过检测"><a class="header-anchor" href="#绕过检测"></a>绕过检测</h3><p>要用 Frida-server 调试的前提就是 Root，但显然大部分应用都不希望自己被 Frida 或者 Root 调戏，因此会做 Root 检测，一检测到特征就停止程序运行。</p><p>但是，代码总是有执行顺序的，只要我在检测前就把特征检测方法给 Hook 掉，你不就检查不出来了吗？另一种就是 “打入内部”，将 Frida-gadget 植入程序，可以实现免 Root 的 Hook。</p><figure class="highlight java"><figcaption><span>Security</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heroctf.freeda2.utils;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> android.content.Context;</span><br><span class="line"><span class="keyword">import</span> com.scottyab.rootbeer.RootBeer;</span><br><span class="line"></span><br><span class="line"><span class="comment">/* compiled from: r8-map-id-baa4c77f810b701c3077d4ce68a3d5b79ee91034c03e266e8ba1aed7e464c1a1 */</span></span><br><span class="line"><span class="comment">/* loaded from: classes.dex */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">final</span> <span class="keyword">class</span> <span class="title class_">Security</span> {</span><br><span class="line">    <span class="keyword">private</span> <span class="title function_">Security</span><span class="params">()</span> {</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">detectRoot</span><span class="params">(Context context)</span> {</span><br><span class="line">        <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">RootBeer</span>(context).isRooted();</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><figure class="highlight js"><figcaption><span>hook.js</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">Java</span>.<span class="title function_">perform</span>(<span class="keyword">function</span> (<span class="params"></span>) {</span><br><span class="line">  <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"[+] Bypassing root detection..."</span>);</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 绕过 RootBeer</span></span><br><span class="line">  <span class="keyword">var</span> <span class="title class_">RootBeer</span> = <span class="title class_">Java</span>.<span class="title function_">use</span>(<span class="string">"com.scottyab.rootbeer.RootBeer"</span>);</span><br><span class="line">  <span class="title class_">RootBeer</span>.<span class="property">isRooted</span>.<span class="property">implementation</span> = <span class="keyword">function</span> (<span class="params"></span>) {</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"[+] RootBeer.isRooted() bypassed"</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">  };</span><br><span class="line"></span><br><span class="line">  <span class="comment">// 绕过 Vault 构造函数检测</span></span><br><span class="line">  <span class="keyword">var</span> <span class="title class_">Vault</span> = <span class="title class_">Java</span>.<span class="title function_">use</span>(<span class="string">"com.heroctf.freeda2.utils.Vault"</span>);</span><br><span class="line">  <span class="title class_">Vault</span>.<span class="property">$init</span>.<span class="property">implementation</span> = <span class="keyword">function</span> (<span class="params"></span>) {</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"[+] Vault constructor bypassed"</span>);</span><br><span class="line">    <span class="comment">// Don't call original constructor</span></span><br><span class="line">  };</span><br><span class="line"></span><br><span class="line">  <span class="built_in">setTimeout</span>(<span class="keyword">function</span> (<span class="params"></span>) {</span><br><span class="line">    <span class="keyword">try</span> {</span><br><span class="line">      <span class="keyword">var</span> flag = <span class="title class_">Vault</span>.<span class="title function_">get_flag</span>();</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"[SUCCESS] Flag: "</span> + flag);</span><br><span class="line">    } <span class="keyword">catch</span> (e) {</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"[ERROR] "</span> + e);</span><br><span class="line">    }</span><br><span class="line">  }, <span class="number">1000</span>);</span><br><span class="line">});</span><br></pre></td></tr></tbody></table></figure><p><a href="https://github.com/scottyab/rootbeer">RootBeer</a> 是一个简单的 Root 权限检查库。作者也在 README 中坦陈 RootBeer 可以被绕过（查看 <a href="https://medium.com/secarmalabs/bypassing-androids-rootbeer-library-part-1-a5f93918660d">Bypassing Android’s RootBeer Library — Part 1</a>）</p><p>本题仅使用 RootBeer 的综合检测方法 <code>isRooted()</code> 来检测 Root，这倒是为我们省去了不少麻烦，因为我们只需要 Hook <code>isRooted()</code> 就行了。</p><h3 id="Native-Hook"><a class="header-anchor" href="#Native-Hook"></a>Native Hook</h3><p>与 Java 层不同，Native 层的函数是分散在 <code>so</code> 文件中的。在 Hook 前，Frida 需要找到目标函数，因为 <code>so</code> 是动态加载的。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/f840d92a/</id>
    <link href="https://watermelonabc.top/p/f840d92a/" rel="alternate"/>
    <published>2025-12-01T09:19:41.000Z</published>
    <summary>REer 钓 Functions</summary>
    <title>Frida 入门</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="杂记" scheme="https://watermelonabc.top/categories/%E6%9D%82%E8%AE%B0/"/>
    <category term="other" scheme="https://watermelonabc.top/tags/other/"/>
    <content>
      <![CDATA[<p>这几天在 FZU 贴吧里参加一场 “讨论”（<a href="https://tieba.baidu.com/p/10229394978#">你福里面的伪人还是有点东西的</a>）。正好最近还刷到了一个讲 “诡辩” 的视频，正巧没地方应用，这下机会来了。</p><p>思来想去，也搬 <s>史</s> 过来给各位读者瞧瞧，看看哪方有理。毕竟观众也是辩论的重要一环 <sup>-</sup></p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>我使用 ChatGPT 进行逻辑辅助，即先检查我的回答中逻辑是否足以反驳对方的观点；具体表达基本由我自己查阅资料后写出。我与 ChatGPT 的交流，详见 <a href="https://chatgpt.com/share/6920a09b-0d5c-8009-8b90-0247bcffb566">支持哪方观点分析</a></p></div></div><div class="callout" data-callout="question"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-help-circle"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Question</div></div><div class="callout-content"><p>你能找出这里哪些地方运用了诡辩吗？</p></div></div><p>以下是帖子里的交流内容，为了节省篇幅，仅节选我和 TA 的交流。TA 的交流以灰色注释形式给出。</p><hr><div class="callout" data-callout="background"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Background</div></div><div class="callout-content"><p>有人在学校表白墙上发了一篇声讨不规范骑电动车的文章，评论区内抱怨违法的和讽刺守法的开始争吵</p></div></div><blockquote><p>我是认为如果你能保持每时每刻全部遵守交规你才能站在制高点上指指点点，五十步笑百步的就别在这显摆优越感了</p></blockquote><p>建议您先搜一下 “诉诸人身” 再重新审视一下自己的观点。“…… 毕竟，大家都是半斤八两，你王美丽不过是五十步笑百步罢了，也好不到哪里去。张小帅最后的这种想法，也是一种诉诸人身的谬误，其拉丁名字叫 Tu quoque，意思是‘你也一样’。它又叫诉诸伪善谬误。”</p><p>比烂不可取。极端一点，我是否可以认为，基于你的说法，连交警都可能无法依法规劝违规行为，因为你无法保证 TA 曾经是否也违反过交规？</p><blockquote><p>交警的依规处理国家赋予的权利，你一个普通公民有执法权？</p></blockquote><p>我有说 “执法” 吗？我说的是依法 “规劝”：“公民以规劝维护公共安全，如劝阻公交车纠纷时体现的正当性受到司法保护” 当然，交警的执法权利有法律保护，这是事实。但是，其他人就不能 “规劝” 他人守法吗？</p><p>“对违反道路交通安全的行为，任何人都有权劝阻和控告”——《福建省道路交通管理实施办法》（1991 年） “任何单位和个人都…… 有权劝阻、举报道路交通安全违法行为，报告道路交通安全隐患”——《山东省实施道路交通安全责任制规定》/浙江省实施《中华人民共和国道路交通安全法》办法</p><blockquote><p>这件事属于规劝吗？在网上骂，输出情绪，真规劝当场啊</p><p>说白了，法律上你要不当场和他吵，在网上说没屁用，道德上，你自己都在违法，有什么立场，己所不欲勿施于人，真正解决问题，也没有，都在输出情绪</p></blockquote><p>首先，“规劝” 不限于线下，否则各类安全公众号所发布的内容都是无用功——毕竟线上劝没用，一定要现实中 “不撞南墙不回头”；其次，我一再强调，“违规过” 不代表不能 “批评”；再者，不能立刻解决问题不等于没价值，不说才是真正永远解决不了问题。最后，互联网确实是情绪化的。</p><p>“社交平台成为公众抒发个人意见、释放情绪，缓解生活压力的主要渠道”。按你的说法，我也可以认为，除非你没有过在互联网上 “输出情绪” 的时候，否则你也没有权利去阻止别人 “情绪输出”；你的回复同样没有解决问题，甚至可能扩大化了问题。那么，我的建议是：把嘴巴闭一闭</p><blockquote><p>第一，在原贴发言的没有规劝意味，只是骂，我不认为有帮助，公众号是在温和劝导，方式不对，效果不同，这样只会骂战，无意义，第二，违规过可以批评，前提是你改了，问题是所有在这边骂的人，在对自己的时候就开始双标，他在这边骂，下次自己开车一样违反，一样不带头盔，他有什么资格骂他人，事实上他自己和你都清楚这是不可避免的，但还在骂，只不过是在网上看不到你们自己的丑态，可以对一个虚拟形象施暴，展现自己的道德优越，第三，我不是在阻止情绪输出，我在反对过度理想化的非黑即白，我在请求在网络环境进行有意义的可实施性方案的探讨，而不是对立，双方输出情绪，让问题回归问题</p></blockquote><p>1. 情绪输出中也有 TA 的观点表达；温和劝导也未必能引导有效讨论 2. 你无从知道对方是否 “改过” 3. 擅自将网络后的每个人都认为 “可能犯过法”，是否也是一种 “非黑即白”？</p><blockquote><p>你 23 点罔顾现实</p></blockquote><hr><p>closed as not continued</p>]]>
    </content>
    <id>https://watermelonabc.top/p/a4a1670e/</id>
    <link href="https://watermelonabc.top/p/a4a1670e/" rel="alternate"/>
    <published>2025-11-21T17:19:15.000Z</published>
    <summary>并不别样也不大的争吵</summary>
    <title>记一场贴吧交流</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="学习笔记" scheme="https://watermelonabc.top/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="CTF" scheme="https://watermelonabc.top/tags/CTF/"/>
    <category term="Reverse" scheme="https://watermelonabc.top/tags/Reverse/"/>
    <content>
      <![CDATA[<p>最近和学长们打了一些大比赛，看了下来发现 VMP 有点多哈 😅。总不能每次见到就投降吧。</p><h2 id="什么是-VMP"><a class="header-anchor" href="#什么是-VMP"></a>什么是 VMP</h2><p>VMP 全称是 “基于虚拟机的代码保护技术” (Virtual Machine-Based Protection)。当然，和各位可能听到过的 VMWare 等不太一样，程序保护中的 “虚拟机” 更多像 “解释器”：虚拟机先将原始代码翻译成其自己的专有字节码（这个过程称为虚拟化），然后在运行时解释并执行字节码对应语句。</p><p>专业点说，就是使用自己的一套指令集架构（指令、内存、寄存器、权限……）作为中间层，隐藏实际的通用架构指令。</p><p>这种保护技术的特点是，我们不能直接看到自己可能熟悉的原始指令；我们必须首先分析解释器，然后使用所获得的自定义指令集知识将专有字节码转换为我们熟悉的标准指令。</p><h2 id="最基础的-VM"><a class="header-anchor" href="#最基础的-VM"></a>最基础的 VM</h2><p>用 C 的 <code>switch-case</code> 语句就能构建一个非常简单的 VM：</p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">vm</span><span class="params">(<span class="type">int</span>* opcode, <span class="type">int</span> opleng)</span></span><br><span class="line">{</span><br><span class="line">  <span class="type">int</span> pc = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">if</span>(opleng &lt;= <span class="number">0</span>)</span><br><span class="line">  {</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Invaild length of opcode array\n"</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  {</span><br><span class="line">    <span class="keyword">while</span>(pc != opleng)</span><br><span class="line">    {</span><br><span class="line">      <span class="keyword">switch</span>(opcode[pc])</span><br><span class="line">      {</span><br><span class="line">        <span class="comment">// ...</span></span><br><span class="line">        <span class="keyword">default</span>:</span><br><span class="line">          <span class="built_in">printf</span>(<span class="string">"Invalid opcode: 0x%x at position %d\n"</span>, opcode[pc], pc);</span><br><span class="line">          <span class="keyword">return</span> <span class="number">2</span>;</span><br><span class="line">      }</span><br><span class="line">      pc++;</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">{</span><br><span class="line">  <span class="type">int</span> opcode[] = {...};</span><br><span class="line">  <span class="type">int</span> opleng = <span class="keyword">sizeof</span>(opcode) / <span class="keyword">sizeof</span>(opcode[<span class="number">0</span>]);</span><br><span class="line"></span><br><span class="line">  vm(opcode, opleng);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>这个 VM 会按顺序执行 <code>opcode[]</code> 定义的的字节码，通过 <code>switch(opcode[pc])</code> 指定如何解释字节码行为，还有基本的错误处理功能。</p><p>当然，这个 VM 是禁不住考验的：对于防守方，<code>opcode</code> 的复用性差劲，没有完全实现 “解释器” 功能；对于攻击方，整个架构太简单，VM 本身也变得需要保护。</p><h2 id="从计组讲起"><a class="header-anchor" href="#从计组讲起"></a>从计组讲起</h2><p>指令执行的五个阶段分为取指 (Fetch)、译码 (Decode)、执行 (Execute)、访存、写回。VM 就是要部分模拟这个过程，一般是取指、译码、分发 (Dispatch)、执行。其中分发环节是 VM 设计的重点。</p><p>我们上面给出的简单 VM 就演示了 switch-case dispatch 这种分发方式。</p><h2 id="以一道-CTF-题目为基础"><a class="header-anchor" href="#以一道-CTF-题目为基础"></a>以一道 CTF 题目为基础</h2><blockquote><p>L3HCTF 2025 easyvm</p><p>视频：<a href="https://www.bilibili.com/video/BV1jUpfzNEsv/">【星盟安全】L3HCTF 逆向方向 easyvm 讲解</a></p></blockquote><p>字符串定位主函数：</p><figure class="highlight cpp"><figcaption><span>main(partly)</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sub_140005940</span>();</span><br><span class="line">v2 = std::<span class="keyword">operator</span>&lt;&lt;&lt;std::char_traits&lt;<span class="type">char</span>&gt;&gt;(a1, a2, <span class="string">"Welcome to L3HCTF2025!!!Do you love cpp and vm?"</span>, &amp;std::cout);</span><br><span class="line">std::ostream::<span class="keyword">operator</span>&lt;&lt;(a1, a2, &amp;std::endl&lt;<span class="type">char</span>,std::char_traits&lt;<span class="type">char</span>&gt;&gt;, v2);</span><br><span class="line"><span class="built_in">sub_140011D30</span>(a1, a2, v3, v29, v4, v5);</span><br><span class="line"><span class="built_in">sub_140017DF0</span>(a1, a2, &amp;unk_140022040, v28, v6, v7);</span><br><span class="line"><span class="built_in">sub_140010700</span>(a1, a2, v28, v29, v8, v9);</span><br><span class="line">v10 = std::<span class="keyword">operator</span>&lt;&lt;&lt;std::char_traits&lt;<span class="type">char</span>&gt;&gt;(a1, a2, <span class="string">"Explore this virtual machine and have fun!"</span>, &amp;std::cout);</span><br><span class="line">std::ostream::<span class="keyword">operator</span>&lt;&lt;(a1, a2, &amp;std::endl&lt;<span class="type">char</span>,std::char_traits&lt;<span class="type">char</span>&gt;&gt;, v10);</span><br><span class="line">v11 = std::<span class="keyword">operator</span>&lt;&lt;&lt;std::char_traits&lt;<span class="type">char</span>&gt;&gt;(a1, a2, <span class="string">"Plz show me flag:"</span>, &amp;std::cout);</span><br><span class="line">std::ostream::<span class="keyword">operator</span>&lt;&lt;(a1, a2, &amp;std::endl&lt;<span class="type">char</span>,std::char_traits&lt;<span class="type">char</span>&gt;&gt;, v11);</span><br><span class="line"><span class="built_in">sub_140011C40</span>(a1, a2, v12, v29, v13, v14);</span><br><span class="line"><span class="built_in">sub_140011AB0</span>(a1, a2, v15, v29, v16, v17);</span><br><span class="line"><span class="built_in">sub_140011AE0</span>(a1, a2, v18, v29, v19, v20);</span><br><span class="line"><span class="built_in">sub_140017FC0</span>(a1, a2, v21, v28, v22, v23);</span><br><span class="line"><span class="built_in">sub_140011DE0</span>(a1, a2, v24, v29, v25, v26);</span><br></pre></td></tr></tbody></table></figure><p>我们主要看提示输入 flag 后的这 4 个函数。</p><p><code>sub_140011C40</code> 里面有一个格式化字符串 <code>%s</code>，猜测作用是读取输入的 flag。</p><p><code>sub_140011AB0</code> 内的 <code>sub_1400107E0</code> 里有着大量的 <code>switch-case</code> 结构：</p><figure class="highlight cpp"><figcaption><span>sub_1400107E0</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br><span class="line">547</span><br><span class="line">548</span><br><span class="line">549</span><br><span class="line">550</span><br><span class="line">551</span><br><span class="line">552</span><br><span class="line">553</span><br><span class="line">554</span><br><span class="line">555</span><br><span class="line">556</span><br><span class="line">557</span><br><span class="line">558</span><br><span class="line">559</span><br><span class="line">560</span><br><span class="line">561</span><br><span class="line">562</span><br><span class="line">563</span><br><span class="line">564</span><br><span class="line">565</span><br><span class="line">566</span><br><span class="line">567</span><br><span class="line">568</span><br><span class="line">569</span><br><span class="line">570</span><br><span class="line">571</span><br><span class="line">572</span><br><span class="line">573</span><br><span class="line">574</span><br><span class="line">575</span><br><span class="line">576</span><br><span class="line">577</span><br><span class="line">578</span><br><span class="line">579</span><br><span class="line">580</span><br><span class="line">581</span><br><span class="line">582</span><br><span class="line">583</span><br><span class="line">584</span><br><span class="line">585</span><br><span class="line">586</span><br><span class="line">587</span><br><span class="line">588</span><br><span class="line">589</span><br><span class="line">590</span><br><span class="line">591</span><br><span class="line">592</span><br><span class="line">593</span><br><span class="line">594</span><br><span class="line">595</span><br><span class="line">596</span><br><span class="line">597</span><br><span class="line">598</span><br><span class="line">599</span><br><span class="line">600</span><br><span class="line">601</span><br><span class="line">602</span><br><span class="line">603</span><br><span class="line">604</span><br><span class="line">605</span><br><span class="line">606</span><br><span class="line">607</span><br><span class="line">608</span><br><span class="line">609</span><br><span class="line">610</span><br><span class="line">611</span><br><span class="line">612</span><br><span class="line">613</span><br><span class="line">614</span><br><span class="line">615</span><br><span class="line">616</span><br><span class="line">617</span><br><span class="line">618</span><br><span class="line">619</span><br><span class="line">620</span><br><span class="line">621</span><br><span class="line">622</span><br><span class="line">623</span><br><span class="line">624</span><br><span class="line">625</span><br><span class="line">626</span><br><span class="line">627</span><br><span class="line">628</span><br><span class="line">629</span><br><span class="line">630</span><br><span class="line">631</span><br><span class="line">632</span><br><span class="line">633</span><br><span class="line">634</span><br><span class="line">635</span><br><span class="line">636</span><br><span class="line">637</span><br><span class="line">638</span><br><span class="line">639</span><br><span class="line">640</span><br><span class="line">641</span><br><span class="line">642</span><br><span class="line">643</span><br><span class="line">644</span><br><span class="line">645</span><br><span class="line">646</span><br><span class="line">647</span><br><span class="line">648</span><br><span class="line">649</span><br><span class="line">650</span><br><span class="line">651</span><br><span class="line">652</span><br><span class="line">653</span><br><span class="line">654</span><br><span class="line">655</span><br><span class="line">656</span><br><span class="line">657</span><br><span class="line">658</span><br><span class="line">659</span><br><span class="line">660</span><br><span class="line">661</span><br><span class="line">662</span><br><span class="line">663</span><br><span class="line">664</span><br><span class="line">665</span><br><span class="line">666</span><br><span class="line">667</span><br><span class="line">668</span><br><span class="line">669</span><br><span class="line">670</span><br><span class="line">671</span><br><span class="line">672</span><br><span class="line">673</span><br><span class="line">674</span><br><span class="line">675</span><br><span class="line">676</span><br><span class="line">677</span><br><span class="line">678</span><br><span class="line">679</span><br><span class="line">680</span><br><span class="line">681</span><br><span class="line">682</span><br><span class="line">683</span><br><span class="line">684</span><br><span class="line">685</span><br><span class="line">686</span><br><span class="line">687</span><br><span class="line">688</span><br><span class="line">689</span><br><span class="line">690</span><br><span class="line">691</span><br><span class="line">692</span><br><span class="line">693</span><br><span class="line">694</span><br><span class="line">695</span><br><span class="line">696</span><br><span class="line">697</span><br><span class="line">698</span><br><span class="line">699</span><br><span class="line">700</span><br><span class="line">701</span><br><span class="line">702</span><br><span class="line">703</span><br><span class="line">704</span><br><span class="line">705</span><br><span class="line">706</span><br><span class="line">707</span><br><span class="line">708</span><br><span class="line">709</span><br><span class="line">710</span><br><span class="line">711</span><br><span class="line">712</span><br><span class="line">713</span><br><span class="line">714</span><br><span class="line">715</span><br><span class="line">716</span><br><span class="line">717</span><br><span class="line">718</span><br><span class="line">719</span><br><span class="line">720</span><br><span class="line">721</span><br><span class="line">722</span><br><span class="line">723</span><br><span class="line">724</span><br><span class="line">725</span><br><span class="line">726</span><br><span class="line">727</span><br><span class="line">728</span><br><span class="line">729</span><br><span class="line">730</span><br><span class="line">731</span><br><span class="line">732</span><br><span class="line">733</span><br><span class="line">734</span><br><span class="line">735</span><br><span class="line">736</span><br><span class="line">737</span><br><span class="line">738</span><br><span class="line">739</span><br><span class="line">740</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">__int64 __fastcall <span class="title">sub_1400107E0</span><span class="params">(<span class="type">void</span> *Ix, <span class="type">int</span> a2, <span class="type">int</span> a3, __int64 a4, <span class="type">int</span> a5, <span class="type">int</span> a6)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">  <span class="type">unsigned</span> __int64 v6; <span class="comment">// rbx</span></span><br><span class="line">  <span class="type">int</span> v7; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v8; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v11; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v12; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v13; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">unsigned</span> __int8 n2; <span class="comment">// al</span></span><br><span class="line">  <span class="type">int</span> v15; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v16; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v17; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v18; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v19; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v20; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v21; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v22; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v23; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v24; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v25; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v26; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v27; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v28; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v29; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v30; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v31; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v32; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v33; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v34; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v35; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v36; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v37; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v38; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v39; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v40; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v41; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v42; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v43; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v44; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v45; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v46; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v47; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v48; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v49; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v50; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v51; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v52; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v53; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v54; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v55; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v56; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v57; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v58; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v59; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v60; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v61; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v62; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v63; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v64; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v65; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v66; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v67; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v68; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v69; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v70; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v71; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v72; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v73; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v74; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v75; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v76; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v77; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v78; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v79; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v80; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v81; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v82; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v83; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v84; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v85; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v86; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v87; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v88; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v89; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v90; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v91; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v92; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v93; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v94; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v95; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v96; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v97; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v98; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v99; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v100; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v101; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v102; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v103; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v104; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v105; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v106; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v107; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v108; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v109; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v110; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v111; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v112; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v113; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v114; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v115; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v116; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v117; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v118; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v119; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v120; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v121; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v122; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v123; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v124; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v125; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v126; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v127; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v128; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v129; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v130; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v131; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v132; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v133; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v134; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v135; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v136; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v137; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v138; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v139; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v140; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v141; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v142; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v143; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v144; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v145; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v146; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v147; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v148; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v149; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v150; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v151; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v152; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v153; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v154; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v155; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v156; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v157; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v158; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v159; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v160; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v161; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v162; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v163; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v164; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v165; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v166; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v167; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v168; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v169; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v170; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v171; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v172; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v173; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v174; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v175; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v176; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v177; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v178; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v179; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v180; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v181; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v182; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v183; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v184; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v185; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v186; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v187; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v188; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v189; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v190; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v191; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v192; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v193; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v194; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v195; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v196; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v197; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v198; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v199; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v200; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v201; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v202; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v203; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v204; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v205; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v206; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v207; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v208; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v209; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v210; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v211; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v212; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v213; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v214; <span class="comment">// r9d</span></span><br><span class="line">  BOOL v215; <span class="comment">// eax</span></span><br><span class="line">  <span class="type">int</span> v216; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v217; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v218; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v219; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v220; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v221; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v222; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v223; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v224; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v225; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v226; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v227; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v228; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v229; <span class="comment">// r9d</span></span><br><span class="line">  BOOL v230; <span class="comment">// eax</span></span><br><span class="line">  <span class="type">int</span> v231; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v232; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v233; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v234; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v235; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v236; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v237; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v238; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v239; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v240; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v241; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v242; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v243; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v244; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v245; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v246; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v247; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v248; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v249; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v250; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v251; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v252; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v253; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v254; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v255; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v256; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v257; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v258; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v259; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v260; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v261; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v262; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v263; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v264; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v265; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v266; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v267; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v268; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v269; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v270; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v271; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v272; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v273; <span class="comment">// eax</span></span><br><span class="line">  <span class="type">int</span> v274; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v275; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v276; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v277; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v278; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v279; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v280; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v281; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v282; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v283; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v284; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v285; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v286; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v287; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v288; <span class="comment">// ebx</span></span><br><span class="line">  <span class="type">int</span> v289; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v290; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v291; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v292; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v293; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v294; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v295; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v296; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v297; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v298; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v299; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v300; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v301; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v302; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v303; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v304; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v305; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v306; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v307; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v308; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v309; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v310; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v311; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v312; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v313; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v314; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v315; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v316; <span class="comment">// r9d</span></span><br><span class="line">  <span class="type">int</span> v317; <span class="comment">// edx</span></span><br><span class="line">  <span class="type">int</span> v318; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v319; <span class="comment">// r9d</span></span><br><span class="line">  __int64 *v320; <span class="comment">// rax</span></span><br><span class="line">  __int64 v321; <span class="comment">// rdx</span></span><br><span class="line">  <span class="type">int</span> v322; <span class="comment">// r8d</span></span><br><span class="line">  <span class="type">int</span> v323; <span class="comment">// r9d</span></span><br><span class="line">  __int64 v324; <span class="comment">// [rsp+0h] [rbp-80h]</span></span><br><span class="line">  __int64 v325; <span class="comment">// [rsp+0h] [rbp-80h]</span></span><br><span class="line">  __int64 v326; <span class="comment">// [rsp+0h] [rbp-80h]</span></span><br><span class="line">  __int64 v327; <span class="comment">// [rsp+8h] [rbp-78h]</span></span><br><span class="line">  <span class="type">int</span> v328; <span class="comment">// [rsp+28h] [rbp-58h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v329; <span class="comment">// [rsp+2Ch] [rbp-54h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v330; <span class="comment">// [rsp+30h] [rbp-50h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v331; <span class="comment">// [rsp+34h] [rbp-4Ch] BYREF</span></span><br><span class="line">  <span class="type">int</span> v332; <span class="comment">// [rsp+38h] [rbp-48h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v333; <span class="comment">// [rsp+3Ch] [rbp-44h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v334; <span class="comment">// [rsp+40h] [rbp-40h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v335; <span class="comment">// [rsp+44h] [rbp-3Ch] BYREF</span></span><br><span class="line">  <span class="type">int</span> v336; <span class="comment">// [rsp+48h] [rbp-38h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v337; <span class="comment">// [rsp+4Ch] [rbp-34h] BYREF</span></span><br><span class="line">  BOOL v338; <span class="comment">// [rsp+50h] [rbp-30h] BYREF</span></span><br><span class="line">  BOOL v339; <span class="comment">// [rsp+54h] [rbp-2Ch] BYREF</span></span><br><span class="line">  BOOL v340; <span class="comment">// [rsp+58h] [rbp-28h] BYREF</span></span><br><span class="line">  BOOL v341; <span class="comment">// [rsp+5Ch] [rbp-24h] BYREF</span></span><br><span class="line">  BOOL v342; <span class="comment">// [rsp+60h] [rbp-20h] BYREF</span></span><br><span class="line">  BOOL v343; <span class="comment">// [rsp+64h] [rbp-1Ch] BYREF</span></span><br><span class="line">  BOOL v344; <span class="comment">// [rsp+68h] [rbp-18h] BYREF</span></span><br><span class="line">  BOOL v345; <span class="comment">// [rsp+6Ch] [rbp-14h] BYREF</span></span><br><span class="line">  BOOL v346; <span class="comment">// [rsp+70h] [rbp-10h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v347; <span class="comment">// [rsp+74h] [rbp-Ch] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v348; <span class="comment">// [rsp+78h] [rbp-8h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v349; <span class="comment">// [rsp+7Ch] [rbp-4h] BYREF</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v350; <span class="comment">// [rsp+80h] [rbp+0h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v351; <span class="comment">// [rsp+84h] [rbp+4h] BYREF</span></span><br><span class="line">  __int64 v352; <span class="comment">// [rsp+88h] [rbp+8h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v353; <span class="comment">// [rsp+90h] [rbp+10h]</span></span><br><span class="line">  <span class="type">int</span> v354; <span class="comment">// [rsp+94h] [rbp+14h]</span></span><br><span class="line">  <span class="type">int</span> v355; <span class="comment">// [rsp+98h] [rbp+18h]</span></span><br><span class="line">  <span class="type">int</span> v356; <span class="comment">// [rsp+9Ch] [rbp+1Ch]</span></span><br><span class="line">  <span class="type">int</span> v357; <span class="comment">// [rsp+A0h] [rbp+20h]</span></span><br><span class="line">  <span class="type">int</span> v358; <span class="comment">// [rsp+A4h] [rbp+24h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v359; <span class="comment">// [rsp+A8h] [rbp+28h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v360; <span class="comment">// [rsp+ACh] [rbp+2Ch]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v361; <span class="comment">// [rsp+B0h] [rbp+30h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v362; <span class="comment">// [rsp+B4h] [rbp+34h]</span></span><br><span class="line">  <span class="type">int</span> v363; <span class="comment">// [rsp+B8h] [rbp+38h]</span></span><br><span class="line">  <span class="type">int</span> v364; <span class="comment">// [rsp+BCh] [rbp+3Ch]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v365; <span class="comment">// [rsp+C0h] [rbp+40h]</span></span><br><span class="line">  <span class="type">int</span> v366; <span class="comment">// [rsp+C4h] [rbp+44h]</span></span><br><span class="line">  <span class="type">int</span> v367; <span class="comment">// [rsp+C8h] [rbp+48h]</span></span><br><span class="line">  <span class="type">int</span> v368; <span class="comment">// [rsp+CCh] [rbp+4Ch]</span></span><br><span class="line">  <span class="type">int</span> v369; <span class="comment">// [rsp+D0h] [rbp+50h]</span></span><br><span class="line">  <span class="type">int</span> v370; <span class="comment">// [rsp+D4h] [rbp+54h]</span></span><br><span class="line">  <span class="type">int</span> v371; <span class="comment">// [rsp+D8h] [rbp+58h]</span></span><br><span class="line">  <span class="type">int</span> v372; <span class="comment">// [rsp+DCh] [rbp+5Ch]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v373; <span class="comment">// [rsp+E0h] [rbp+60h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v374; <span class="comment">// [rsp+E4h] [rbp+64h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v375; <span class="comment">// [rsp+E8h] [rbp+68h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v376; <span class="comment">// [rsp+ECh] [rbp+6Ch]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v377; <span class="comment">// [rsp+F0h] [rbp+70h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v378; <span class="comment">// [rsp+F4h] [rbp+74h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v379; <span class="comment">// [rsp+F8h] [rbp+78h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v380; <span class="comment">// [rsp+FCh] [rbp+7Ch]</span></span><br><span class="line">  <span class="type">int</span> v381; <span class="comment">// [rsp+100h] [rbp+80h]</span></span><br><span class="line">  <span class="type">int</span> v382; <span class="comment">// [rsp+104h] [rbp+84h]</span></span><br><span class="line">  <span class="type">int</span> v383; <span class="comment">// [rsp+108h] [rbp+88h]</span></span><br><span class="line">  <span class="type">int</span> v384; <span class="comment">// [rsp+10Ch] [rbp+8Ch]</span></span><br><span class="line">  <span class="type">int</span> v385; <span class="comment">// [rsp+110h] [rbp+90h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v386; <span class="comment">// [rsp+114h] [rbp+94h]</span></span><br><span class="line">  <span class="type">int</span> v387; <span class="comment">// [rsp+118h] [rbp+98h]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v388; <span class="comment">// [rsp+11Ch] [rbp+9Ch]</span></span><br><span class="line">  <span class="type">int</span> v389; <span class="comment">// [rsp+120h] [rbp+A0h]</span></span><br><span class="line">  <span class="type">int</span> v390; <span class="comment">// [rsp+124h] [rbp+A4h]</span></span><br><span class="line">  __int64 v391; <span class="comment">// [rsp+128h] [rbp+A8h]</span></span><br><span class="line"></span><br><span class="line">  v6 = *(a4 + <span class="number">240</span>);</span><br><span class="line">  <span class="keyword">if</span> ( v6 &gt;= <span class="built_in">sub_140012B20</span>(Ix, a2, a3, a4, a5, a6) || *(a4 + <span class="number">248</span>) )</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">  v391 = <span class="built_in">sub_140018360</span>(Ix, a2, *(a4 + <span class="number">240</span>), a4, v7, v8);</span><br><span class="line">  n2 = *v391;</span><br><span class="line">  <span class="keyword">if</span> ( *v391 == <span class="number">0xFF</span> )</span><br><span class="line">  {</span><br><span class="line">    *(a4 + <span class="number">248</span>) = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  {</span><br><span class="line">    <span class="keyword">if</span> ( n2 &lt; <span class="number">0x60u</span> )</span><br><span class="line">    {</span><br><span class="line">      <span class="keyword">if</span> ( n2 == <span class="number">84</span> )</span><br><span class="line">      {</span><br><span class="line">        <span class="keyword">if</span> ( <span class="built_in">sub_140012AD0</span>(Ix, a2, v11, a4 + <span class="number">160</span>, v12, v13) != <span class="number">1</span> )</span><br><span class="line">        {</span><br><span class="line">          v320 = <span class="built_in">sub_1400178A0</span>(Ix, a2, v317, a4 + <span class="number">160</span>, v318, v319);</span><br><span class="line">          v321 = *v320;</span><br><span class="line">          *(a4 + <span class="number">240</span>) = *v320;</span><br><span class="line">          <span class="built_in">sub_140017840</span>(Ix, a2, v321, a4 + <span class="number">160</span>, v322, v323);</span><br><span class="line">          <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">        }</span><br><span class="line">      }</span><br><span class="line">      <span class="keyword">else</span> <span class="keyword">if</span> ( n2 &lt;= <span class="number">0x54u</span> )</span><br><span class="line">      {</span><br><span class="line">        <span class="keyword">switch</span> ( n2 )</span><br><span class="line">        {</span><br><span class="line">          <span class="keyword">case</span> <span class="string">'S'</span>:</span><br><span class="line">            v352 = *(a4 + <span class="number">240</span>) + <span class="number">1LL</span>;</span><br><span class="line">            <span class="built_in">sub_140017900</span>(Ix, a2, &amp;v352, a4 + <span class="number">160</span>, v12, v13);</span><br><span class="line">            *(a4 + <span class="number">240</span>) = *(v391 + <span class="number">4</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">          <span class="keyword">case</span> <span class="string">'R'</span>:</span><br><span class="line">            <span class="keyword">if</span> ( <span class="built_in">sub_140012AB0</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) != <span class="number">1</span> )</span><br><span class="line">            {</span><br><span class="line">              v390 = *<span class="built_in">sub_140017720</span>(Ix, a2, v297, a4 + <span class="number">24</span>, v298, v299);</span><br><span class="line">              <span class="built_in">sub_1400176C0</span>(Ix, a2, v300, a4 + <span class="number">24</span>, v301, v302);</span><br><span class="line">              <span class="keyword">if</span> ( v390 )</span><br><span class="line">              {</span><br><span class="line">                *(a4 + <span class="number">240</span>) = *(v391 + <span class="number">4</span>);</span><br><span class="line">                <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">              }</span><br><span class="line">            }</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">          <span class="keyword">case</span> <span class="string">'Q'</span>:</span><br><span class="line">            <span class="keyword">if</span> ( <span class="built_in">sub_140012AB0</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) != <span class="number">1</span> )</span><br><span class="line">            {</span><br><span class="line">              v389 = *<span class="built_in">sub_140017720</span>(Ix, a2, v291, a4 + <span class="number">24</span>, v292, v293);</span><br><span class="line">              <span class="built_in">sub_1400176C0</span>(Ix, a2, v294, a4 + <span class="number">24</span>, v295, v296);</span><br><span class="line">              <span class="keyword">if</span> ( !v389 )</span><br><span class="line">              {</span><br><span class="line">                *(a4 + <span class="number">240</span>) = *(v391 + <span class="number">4</span>);</span><br><span class="line">                <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">              }</span><br><span class="line">            }</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">          <span class="keyword">case</span> <span class="string">'P'</span>:</span><br><span class="line">            *(a4 + <span class="number">240</span>) = *(v391 + <span class="number">4</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">          <span class="keyword">case</span> <span class="string">'A'</span>:</span><br><span class="line">            <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">            {</span><br><span class="line">              v388 = *<span class="built_in">sub_140017720</span>(Ix, a2, v276, a4 + <span class="number">24</span>, v277, v278);</span><br><span class="line">              <span class="built_in">sub_1400176C0</span>(Ix, a2, v279, a4 + <span class="number">24</span>, v280, v281);</span><br><span class="line">              v387 = *<span class="built_in">sub_140017720</span>(Ix, a2, v282, a4 + <span class="number">24</span>, v283, v284);</span><br><span class="line">              <span class="built_in">sub_1400176C0</span>(Ix, a2, v285, a4 + <span class="number">24</span>, v286, v287);</span><br><span class="line">              v288 = v387;</span><br><span class="line">              v350 = v388;</span><br><span class="line">              *<span class="built_in">sub_140015400</span>(Ix, a2, &amp;v350, a4 + <span class="number">104</span>, v289, v290, v324, v327) = v288;</span><br><span class="line">            }</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">          <span class="keyword">default</span>:</span><br><span class="line">            <span class="keyword">if</span> ( n2 &lt;= <span class="number">0x41u</span> )</span><br><span class="line">            {</span><br><span class="line">              <span class="keyword">if</span> ( n2 == <span class="number">64</span> )</span><br><span class="line">              {</span><br><span class="line">                <span class="keyword">if</span> ( <span class="built_in">sub_140012AB0</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) != <span class="number">1</span> )</span><br><span class="line">                {</span><br><span class="line">                  v386 = *<span class="built_in">sub_140017720</span>(Ix, a2, v265, a4 + <span class="number">24</span>, v266, v267);</span><br><span class="line">                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v268, a4 + <span class="number">24</span>, v269, v270);</span><br><span class="line">                  v349 = v386;</span><br><span class="line">                  v273 = <span class="built_in">sub_140015400</span>(Ix, a2, &amp;v349, a4 + <span class="number">104</span>, v271, v272, v324, v327);</span><br><span class="line">                  <span class="built_in">sub_1400177B0</span>(Ix, a2, v273, a4 + <span class="number">24</span>, v274, v275, v326);</span><br><span class="line">                }</span><br><span class="line">              }</span><br><span class="line">              <span class="keyword">else</span> <span class="keyword">if</span> ( n2 == <span class="number">50</span> )</span><br><span class="line">              {</span><br><span class="line">                <span class="keyword">if</span> ( <span class="built_in">sub_140012AB0</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) != <span class="number">1</span> )</span><br><span class="line">                {</span><br><span class="line">                  v385 = *<span class="built_in">sub_140017720</span>(Ix, a2, v231, a4 + <span class="number">24</span>, v232, v233);</span><br><span class="line">                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v234, a4 + <span class="number">24</span>, v235, v236);</span><br><span class="line">                  v346 = v385 == <span class="number">0</span>;</span><br><span class="line">                  <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v346, a4 + <span class="number">24</span>, v237, v238);</span><br><span class="line">                }</span><br><span class="line">              }</span><br><span class="line">              <span class="keyword">else</span> <span class="keyword">if</span> ( n2 &lt;= <span class="number">0x32u</span> )</span><br><span class="line">              {</span><br><span class="line">                <span class="keyword">switch</span> ( n2 )</span><br><span class="line">                {</span><br><span class="line">                  <span class="keyword">case</span> <span class="string">'1'</span>:</span><br><span class="line">                    <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                    {</span><br><span class="line">                      v384 = *<span class="built_in">sub_140017720</span>(Ix, a2, v216, a4 + <span class="number">24</span>, v217, v218);</span><br><span class="line">                      <span class="built_in">sub_1400176C0</span>(Ix, a2, v219, a4 + <span class="number">24</span>, v220, v221);</span><br><span class="line">                      v383 = *<span class="built_in">sub_140017720</span>(Ix, a2, v222, a4 + <span class="number">24</span>, v223, v224);</span><br><span class="line">                      <span class="built_in">sub_1400176C0</span>(Ix, a2, v225, a4 + <span class="number">24</span>, v226, v227);</span><br><span class="line">                      v230 = v383 || v384;</span><br><span class="line">                      v345 = v230;</span><br><span class="line">                      <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v345, a4 + <span class="number">24</span>, v228, v229);</span><br><span class="line">                    }</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                  <span class="keyword">case</span> <span class="string">'0'</span>:</span><br><span class="line">                    <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                    {</span><br><span class="line">                      v382 = *<span class="built_in">sub_140017720</span>(Ix, a2, v201, a4 + <span class="number">24</span>, v202, v203);</span><br><span class="line">                      <span class="built_in">sub_1400176C0</span>(Ix, a2, v204, a4 + <span class="number">24</span>, v205, v206);</span><br><span class="line">                      v381 = *<span class="built_in">sub_140017720</span>(Ix, a2, v207, a4 + <span class="number">24</span>, v208, v209);</span><br><span class="line">                      <span class="built_in">sub_1400176C0</span>(Ix, a2, v210, a4 + <span class="number">24</span>, v211, v212);</span><br><span class="line">                      v215 = v381 &amp;&amp; v382;</span><br><span class="line">                      v344 = v215;</span><br><span class="line">                      <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v344, a4 + <span class="number">24</span>, v213, v214);</span><br><span class="line">                    }</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                  <span class="keyword">case</span> <span class="string">'%'</span>:</span><br><span class="line">                    <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                    {</span><br><span class="line">                      v380 = *<span class="built_in">sub_140017720</span>(Ix, a2, v187, a4 + <span class="number">24</span>, v188, v189);</span><br><span class="line">                      <span class="built_in">sub_1400176C0</span>(Ix, a2, v190, a4 + <span class="number">24</span>, v191, v192);</span><br><span class="line">                      v379 = *<span class="built_in">sub_140017720</span>(Ix, a2, v193, a4 + <span class="number">24</span>, v194, v195);</span><br><span class="line">                      <span class="built_in">sub_1400176C0</span>(Ix, a2, v196, a4 + <span class="number">24</span>, v197, v198);</span><br><span class="line">                      v343 = v379 &gt;= v380;</span><br><span class="line">                      <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v343, a4 + <span class="number">24</span>, v199, v200);</span><br><span class="line">                    }</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                  <span class="keyword">default</span>:</span><br><span class="line">                    <span class="keyword">if</span> ( n2 &lt;= <span class="number">0x25u</span> )</span><br><span class="line">                    {</span><br><span class="line">                      <span class="keyword">switch</span> ( n2 )</span><br><span class="line">                      {</span><br><span class="line">                        <span class="keyword">case</span> <span class="number">0x24u</span>:</span><br><span class="line">                          <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                          {</span><br><span class="line">                            v378 = *<span class="built_in">sub_140017720</span>(Ix, a2, v173, a4 + <span class="number">24</span>, v174, v175);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v176, a4 + <span class="number">24</span>, v177, v178);</span><br><span class="line">                            v377 = *<span class="built_in">sub_140017720</span>(Ix, a2, v179, a4 + <span class="number">24</span>, v180, v181);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v182, a4 + <span class="number">24</span>, v183, v184);</span><br><span class="line">                            v342 = v378 &lt; v377;</span><br><span class="line">                            <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v342, a4 + <span class="number">24</span>, v185, v186);</span><br><span class="line">                          }</span><br><span class="line">                          <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="number">0x23u</span>:</span><br><span class="line">                          <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                          {</span><br><span class="line">                            v376 = *<span class="built_in">sub_140017720</span>(Ix, a2, v159, a4 + <span class="number">24</span>, v160, v161);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v162, a4 + <span class="number">24</span>, v163, v164);</span><br><span class="line">                            v375 = *<span class="built_in">sub_140017720</span>(Ix, a2, v165, a4 + <span class="number">24</span>, v166, v167);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v168, a4 + <span class="number">24</span>, v169, v170);</span><br><span class="line">                            v341 = v376 &gt;= v375;</span><br><span class="line">                            <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v341, a4 + <span class="number">24</span>, v171, v172);</span><br><span class="line">                          }</span><br><span class="line">                          <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="number">0x22u</span>:</span><br><span class="line">                          <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                          {</span><br><span class="line">                            v374 = *<span class="built_in">sub_140017720</span>(Ix, a2, v145, a4 + <span class="number">24</span>, v146, v147);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v148, a4 + <span class="number">24</span>, v149, v150);</span><br><span class="line">                            v373 = *<span class="built_in">sub_140017720</span>(Ix, a2, v151, a4 + <span class="number">24</span>, v152, v153);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v154, a4 + <span class="number">24</span>, v155, v156);</span><br><span class="line">                            v340 = v373 &lt; v374;</span><br><span class="line">                            <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v340, a4 + <span class="number">24</span>, v157, v158);</span><br><span class="line">                          }</span><br><span class="line">                          <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="number">0x21u</span>:</span><br><span class="line">                          <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                          {</span><br><span class="line">                            v372 = *<span class="built_in">sub_140017720</span>(Ix, a2, v131, a4 + <span class="number">24</span>, v132, v133);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v134, a4 + <span class="number">24</span>, v135, v136);</span><br><span class="line">                            v371 = *<span class="built_in">sub_140017720</span>(Ix, a2, v137, a4 + <span class="number">24</span>, v138, v139);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v140, a4 + <span class="number">24</span>, v141, v142);</span><br><span class="line">                            v339 = v371 != v372;</span><br><span class="line">                            <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v339, a4 + <span class="number">24</span>, v143, v144);</span><br><span class="line">                          }</span><br><span class="line">                          <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="number">0x20u</span>:</span><br><span class="line">                          <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                          {</span><br><span class="line">                            v370 = *<span class="built_in">sub_140017720</span>(Ix, a2, v117, a4 + <span class="number">24</span>, v118, v119);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v120, a4 + <span class="number">24</span>, v121, v122);</span><br><span class="line">                            v369 = *<span class="built_in">sub_140017720</span>(Ix, a2, v123, a4 + <span class="number">24</span>, v124, v125);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v126, a4 + <span class="number">24</span>, v127, v128);</span><br><span class="line">                            v338 = v369 == v370;</span><br><span class="line">                            <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v338, a4 + <span class="number">24</span>, v129, v130);</span><br><span class="line">                          }</span><br><span class="line">                          <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">case</span> <span class="number">0x18u</span>:</span><br><span class="line">                          <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                          {</span><br><span class="line">                            v368 = *<span class="built_in">sub_140017720</span>(Ix, a2, v303, a4 + <span class="number">24</span>, v304, v305);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v306, a4 + <span class="number">24</span>, v307, v308);</span><br><span class="line">                            v367 = *<span class="built_in">sub_140017720</span>(Ix, a2, v309, a4 + <span class="number">24</span>, v310, v311);</span><br><span class="line">                            <span class="built_in">sub_1400176C0</span>(Ix, a2, v312, a4 + <span class="number">24</span>, v313, v314);</span><br><span class="line">                            v351 = v368 ^ v367;</span><br><span class="line">                            <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v351, a4 + <span class="number">24</span>, v315, v316);</span><br><span class="line">                          }</span><br><span class="line">                          <span class="keyword">break</span>;</span><br><span class="line">                        <span class="keyword">default</span>:</span><br><span class="line">                          <span class="keyword">if</span> ( n2 &lt;= <span class="number">0x18u</span> )</span><br><span class="line">                          {</span><br><span class="line">                            <span class="keyword">switch</span> ( n2 )</span><br><span class="line">                            {</span><br><span class="line">                              <span class="keyword">case</span> <span class="number">0x17u</span>:</span><br><span class="line">                                <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                                {</span><br><span class="line">                                  v366 = *<span class="built_in">sub_140017720</span>(Ix, a2, v252, a4 + <span class="number">24</span>, v253, v254);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v255, a4 + <span class="number">24</span>, v256, v257);</span><br><span class="line">                                  v365 = *<span class="built_in">sub_140017720</span>(Ix, a2, v258, a4 + <span class="number">24</span>, v259, v260);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v261, a4 + <span class="number">24</span>, v262, v263);</span><br><span class="line">                                  v348 = v365 &gt;&gt; v366;</span><br><span class="line">                                  <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v348, a4 + <span class="number">24</span>, a4 + <span class="number">24</span>, v264);</span><br><span class="line">                                }</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                              <span class="keyword">case</span> <span class="number">0x16u</span>:</span><br><span class="line">                                <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                                {</span><br><span class="line">                                  v364 = *<span class="built_in">sub_140017720</span>(Ix, a2, v239, a4 + <span class="number">24</span>, v240, v241);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v242, a4 + <span class="number">24</span>, v243, v244);</span><br><span class="line">                                  v363 = *<span class="built_in">sub_140017720</span>(Ix, a2, v245, a4 + <span class="number">24</span>, v246, v247);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v248, a4 + <span class="number">24</span>, v249, v250);</span><br><span class="line">                                  v347 = v363 &lt;&lt; v364;</span><br><span class="line">                                  <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v347, a4 + <span class="number">24</span>, a4 + <span class="number">24</span>, v251);</span><br><span class="line">                                }</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                              <span class="keyword">case</span> <span class="number">0x15u</span>:</span><br><span class="line">                                <span class="keyword">if</span> ( <span class="built_in">sub_140012AB0</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) != <span class="number">1</span> )</span><br><span class="line">                                {</span><br><span class="line">                                  v328 = *<span class="built_in">sub_140017720</span>(Ix, a2, v109, a4 + <span class="number">24</span>, v110, v111);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v112, a4 + <span class="number">24</span>, v113, v114);</span><br><span class="line">                                  <span class="built_in">sub_1400177B0</span>(Ix, a2, &amp;v328, a4 + <span class="number">24</span>, v115, v116, v324);</span><br><span class="line">                                }</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                              <span class="keyword">case</span> <span class="number">0x14u</span>:</span><br><span class="line">                                <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                                {</span><br><span class="line">                                  v362 = *<span class="built_in">sub_140017720</span>(Ix, a2, v95, a4 + <span class="number">24</span>, v96, v97);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v98, a4 + <span class="number">24</span>, v99, v100);</span><br><span class="line">                                  v361 = *<span class="built_in">sub_140017720</span>(Ix, a2, v101, a4 + <span class="number">24</span>, v102, v103);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v104, a4 + <span class="number">24</span>, v105, v106);</span><br><span class="line">                                  <span class="keyword">if</span> ( v362 )</span><br><span class="line">                                  {</span><br><span class="line">                                    v337 = v361 % v362;</span><br><span class="line">                                    <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v337, a4 + <span class="number">24</span>, v107, v108);</span><br><span class="line">                                  }</span><br><span class="line">                                }</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                              <span class="keyword">case</span> <span class="number">0x13u</span>:</span><br><span class="line">                                <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                                {</span><br><span class="line">                                  v360 = *<span class="built_in">sub_140017720</span>(Ix, a2, v81, a4 + <span class="number">24</span>, v82, v83);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v84, a4 + <span class="number">24</span>, v85, v86);</span><br><span class="line">                                  v359 = *<span class="built_in">sub_140017720</span>(Ix, a2, v87, a4 + <span class="number">24</span>, v88, v89);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v90, a4 + <span class="number">24</span>, v91, v92);</span><br><span class="line">                                  <span class="keyword">if</span> ( v360 )</span><br><span class="line">                                  {</span><br><span class="line">                                    v336 = v359 / v360;</span><br><span class="line">                                    <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v336, a4 + <span class="number">24</span>, v93, v94);</span><br><span class="line">                                  }</span><br><span class="line">                                }</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                              <span class="keyword">case</span> <span class="number">0x12u</span>:</span><br><span class="line">                                <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                                {</span><br><span class="line">                                  v358 = *<span class="built_in">sub_140017720</span>(Ix, a2, v67, a4 + <span class="number">24</span>, v68, v69);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v70, a4 + <span class="number">24</span>, v71, v72);</span><br><span class="line">                                  v357 = *<span class="built_in">sub_140017720</span>(Ix, a2, v73, a4 + <span class="number">24</span>, v74, v75);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v76, a4 + <span class="number">24</span>, v77, v78);</span><br><span class="line">                                  v335 = v358 * v357;</span><br><span class="line">                                  <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v335, a4 + <span class="number">24</span>, v79, v80);</span><br><span class="line">                                }</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                              <span class="keyword">case</span> <span class="number">0x11u</span>:</span><br><span class="line">                                <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                                {</span><br><span class="line">                                  v356 = *<span class="built_in">sub_140017720</span>(Ix, a2, v53, a4 + <span class="number">24</span>, v54, v55);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v56, a4 + <span class="number">24</span>, v57, v58);</span><br><span class="line">                                  v355 = *<span class="built_in">sub_140017720</span>(Ix, a2, v59, a4 + <span class="number">24</span>, v60, v61);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v62, a4 + <span class="number">24</span>, v63, v64);</span><br><span class="line">                                  v334 = v355 - v356;</span><br><span class="line">                                  <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v334, a4 + <span class="number">24</span>, v65, v66);</span><br><span class="line">                                }</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                              <span class="keyword">case</span> <span class="number">0x10u</span>:</span><br><span class="line">                                <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                                {</span><br><span class="line">                                  v354 = *<span class="built_in">sub_140017720</span>(Ix, a2, v39, a4 + <span class="number">24</span>, v40, v41);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v42, a4 + <span class="number">24</span>, v43, v44);</span><br><span class="line">                                  v353 = *<span class="built_in">sub_140017720</span>(Ix, a2, v45, a4 + <span class="number">24</span>, v46, v47);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v48, a4 + <span class="number">24</span>, v49, v50);</span><br><span class="line">                                  v333 = v353 + v354;</span><br><span class="line">                                  <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v333, a4 + <span class="number">24</span>, v51, v52);</span><br><span class="line">                                }</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                              <span class="keyword">case</span> <span class="number">4u</span>:</span><br><span class="line">                                <span class="keyword">if</span> ( <span class="built_in">sub_140012A90</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) &gt; <span class="number">1</span> )</span><br><span class="line">                                {</span><br><span class="line">                                  v330 = *<span class="built_in">sub_140017720</span>(Ix, a2, v23, a4 + <span class="number">24</span>, v24, v25);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v26, a4 + <span class="number">24</span>, v27, v28);</span><br><span class="line">                                  v329 = *<span class="built_in">sub_140017720</span>(Ix, a2, v29, a4 + <span class="number">24</span>, v30, v31);</span><br><span class="line">                                  <span class="built_in">sub_1400176C0</span>(Ix, a2, v32, a4 + <span class="number">24</span>, v33, v34);</span><br><span class="line">                                  <span class="built_in">sub_1400177B0</span>(Ix, a2, &amp;v330, a4 + <span class="number">24</span>, v35, v36, v324);</span><br><span class="line">                                  <span class="built_in">sub_1400177B0</span>(Ix, a2, &amp;v329, a4 + <span class="number">24</span>, v37, v38, v325);</span><br><span class="line">                                }</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                              <span class="keyword">default</span>:</span><br><span class="line">                                <span class="keyword">if</span> ( n2 &lt;= <span class="number">4u</span> )</span><br><span class="line">                                {</span><br><span class="line">                                  <span class="keyword">if</span> ( n2 == <span class="number">3</span> )</span><br><span class="line">                                  {</span><br><span class="line">                                    <span class="keyword">if</span> ( <span class="built_in">sub_140012AB0</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) != <span class="number">1</span> )</span><br><span class="line">                                    {</span><br><span class="line">                                      v331 = *<span class="built_in">sub_140017720</span>(Ix, a2, v18, a4 + <span class="number">24</span>, v19, v20);</span><br><span class="line">                                      <span class="built_in">sub_1400177B0</span>(Ix, a2, &amp;v331, a4 + <span class="number">24</span>, v21, v22, v324);</span><br><span class="line">                                    }</span><br><span class="line">                                  }</span><br><span class="line">                                  <span class="keyword">else</span> <span class="keyword">if</span> ( n2 == <span class="number">1</span> )</span><br><span class="line">                                  {</span><br><span class="line">                                    v332 = *(v391 + <span class="number">4</span>);</span><br><span class="line">                                    <span class="built_in">sub_140017780</span>(Ix, a2, &amp;v332, a4 + <span class="number">24</span>, v12, v13);</span><br><span class="line">                                  }</span><br><span class="line">                                  <span class="keyword">else</span> <span class="keyword">if</span> ( n2 == <span class="number">2</span> &amp;&amp; <span class="built_in">sub_140012AB0</span>(Ix, a2, v11, a4 + <span class="number">24</span>, v12, v13) != <span class="number">1</span> )</span><br><span class="line">                                  {</span><br><span class="line">                                    <span class="built_in">sub_1400176C0</span>(Ix, a2, v15, a4 + <span class="number">24</span>, v16, v17);</span><br><span class="line">                                  }</span><br><span class="line">                                }</span><br><span class="line">                                <span class="keyword">break</span>;</span><br><span class="line">                            }</span><br><span class="line">                          }</span><br><span class="line">                          <span class="keyword">break</span>;</span><br><span class="line">                      }</span><br><span class="line">                    }</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                }</span><br><span class="line">              }</span><br><span class="line">            }</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        }</span><br><span class="line">      }</span><br><span class="line">    }</span><br><span class="line">    ++*(a4 + <span class="number">240</span>);</span><br><span class="line">    <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">  }</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>可认为这就是 VM 主体了。</p><p><code>sub_140011AE0</code> 则开始输出正确与否了，此函数应该为验证函数。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/ea587991/</id>
    <link href="https://watermelonabc.top/p/ea587991/" rel="alternate"/>
    <published>2025-11-09T12:52:31.000Z</published>
    <summary>你猜猜我执行的是什么指令 🙂</summary>
    <title>虚拟机保护</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="Writeup" scheme="https://watermelonabc.top/categories/Writeup/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="CTF" scheme="https://watermelonabc.top/tags/CTF/"/>
    <content>
      <![CDATA[<p>孩子们，我又被 RE 肘击辣 😭</p><h2 id="PolyEncryption"><a class="header-anchor" href="#PolyEncryption"></a>PolyEncryption</h2><p>本题使用 Docker 部署，但是所给的文件不足以本地搭建……</p><p>题目只给了一个 dll，拖进 DIE，发现是 .NET，故使用 ILSpy 进行反编译</p><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">不要用 dnSpy</div></div><div class="callout-content"><p></p><blockquote><p>因为 dll 用了异步编程，所以编译的时候会编译成状态机的形式，用 dnspy 看的话只能反编译到状态机的代码，用 ilspy 才能完整反编译。</p></blockquote><p>即使我使用 dnSpy 的最新构建版本，依然无法完整反编译…… C# 那篇已经更新信息了。</p><p>作为对比，对于 <code>Main</code> 方法，dnSpy 的反编译结果只有 12 行，而 ILSpy 则是足足 284 行！</p></div></div><figure class="highlight cs"><figcaption><span>Main</span></figcaption><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// saw, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null</span></span><br><span class="line"><span class="comment">// Saw</span></span><br><span class="line"><span class="keyword">using</span> System;</span><br><span class="line"><span class="keyword">using</span> System.Diagnostics;</span><br><span class="line"><span class="keyword">using</span> System.Net;</span><br><span class="line"><span class="keyword">using</span> System.Net.Sockets;</span><br><span class="line"><span class="keyword">using</span> System.Reflection;</span><br><span class="line"><span class="keyword">using</span> System.Security.Cryptography;</span><br><span class="line"><span class="keyword">using</span> System.Text;</span><br><span class="line"><span class="keyword">using</span> System.Threading;</span><br><span class="line"><span class="keyword">using</span> System.Threading.Tasks;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">async</span> Task <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] <span class="keyword">args</span></span>)</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (<span class="keyword">args</span>.Length != <span class="number">1</span>)</span><br><span class="line">{</span><br><span class="line">Console.WriteLine(<span class="string">"Usage: dotnet saw.dll [input]"</span>);</span><br><span class="line">Console.WriteLine(<span class="string">"  where input is 16 hexa bytes (eg abe74e3a9c375b3428bf31d1f8fa49c1)"</span>);</span><br><span class="line">Environment.Exit(<span class="number">1</span>);</span><br><span class="line">}</span><br><span class="line">man.BlockSize = <span class="number">128</span>;</span><br><span class="line">man.Mode = CipherMode.CBC;</span><br><span class="line">man.Padding = PaddingMode.PKCS7;</span><br><span class="line">k = SHA256.Create().ComputeHash(Encoding.ASCII.GetBytes(<span class="keyword">typeof</span>(Saw).Assembly.FullName));</span><br><span class="line">s[<span class="number">1023</span>] = <span class="number">3207972492L</span>;</span><br><span class="line">s[<span class="number">1024</span>] = <span class="number">1190065579L</span>;</span><br><span class="line">s[<span class="number">1025</span>] = <span class="number">4165979424L</span>;</span><br><span class="line">s[<span class="number">1026</span>] = <span class="number">2693353696L</span>;</span><br><span class="line">s[<span class="number">1027</span>] = <span class="number">3628337899L</span>;</span><br><span class="line">s[<span class="number">1028</span>] = <span class="number">1707638109L</span>;</span><br><span class="line">s[<span class="number">1029</span>] = <span class="number">1003779598L</span>;</span><br><span class="line">s[<span class="number">1030</span>] = <span class="number">2653425729L</span>;</span><br><span class="line">s[<span class="number">1031</span>] = <span class="number">795752593L</span>;</span><br><span class="line">s[<span class="number">1032</span>] = <span class="number">2469382657L</span>;</span><br><span class="line"><span class="built_in">long</span>[] array = <span class="keyword">new</span> <span class="built_in">long</span>[<span class="number">16</span>];</span><br><span class="line">Array.Copy(s, <span class="number">1017</span>, array, <span class="number">0</span>, <span class="number">16</span>);</span><br><span class="line">iv = Array.ConvertAll(array, (<span class="built_in">long</span> x) =&gt; (<span class="built_in">byte</span>)x);</span><br><span class="line">TcpListener tcpListener = <span class="keyword">new</span> TcpListener(IPAddress.Loopback, <span class="number">0</span>);</span><br><span class="line">tcpListener.Start();</span><br><span class="line">Process p = Process.Start(<span class="keyword">new</span> ProcessStartInfo(<span class="string">"python3"</span>, <span class="string">"-m saw "</span> + ((IPEndPoint)tcpListener.LocalEndpoint).Port)</span><br><span class="line">{</span><br><span class="line">Environment = {</span><br><span class="line">{</span><br><span class="line"><span class="string">"PYTHONPATH"</span>,</span><br><span class="line">Assembly.GetEntryAssembly().Location</span><br><span class="line">} }</span><br><span class="line">});</span><br><span class="line">client = tcpListener.AcceptTcpClient();</span><br><span class="line"><span class="keyword">await</span> Hack();</span><br><span class="line"><span class="keyword">await</span> Track();</span><br><span class="line"><span class="built_in">int</span> rr = <span class="number">0</span>;</span><br><span class="line"><span class="keyword">while</span> (<span class="literal">true</span>)</span><br><span class="line">{</span><br><span class="line">Console.Error.Write(<span class="string">"."</span>);</span><br><span class="line"><span class="keyword">await</span> Shreck();</span><br><span class="line"><span class="keyword">if</span> (rr == <span class="number">0</span>)</span><br><span class="line">{</span><br><span class="line">s[<span class="number">32</span>] = Convert.ToInt64(<span class="keyword">args</span>[<span class="number">0</span>].Substring(<span class="number">0</span>, <span class="number">8</span>), <span class="number">16</span>);</span><br><span class="line">s[<span class="number">33</span>] = Convert.ToInt64(<span class="keyword">args</span>[<span class="number">0</span>].Substring(<span class="number">8</span>, <span class="number">8</span>), <span class="number">16</span>);</span><br><span class="line">s[<span class="number">34</span>] = Convert.ToInt64(<span class="keyword">args</span>[<span class="number">0</span>].Substring(<span class="number">16</span>, <span class="number">8</span>), <span class="number">16</span>);</span><br><span class="line">s[<span class="number">35</span>] = Convert.ToInt64(<span class="keyword">args</span>[<span class="number">0</span>].Substring(<span class="number">24</span>, <span class="number">8</span>), <span class="number">16</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span> <span class="keyword">if</span> (rr % <span class="number">2</span> == <span class="number">1</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">if</span> (rr != <span class="number">1</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">34</span>, <span class="number">38</span>, <span class="number">13</span>, <span class="number">204</span>, <span class="number">106</span>, <span class="number">91</span>, <span class="number">87</span>, <span class="number">35</span>, <span class="number">115</span>, <span class="number">198</span>,</span><br><span class="line"><span class="number">124</span>, <span class="number">92</span>, <span class="number">83</span>, <span class="number">151</span>, <span class="number">127</span>, <span class="number">227</span>, <span class="number">60</span>, <span class="number">108</span>, <span class="number">237</span>, <span class="number">212</span>,</span><br><span class="line"><span class="number">71</span>, <span class="number">88</span>, <span class="number">37</span>, <span class="number">39</span>, <span class="number">222</span>, <span class="number">28</span>, <span class="number">237</span>, <span class="number">242</span>, <span class="number">207</span>, <span class="number">61</span>,</span><br><span class="line"><span class="number">89</span>, <span class="number">65</span></span><br><span class="line">}));</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">54</span>, <span class="number">26</span>, <span class="number">153</span>, <span class="number">43</span>, <span class="number">207</span>, <span class="number">163</span>, <span class="number">66</span>, <span class="number">102</span>, <span class="number">1</span>, <span class="number">251</span>,</span><br><span class="line"><span class="number">172</span>, <span class="number">137</span>, <span class="number">133</span>, <span class="number">103</span>, <span class="number">252</span>, <span class="number">200</span>, <span class="number">133</span>, <span class="number">6</span>, <span class="number">227</span>, <span class="number">185</span>,</span><br><span class="line"><span class="number">100</span>, <span class="number">190</span>, <span class="number">49</span>, <span class="number">220</span>, <span class="number">132</span>, <span class="number">230</span>, <span class="number">14</span>, <span class="number">201</span>, <span class="number">184</span>, <span class="number">28</span>,</span><br><span class="line"><span class="number">84</span>, <span class="number">127</span></span><br><span class="line">}));</span><br><span class="line">sp += <span class="number">3</span>;</span><br><span class="line">}</span><br><span class="line"><span class="built_in">long</span>[] array2 = s;</span><br><span class="line">array2[<span class="number">2</span>] = <span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">16</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">132</span>, <span class="number">17</span>, <span class="number">89</span>, <span class="number">19</span>, <span class="number">158</span>, <span class="number">87</span>, <span class="number">26</span>, <span class="number">91</span>, <span class="number">138</span>, <span class="number">184</span>,</span><br><span class="line"><span class="number">20</span>, <span class="number">203</span>, <span class="number">22</span>, <span class="number">142</span>, <span class="number">33</span>, <span class="number">67</span></span><br><span class="line">}));</span><br><span class="line">array2 = s;</span><br><span class="line">array2[<span class="number">3</span>] = <span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">16</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">98</span>, <span class="number">124</span>, <span class="number">165</span>, <span class="number">114</span>, <span class="number">4</span>, <span class="number">73</span>, <span class="number">122</span>, <span class="number">239</span>, <span class="number">35</span>, <span class="number">224</span>,</span><br><span class="line"><span class="number">182</span>, <span class="number">58</span>, <span class="number">230</span>, <span class="number">239</span>, <span class="number">169</span>, <span class="number">171</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">if</span> (rr == <span class="number">1</span>)</span><br><span class="line">{</span><br><span class="line">s[<span class="number">4</span>] = <span class="number">1038097261L</span>;</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line">s[<span class="number">4</span>] ^= s[<span class="number">3</span>];</span><br><span class="line">}</span><br><span class="line">}</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">{</span><br><span class="line">sp -= <span class="number">27</span>;</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">181</span>, <span class="number">158</span>, <span class="number">168</span>, <span class="number">62</span>, <span class="number">5</span>, <span class="number">218</span>, <span class="number">108</span>, <span class="number">22</span>, <span class="number">225</span>, <span class="number">44</span>,</span><br><span class="line"><span class="number">69</span>, <span class="number">4</span>, <span class="number">169</span>, <span class="number">112</span>, <span class="number">225</span>, <span class="number">186</span>, <span class="number">212</span>, <span class="number">234</span>, <span class="number">186</span>, <span class="number">217</span>,</span><br><span class="line"><span class="number">245</span>, <span class="number">102</span>, <span class="number">219</span>, <span class="number">46</span>, <span class="number">107</span>, <span class="number">236</span>, <span class="number">2</span>, <span class="number">37</span>, <span class="number">80</span>, <span class="number">8</span>,</span><br><span class="line"><span class="number">162</span>, <span class="number">183</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">71</span>, <span class="number">166</span>, <span class="number">143</span>, <span class="number">191</span>, <span class="number">134</span>, <span class="number">170</span>, <span class="number">65</span>, <span class="number">147</span>, <span class="number">11</span>, <span class="number">69</span>,</span><br><span class="line"><span class="number">123</span>, <span class="number">125</span>, <span class="number">140</span>, <span class="number">156</span>, <span class="number">32</span>, <span class="number">225</span>, <span class="number">68</span>, <span class="number">85</span>, <span class="number">198</span>, <span class="number">59</span>,</span><br><span class="line"><span class="number">6</span>, <span class="number">58</span>, <span class="number">62</span>, <span class="number">75</span>, <span class="number">142</span>, <span class="number">62</span>, <span class="number">22</span>, <span class="number">169</span>, <span class="number">7</span>, <span class="number">21</span>,</span><br><span class="line"><span class="number">26</span>, <span class="number">177</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> ii = <span class="number">0</span>; ii &lt; <span class="number">4</span>; ii++)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">88</span>, <span class="number">244</span>, <span class="number">228</span>, <span class="number">34</span>, <span class="number">209</span>, <span class="number">136</span>, <span class="number">53</span>, <span class="number">33</span>, <span class="number">174</span>, <span class="number">103</span>,</span><br><span class="line"><span class="number">199</span>, <span class="number">211</span>, <span class="number">90</span>, <span class="number">244</span>, <span class="number">91</span>, <span class="number">46</span>, <span class="number">98</span>, <span class="number">141</span>, <span class="number">50</span>, <span class="number">45</span>,</span><br><span class="line"><span class="number">70</span>, <span class="number">160</span>, <span class="number">34</span>, <span class="number">209</span>, <span class="number">131</span>, <span class="number">19</span>, <span class="number">95</span>, <span class="number">66</span>, <span class="number">187</span>, <span class="number">185</span>,</span><br><span class="line"><span class="number">87</span>, <span class="number">236</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">59</span>, <span class="number">134</span>, <span class="number">219</span>, <span class="number">11</span>, <span class="number">168</span>, <span class="number">34</span>, <span class="number">42</span>, <span class="number">6</span>, <span class="number">142</span>, <span class="number">30</span>,</span><br><span class="line"><span class="number">47</span>, <span class="number">12</span>, <span class="number">175</span>, <span class="number">97</span>, <span class="number">187</span>, <span class="number">166</span>, <span class="number">191</span>, <span class="number">165</span>, <span class="number">206</span>, <span class="number">91</span>,</span><br><span class="line"><span class="number">56</span>, <span class="number">92</span>, <span class="number">35</span>, <span class="number">91</span>, <span class="number">63</span>, <span class="number">232</span>, <span class="number">2</span>, <span class="number">235</span>, <span class="number">246</span>, <span class="number">41</span>,</span><br><span class="line"><span class="number">249</span>, <span class="number">60</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">30</span>, <span class="number">47</span>, <span class="number">78</span>, <span class="number">72</span>, <span class="number">232</span>, <span class="number">144</span>, <span class="number">186</span>, <span class="number">158</span>, <span class="number">145</span>, <span class="number">46</span>,</span><br><span class="line"><span class="number">78</span>, <span class="number">42</span>, <span class="number">66</span>, <span class="number">78</span>, <span class="number">48</span>, <span class="number">177</span>, <span class="number">201</span>, <span class="number">84</span>, <span class="number">194</span>, <span class="number">246</span>,</span><br><span class="line"><span class="number">32</span>, <span class="number">77</span>, <span class="number">153</span>, <span class="number">26</span>, <span class="number">204</span>, <span class="number">139</span>, <span class="number">24</span>, <span class="number">149</span>, <span class="number">70</span>, <span class="number">89</span>,</span><br><span class="line"><span class="number">23</span>, <span class="number">50</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">88</span>, <span class="number">244</span>, <span class="number">228</span>, <span class="number">34</span>, <span class="number">209</span>, <span class="number">136</span>, <span class="number">53</span>, <span class="number">33</span>, <span class="number">174</span>, <span class="number">103</span>,</span><br><span class="line"><span class="number">199</span>, <span class="number">211</span>, <span class="number">90</span>, <span class="number">244</span>, <span class="number">91</span>, <span class="number">46</span>, <span class="number">98</span>, <span class="number">141</span>, <span class="number">50</span>, <span class="number">45</span>,</span><br><span class="line"><span class="number">70</span>, <span class="number">160</span>, <span class="number">34</span>, <span class="number">209</span>, <span class="number">131</span>, <span class="number">19</span>, <span class="number">95</span>, <span class="number">66</span>, <span class="number">187</span>, <span class="number">185</span>,</span><br><span class="line"><span class="number">87</span>, <span class="number">236</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">59</span>, <span class="number">134</span>, <span class="number">219</span>, <span class="number">11</span>, <span class="number">168</span>, <span class="number">34</span>, <span class="number">42</span>, <span class="number">6</span>, <span class="number">142</span>, <span class="number">30</span>,</span><br><span class="line"><span class="number">47</span>, <span class="number">12</span>, <span class="number">175</span>, <span class="number">97</span>, <span class="number">187</span>, <span class="number">166</span>, <span class="number">191</span>, <span class="number">165</span>, <span class="number">206</span>, <span class="number">91</span>,</span><br><span class="line"><span class="number">56</span>, <span class="number">92</span>, <span class="number">35</span>, <span class="number">91</span>, <span class="number">63</span>, <span class="number">232</span>, <span class="number">2</span>, <span class="number">235</span>, <span class="number">246</span>, <span class="number">41</span>,</span><br><span class="line"><span class="number">249</span>, <span class="number">60</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">30</span>, <span class="number">47</span>, <span class="number">78</span>, <span class="number">72</span>, <span class="number">232</span>, <span class="number">144</span>, <span class="number">186</span>, <span class="number">158</span>, <span class="number">145</span>, <span class="number">46</span>,</span><br><span class="line"><span class="number">78</span>, <span class="number">42</span>, <span class="number">66</span>, <span class="number">78</span>, <span class="number">48</span>, <span class="number">177</span>, <span class="number">201</span>, <span class="number">84</span>, <span class="number">194</span>, <span class="number">246</span>,</span><br><span class="line"><span class="number">32</span>, <span class="number">77</span>, <span class="number">153</span>, <span class="number">26</span>, <span class="number">204</span>, <span class="number">139</span>, <span class="number">24</span>, <span class="number">149</span>, <span class="number">70</span>, <span class="number">89</span>,</span><br><span class="line"><span class="number">23</span>, <span class="number">50</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">88</span>, <span class="number">244</span>, <span class="number">228</span>, <span class="number">34</span>, <span class="number">209</span>, <span class="number">136</span>, <span class="number">53</span>, <span class="number">33</span>, <span class="number">174</span>, <span class="number">103</span>,</span><br><span class="line"><span class="number">199</span>, <span class="number">211</span>, <span class="number">90</span>, <span class="number">244</span>, <span class="number">91</span>, <span class="number">46</span>, <span class="number">98</span>, <span class="number">141</span>, <span class="number">50</span>, <span class="number">45</span>,</span><br><span class="line"><span class="number">70</span>, <span class="number">160</span>, <span class="number">34</span>, <span class="number">209</span>, <span class="number">131</span>, <span class="number">19</span>, <span class="number">95</span>, <span class="number">66</span>, <span class="number">187</span>, <span class="number">185</span>,</span><br><span class="line"><span class="number">87</span>, <span class="number">236</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">59</span>, <span class="number">134</span>, <span class="number">219</span>, <span class="number">11</span>, <span class="number">168</span>, <span class="number">34</span>, <span class="number">42</span>, <span class="number">6</span>, <span class="number">142</span>, <span class="number">30</span>,</span><br><span class="line"><span class="number">47</span>, <span class="number">12</span>, <span class="number">175</span>, <span class="number">97</span>, <span class="number">187</span>, <span class="number">166</span>, <span class="number">191</span>, <span class="number">165</span>, <span class="number">206</span>, <span class="number">91</span>,</span><br><span class="line"><span class="number">56</span>, <span class="number">92</span>, <span class="number">35</span>, <span class="number">91</span>, <span class="number">63</span>, <span class="number">232</span>, <span class="number">2</span>, <span class="number">235</span>, <span class="number">246</span>, <span class="number">41</span>,</span><br><span class="line"><span class="number">249</span>, <span class="number">60</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">30</span>, <span class="number">47</span>, <span class="number">78</span>, <span class="number">72</span>, <span class="number">232</span>, <span class="number">144</span>, <span class="number">186</span>, <span class="number">158</span>, <span class="number">145</span>, <span class="number">46</span>,</span><br><span class="line"><span class="number">78</span>, <span class="number">42</span>, <span class="number">66</span>, <span class="number">78</span>, <span class="number">48</span>, <span class="number">177</span>, <span class="number">201</span>, <span class="number">84</span>, <span class="number">194</span>, <span class="number">246</span>,</span><br><span class="line"><span class="number">32</span>, <span class="number">77</span>, <span class="number">153</span>, <span class="number">26</span>, <span class="number">204</span>, <span class="number">139</span>, <span class="number">24</span>, <span class="number">149</span>, <span class="number">70</span>, <span class="number">89</span>,</span><br><span class="line"><span class="number">23</span>, <span class="number">50</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">47</span>, <span class="number">110</span>, <span class="number">238</span>, <span class="number">143</span>, <span class="number">41</span>, <span class="number">255</span>, <span class="number">113</span>, <span class="number">160</span>, <span class="number">229</span>, <span class="number">92</span>,</span><br><span class="line"><span class="number">84</span>, <span class="number">132</span>, <span class="number">31</span>, <span class="number">128</span>, <span class="number">72</span>, <span class="number">253</span>, <span class="number">98</span>, <span class="number">154</span>, <span class="number">102</span>, <span class="number">114</span>,</span><br><span class="line"><span class="number">68</span>, <span class="number">165</span>, <span class="number">121</span>, <span class="number">194</span>, <span class="number">102</span>, <span class="number">210</span>, <span class="number">191</span>, <span class="number">221</span>, <span class="number">49</span>, <span class="number">209</span>,</span><br><span class="line"><span class="number">210</span>, <span class="number">215</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">59</span>, <span class="number">134</span>, <span class="number">219</span>, <span class="number">11</span>, <span class="number">168</span>, <span class="number">34</span>, <span class="number">42</span>, <span class="number">6</span>, <span class="number">142</span>, <span class="number">30</span>,</span><br><span class="line"><span class="number">47</span>, <span class="number">12</span>, <span class="number">175</span>, <span class="number">97</span>, <span class="number">187</span>, <span class="number">166</span>, <span class="number">68</span>, <span class="number">235</span>, <span class="number">237</span>, <span class="number">14</span>,</span><br><span class="line"><span class="number">9</span>, <span class="number">156</span>, <span class="number">105</span>, <span class="number">253</span>, <span class="number">49</span>, <span class="number">93</span>, <span class="number">204</span>, <span class="number">138</span>, <span class="number">86</span>, <span class="number">162</span>,</span><br><span class="line"><span class="number">159</span>, <span class="number">183</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">59</span>, <span class="number">134</span>, <span class="number">219</span>, <span class="number">11</span>, <span class="number">168</span>, <span class="number">34</span>, <span class="number">42</span>, <span class="number">6</span>, <span class="number">142</span>, <span class="number">30</span>,</span><br><span class="line"><span class="number">47</span>, <span class="number">12</span>, <span class="number">175</span>, <span class="number">97</span>, <span class="number">187</span>, <span class="number">166</span>, <span class="number">191</span>, <span class="number">165</span>, <span class="number">206</span>, <span class="number">91</span>,</span><br><span class="line"><span class="number">56</span>, <span class="number">92</span>, <span class="number">35</span>, <span class="number">91</span>, <span class="number">63</span>, <span class="number">232</span>, <span class="number">2</span>, <span class="number">235</span>, <span class="number">246</span>, <span class="number">41</span>,</span><br><span class="line"><span class="number">249</span>, <span class="number">60</span></span><br><span class="line">}));</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">30</span>, <span class="number">47</span>, <span class="number">78</span>, <span class="number">72</span>, <span class="number">232</span>, <span class="number">144</span>, <span class="number">186</span>, <span class="number">158</span>, <span class="number">145</span>, <span class="number">46</span>,</span><br><span class="line"><span class="number">78</span>, <span class="number">42</span>, <span class="number">66</span>, <span class="number">78</span>, <span class="number">48</span>, <span class="number">177</span>, <span class="number">201</span>, <span class="number">84</span>, <span class="number">194</span>, <span class="number">246</span>,</span><br><span class="line"><span class="number">32</span>, <span class="number">77</span>, <span class="number">153</span>, <span class="number">26</span>, <span class="number">204</span>, <span class="number">139</span>, <span class="number">24</span>, <span class="number">149</span>, <span class="number">70</span>, <span class="number">89</span>,</span><br><span class="line"><span class="number">23</span>, <span class="number">50</span></span><br><span class="line">}));</span><br><span class="line">}</span><br><span class="line"><span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">32</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">164</span>, <span class="number">53</span>, <span class="number">148</span>, <span class="number">8</span>, <span class="number">250</span>, <span class="number">208</span>, <span class="number">160</span>, <span class="number">70</span>, <span class="number">126</span>, <span class="number">59</span>,</span><br><span class="line"><span class="number">160</span>, <span class="number">104</span>, <span class="number">222</span>, <span class="number">18</span>, <span class="number">194</span>, <span class="number">130</span>, <span class="number">172</span>, <span class="number">224</span>, <span class="number">232</span>, <span class="number">3</span>,</span><br><span class="line"><span class="number">9</span>, <span class="number">43</span>, <span class="number">214</span>, <span class="number">128</span>, <span class="number">13</span>, <span class="number">213</span>, <span class="number">251</span>, <span class="number">91</span>, <span class="number">231</span>, <span class="number">216</span>,</span><br><span class="line"><span class="number">221</span>, <span class="number">212</span></span><br><span class="line">}));</span><br><span class="line"><span class="built_in">long</span>[] array2 = s;</span><br><span class="line"><span class="built_in">long</span> num = s[<span class="number">1</span>];</span><br><span class="line">array2[<span class="number">32</span>] = num ^ <span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">16</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">132</span>, <span class="number">17</span>, <span class="number">89</span>, <span class="number">19</span>, <span class="number">158</span>, <span class="number">87</span>, <span class="number">26</span>, <span class="number">91</span>, <span class="number">138</span>, <span class="number">184</span>,</span><br><span class="line"><span class="number">20</span>, <span class="number">203</span>, <span class="number">22</span>, <span class="number">142</span>, <span class="number">33</span>, <span class="number">67</span></span><br><span class="line">}));</span><br><span class="line">array2 = s;</span><br><span class="line">num = s[<span class="number">2</span>];</span><br><span class="line">array2[<span class="number">33</span>] = num ^ <span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">16</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">98</span>, <span class="number">124</span>, <span class="number">165</span>, <span class="number">114</span>, <span class="number">4</span>, <span class="number">73</span>, <span class="number">122</span>, <span class="number">239</span>, <span class="number">35</span>, <span class="number">224</span>,</span><br><span class="line"><span class="number">182</span>, <span class="number">58</span>, <span class="number">230</span>, <span class="number">239</span>, <span class="number">169</span>, <span class="number">171</span></span><br><span class="line">}));</span><br><span class="line">array2 = s;</span><br><span class="line">num = s[<span class="number">3</span>];</span><br><span class="line">array2[<span class="number">34</span>] = num ^ <span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">16</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">41</span>, <span class="number">105</span>, <span class="number">145</span>, <span class="number">250</span>, <span class="number">243</span>, <span class="number">41</span>, <span class="number">66</span>, <span class="number">60</span>, <span class="number">57</span>, <span class="number">250</span>,</span><br><span class="line"><span class="number">209</span>, <span class="number">67</span>, <span class="number">192</span>, <span class="number">42</span>, <span class="number">111</span>, <span class="number">95</span></span><br><span class="line">}));</span><br><span class="line">array2 = s;</span><br><span class="line">num = s[<span class="number">4</span>];</span><br><span class="line">array2[<span class="number">35</span>] = num ^ <span class="keyword">await</span> Stop(<span class="keyword">await</span> Crack(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">16</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">46</span>, <span class="number">125</span>, <span class="number">65</span>, <span class="number">197</span>, <span class="number">84</span>, <span class="number">64</span>, <span class="number">181</span>, <span class="number">17</span>, <span class="number">52</span>, <span class="number">236</span>,</span><br><span class="line"><span class="number">114</span>, <span class="number">213</span>, <span class="number">42</span>, <span class="number">180</span>, <span class="number">217</span>, <span class="number">142</span></span><br><span class="line">}));</span><br><span class="line">}</span><br><span class="line"><span class="keyword">if</span> (rr == <span class="number">22</span>)</span><br><span class="line">{</span><br><span class="line"><span class="keyword">await</span> blient.GetStream().WriteAsync(<span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">15</span>]</span><br><span class="line">{</span><br><span class="line"><span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">15</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">1</span>, <span class="number">0</span>, <span class="number">1</span>,</span><br><span class="line"><span class="number">10</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span>, <span class="number">0</span></span><br><span class="line">}, <span class="literal">default</span>(CancellationToken));</span><br><span class="line">p.Kill();</span><br><span class="line">_ = <span class="keyword">new</span> <span class="built_in">byte</span>[<span class="number">16</span>];</span><br><span class="line"><span class="keyword">for</span> (<span class="built_in">int</span> num2 = <span class="number">0</span>; num2 &lt; <span class="number">4</span>; num2++)</span><br><span class="line">{</span><br><span class="line"><span class="built_in">byte</span>[] bytes = BitConverter.GetBytes((<span class="built_in">uint</span>)s[<span class="number">32</span> + num2]);</span><br><span class="line">Array.Reverse(bytes);</span><br><span class="line">Console.Write(BitConverter.ToString(bytes).Replace(<span class="string">"-"</span>, <span class="string">""</span>));</span><br><span class="line">}</span><br><span class="line">Environment.Exit(<span class="number">0</span>);</span><br><span class="line">}</span><br><span class="line"><span class="keyword">await</span> Breck();</span><br><span class="line"><span class="keyword">await</span> client.GetStream().WriteAsync(BitConverter.GetBytes(<span class="number">0</span>), <span class="literal">default</span>(CancellationToken));</span><br><span class="line"><span class="keyword">while</span> (<span class="keyword">await</span> Hack())</span><br><span class="line">{</span><br><span class="line">}</span><br><span class="line"><span class="built_in">bool</span> flag = <span class="literal">true</span>;</span><br><span class="line"><span class="keyword">while</span> (flag)</span><br><span class="line">{</span><br><span class="line">flag = <span class="keyword">await</span> Horror();</span><br><span class="line">}</span><br><span class="line">rr++;</span><br><span class="line">}</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>很明显，要部署 Docker，环境里至少还需要一个 python 脚本，Where is it?</p><p>DIE 已经有提示：</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251025222838981.png" alt="" loading="lazy"></p><blockquote><p>此处 DIE 识别不完全正确。识别为 JAR 的实际依然是 ZIP。</p></blockquote><p>DIE 内置的提取器，选择 Binary 模式，“扫描” 并 “转储全部”：</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251025223036093.png" alt="" loading="lazy"></p><p>改 jar 后缀为 zip，解压体积最大的那个 zip（<code>polyencrypt.dll.9200_2b8c.zip</code>），得到完整文件：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">d----          2025/10/25    22:09                META-INF</span><br><span class="line">-a---            2024/5/6     4:18            338 Curse.class</span><br><span class="line">-a---            2024/5/6     4:18           2048 Curse.dll</span><br><span class="line">-a---            2024/5/6     4:18            736 Hack.class</span><br><span class="line">-a---           2024/5/11    16:53          48524 polyencrypt.dll</span><br><span class="line">-a---           2024/5/11    16:53            242 polyencrypt.runtimeconfig.json</span><br><span class="line">-a---            2024/5/6     4:18           1337 remote_pdb_LICENSE.txt</span><br><span class="line">-a---            2024/5/6     4:18           3985 remote_pdb.py</span><br><span class="line">-a---          2025/10/10    22:55             69 run.sh</span><br><span class="line">-a---            2024/5/6     4:18           8823 Saw.class</span><br><span class="line">-a---            2024/5/6     4:18           5025 saw.py</span><br></pre></td></tr></tbody></table></figure>]]>
    </content>
    <id>https://watermelonabc.top/p/6375919/</id>
    <link href="https://watermelonabc.top/p/6375919/" rel="alternate"/>
    <published>2025-10-25T08:54:19.000Z</published>
    <summary>面向蒟蒻 REer 的赛题复现</summary>
    <title>2025 强网杯 S9 Reverse 复现</title>
    <updated>2026-08-04T09:53:10.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="杂记" scheme="https://watermelonabc.top/categories/%E6%9D%82%E8%AE%B0/"/>
    <category term="other" scheme="https://watermelonabc.top/tags/other/"/>
    <category term="FZU" scheme="https://watermelonabc.top/tags/FZU/"/>
    <content>
      <![CDATA[<p>主包从铜盘搬到旗山后，在快递这一块也是狠狠赤了依托石 😋</p><p>看着 淘宝 / PDD 上十几个虎视眈眈的包裹 “四散” 在校内外各处，再高傲的福 🧊 也不禁弯下了脊梁骨，这也是外迁之世的一个侧面……</p><p>Anyway，抽象话就不继续说了，下面就和主包一起看看怎么才能在 FZU 顺利取到快递吧 😊</p><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p>主包只住过铜盘和旗山校区喵，其他校区我不知道喵。</p></div></div><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p>主包去过的所有快递点的货架<strong>都难找</strong>，容易绕晕 😵<br>铜盘可以在菜鸟上用 “实景找包裹”，会尽量标注各个包裹的货架位置。但是驿站有时会调整货架，而地图是不会更新的，所以大概还是得在驿站内绕来绕去。<br>旗山我还没有尝试过，但是比铜盘更史，快递中心申通、极兔那边有些货架更是梦到哪里排哪里（<br>旗山的快递站会尽量按序号排列快递，这一点比铜盘要好，找到货架就能快速地找到快递。但毕竟我们不是按序号先后来取快递的，而且工作人员有时也不会那么尽责，因此也存在序号混乱的情况。</p></div></div><h2 id="铜盘校区"><a class="header-anchor" href="#铜盘校区"></a>铜盘校区</h2><blockquote><p>此部分信息可能过期</p></blockquote><p>铜盘的<strong>所有</strong>快递集中在<strong>操场旁边的菜鸟驿站</strong>中，你在校易班绘制的地图上就能看到。校园地图参见<a href="https://fzuwiki.west2.online/school/map/">校园地图 - FZU Wiki</a></p><p>由于是菜鸟驿站，所以它的收件码体系和<strong>淘宝</strong>强关联。想查询取件码需要通过<strong>淘宝</strong>或菜鸟 APP 输入快递单号才可以。</p><p>我记得是有 7 台出库机的。大部分快递通过出口的 6 台出库机出库，需要淘宝身份码；还有一些 PDD 快递（如邮政）有单独的 1 台出库机，不需要身份码。</p><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p>在主包刚来铜盘的一段时间内（2024 年），驿站还支持菜鸟身份码，但一次 “升级” 之后就不支持了，必须用淘宝身份码。<br><s>其实不扫身份码直接拿也没事，没人追究的吧</s></p></div></div><p>快递集中一处的优势是方便取件。出库另说哈（ 一大群人挤在一个闷热狭小的空间中实在不是什么好的体验。</p><p>信件根据小红书的说法，在生活区 6 号楼下的物业中心或者门口文创店。</p><h2 id="旗山校区"><a class="header-anchor" href="#旗山校区"></a>旗山校区</h2><p>最赤石的来哩 🤣</p><p>旗山校区虽然有一个名义上的 “快递服务中心”，但实际上这个 “中心” 实在要打个问号。也许是 “天下大势，分久必合，合久必分”，好几个快递企业选择将它们的服务点搬出快递中心，这就苦了我们这些网购大学生。</p><blockquote><p>还真是 “分久必合，合久必分”，有 ldx 说好几年前快递也是东一个西一个的，后面建了快递中心才集聚起来，现在又分出去了。</p></blockquote><p>旗山有 4 个主要的快递集散点：<strong>快递中心、生活一区 9 号楼邮政、福大学生街驿站（兔喜生活，或者显示在周麻婆后）和筑安商业中心的多多驿站</strong>。<s>由于快递点多且散，建议旗山的同学买一辆电动车</s>貌似 25 级往后的同学原则上就没有电动车骑了……</p><p><strong>德邦</strong>快递在福大<strong>没有固定的服务点</strong>，需要同学自己去生活区大门和快递员取件。一般来讲，快递员会在下午 4:30 ~ 5:00 内到生活区门口，到了会电话通知。就我的体验来讲，如果你下午有第二节大课，那么你<strong>有概率是领不到</strong>了，因为快递员可能下班了。有时我下课骑车回来还能看到德邦快递员在大门口。</p><p>开学的一段时间，由于快递较多，德邦可能会在生活区门口设置临时集散点。</p><div class="tag-plugin quot p"><p class="content"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from BoxIcons Solid by Atisa - https://creativecommons.org/licenses/by/4.0/ --><path fill="currentColor" d="M3.691 6.292C5.094 4.771 7.217 4 10 4h1v2.819l-.804.161c-1.37.274-2.323.813-2.833 1.604A2.9 2.9 0 0 0 6.925 10H10a1 1 0 0 1 1 1v7c0 1.103-.897 2-2 2H3a1 1 0 0 1-1-1v-5l.003-2.919c-.009-.111-.199-2.741 1.688-4.789M20 20h-6a1 1 0 0 1-1-1v-5l.003-2.919c-.009-.111-.199-2.741 1.688-4.789C16.094 4.771 18.217 4 21 4h1v2.819l-.804.161c-1.37.274-2.323.813-2.833 1.604A2.9 2.9 0 0 0 17.925 10H21a1 1 0 0 1 1 1v7c0 1.103-.897 2-2 2"></path></svg><span class="text">FZU 旗山校区快递点一图概览</span><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from BoxIcons Solid by Atisa - https://creativecommons.org/licenses/by/4.0/ --><path fill="currentColor" d="M20.309 17.708C22.196 15.66 22.006 13.03 22 13V5a1 1 0 0 0-1-1h-6c-1.103 0-2 .897-2 2v7a1 1 0 0 0 1 1h3.078a2.9 2.9 0 0 1-.429 1.396c-.508.801-1.465 1.348-2.846 1.624l-.803.16V20h1c2.783 0 4.906-.771 6.309-2.292m-11.007 0C11.19 15.66 10.999 13.03 10.993 13V5a1 1 0 0 0-1-1h-6c-1.103 0-2 .897-2 2v7a1 1 0 0 0 1 1h3.078a2.9 2.9 0 0 1-.429 1.396c-.508.801-1.465 1.348-2.846 1.624l-.803.16V20h1c2.783 0 4.906-.771 6.309-2.292"></path></svg></p></div><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:1841/1219;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/FZU-Express-Map-20260714.webp" alt="底图来自福州大学校园地图服务系统，使用 GIMP 于 2026/07/14 标注" data-fancybox="true" onerror="this.src='/asset/image/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(/asset/image/Fructose-Content-running-medium.webp);"></div></div><div class="image-meta"><span class="image-caption center">底图来自福州大学校园地图服务系统，使用 GIMP 于 2026/07/14 标注</span></div></div><h3 id="快递中心"><a class="header-anchor" href="#快递中心"></a>快递中心</h3><p>位于生活三区 35 号楼后。从两个生活区大门左转沿路直走均可到达。平日营业时间为 9:00 ~ 19:00。有时 19:00 后快递站仍会开放，但此时快递公司人员基本下班，你只能使用自助机器进行取件。</p><p>快递中心驻扎<strong>顺丰、申通、极兔、圆通、京东、菜鸟（天猫超市）</strong>。不同快递企业（甚至同一企业的不同货架区域）有自己的出库机，一般来说你在哪个区域就用哪里的出库机。有些出库机会标明适用于哪些号码的货架。</p><p>现在快递中心的货架是比较混乱的，特别是申通的快递，有些比较大的货架号 (238+) 就会安排在靠近进货口的位置</p><p>所有出库机都需要扫描快递单条码。一些出库机需要同时使用身份码，请根据机身说明打开对应软件的身份码（淘宝 / 拼多多）。注意是根据你使用的<strong>出库机</strong>为依据选择身份码，大部分使用 PDD 身份码，申通的少量机器使用淘宝身份码。</p><div class="callout" data-callout="question"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-help-circle"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">如何获取身份码</div></div><div class="callout-content"><p>统一方法：出库机上会贴二维码，用对应 APP 扫描即可。</p><p>淘宝：首页 &gt; 搜索框下的 “菜鸟驿站” &gt; 底栏 “身份码”（不要使用菜鸟 APP！）<br>拼多多：（如果有待取包裹）“聊天” &gt; “物流助手” &gt; “查快递” &gt; “取快递” &gt; 顶部 “查看身份码”</p></div></div><p>寒暑假期间误送到学校的滞留件，之后会转移到出入库口的一个棚子里（入口右转到尽头），会有物流通知的。</p><h3 id="生活一区-9-号楼邮政"><a class="header-anchor" href="#生活一区-9-号楼邮政"></a>生活一区 9 号楼邮政</h3><p>位于一区京元食堂背后宿舍楼下沿街铺面。顾名思义，<strong>邮政</strong>的快递都送到这里来。信件自然也在此处寄收。平日营业时间为 9:00 ~ 19:00</p><p>门口有 1 台出库机，需要拼多多身份码。</p><p>信件请询问工作人员。明信片可能放在出库机旁边，或者空货架上。</p><h3 id="福大学生街驿站"><a class="header-anchor" href="#福大学生街驿站"></a>福大学生街驿站</h3><p>位于糖巢零食旁边，<strong>中通</strong>驻扎。平日营业时间为 10:00 ~ 17:00</p><p>2~3 台出库机，需要拼多多身份码。</p><h3 id="筑安商业中心的多多驿站"><a class="header-anchor" href="#筑安商业中心的多多驿站"></a>筑安商业中心的多多驿站</h3><p><strong>韵达</strong>驻扎。从四区门口对面的入口直走即可看到驿站。但是四区后门仅限行人通过，骑车建议从旁边高架桥旁边的道路通过（上面所示蓝色路线，红木一条街）</p><p>入口处有一台出库机，不需要身份码。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/3107cb4a/</id>
    <link href="https://watermelonabc.top/p/3107cb4a/" rel="alternate"/>
    <published>2025-09-11T15:38:39.000Z</published>
    <summary>哎我艹这旗山校区怎么这么坏啊 QAQ</summary>
    <title>你如何在 FZU 取到快递</title>
    <updated>2026-08-10T11:22:01.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="复习笔记" scheme="https://watermelonabc.top/categories/%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="FZU" scheme="https://watermelonabc.top/tags/FZU/"/>
    <content>
      <![CDATA[<h2 id="数理逻辑"><a class="header-anchor" href="#数理逻辑"></a>数理逻辑</h2><h3 id="命题"><a class="header-anchor" href="#命题"></a>命题</h3><p>非真即假的封闭陈述句就是命题 (proposition)。一个命题的真值 (truth value) 表示命题的真假情况，本课程定义 1 为真，0 为假。</p><p>一个无法被分解的命题称为简单命题或原子命题 (atomic proposition)，简单命题通过联结词 (logical connectives) 联结得到复合命题 (compound propositions)</p><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">命题的判断</div></div><div class="callout-content"><p>一个命题需要满足以下两个条件：1）是陈述句；2）非真即假，即仅有唯一真值。<br>条件 1）比较好达成，但要注意数学表达式（如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>&lt;</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">1 &lt; 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6835em;vertical-align:-0.0391em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span>）也是一种陈述句。<br>条件 2）可能就有点难了。我们只看它能否理论上判断有唯一真值，不需要确定它是真是假。例如 “我喝了 114514 杯红茶”，我们现在可能无法确定到底是高手在民间还是吹牛批，但它有唯一真值！而 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>+</mo><mn>1</mn><mo>&gt;</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">x + 1 &gt; 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6835em;vertical-align:-0.0391em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span> 就不是一个命题，因为它有时真有时假。而 “这句话是假的” 同样不是一个命题，因为它同时是真和假。<br>和 ChatGPT 交流后发现，命题还有一个特征：陈述的主语必须<strong>无歧义</strong>。换句话说，主语不能是指代模糊的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>、"He" 等。如果你需要上下文、需要自圆其说，那么他就不是一个命题。例如 “它是整数”，谁是整数？它是 1，是 “笔记本”，还是 “福州大学”？我们无法判断。这个特征需要灵活运用，因为在一些语境下，可能默认代词有指称。</p><p>直到现在我们讲的还是简单命题。对于复合语句呢？我们只需要其分解为简单陈述句，然后分别判断即可。只有所有简单陈述句都是命题，复合语句才是命题。<br>例如 “如果明天不下雨，我们就去公园”，这句话可以分为 “明天下雨” 和 “我们去公园”，这两个都是命题，所以一整句话也是一个命题。</p><p>语句是否为命题，和语句的语意合理情况无关。例如 “北京是首都当且仅当 2 + 2 = 4”，虽然荒谬但确实是命题。</p></div></div><p>我们习惯上用字母 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>r</mi></mrow><annotation encoding="application/x-tex">r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">r</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi></mrow><annotation encoding="application/x-tex">s</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">s</span></span></span></span>, ... 来表示命题变量 (propositional variables)，即表示命题的变量。</p><p>我们有 5 个联结词：</p><h4 id="否定-Negation"><a class="header-anchor" href="#否定-Negation"></a>否定 (Negation)</h4><p>令 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 为一命题，则 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 的否定记作 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">¬</mi><mi>p</mi></mrow><annotation encoding="application/x-tex">\neg p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord">¬</span><span class="mord mathnormal">p</span></span></span></span> ，指 “不是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 所指的情形”，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 的否定与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 的真值相反。(NOT)</p><blockquote><p>否定运算符的记号并没有统一的标准，只是 " <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">¬</mi></mrow><annotation encoding="application/x-tex">\neg</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord">¬</span></span></span></span> " 比较常用而已</p></blockquote><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p>抽取简单命题时，不可抽取否定语句。例如上面的 “如果明天不下雨”，抽取的就是 “明天下雨” 而不是 “明天不下雨”。</p></div></div><p>命题的否定也可以看作否定运算符 (negation operator) 作用在命题上的结果。</p><h4 id="合取-Conjunction"><a class="header-anchor" href="#合取-Conjunction"></a>合取 (Conjunction)</h4><p>令 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 为命题，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 的合取即命题 “<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 并且 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span>”，记作 “<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>∧</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p\land q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.75em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∧</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span>”，当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 皆为真命题时，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>∧</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p\land q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.75em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∧</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 为真，否则为假。(AND)</p><p>如果一个命题为假，那么整个合取式固定为假；如果一个命题为真，那么整个合取式的真值取决于另一个命题。</p><h4 id="析取-Disjunction"><a class="header-anchor" href="#析取-Disjunction"></a>析取 (Disjunction)</h4><p>令 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 为命题，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 的析取即命题 “<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 或 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span>”，记作 “<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>∨</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p\lor q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.75em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∨</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span>”，当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 皆为假命题时，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>∨</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p \lor q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.75em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">∨</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 为假, 否则为真。(OR)</p><p>如果一个命题为真，那么整个析取式固定为真；如果一个命题为假，那么整个析取式的真值取决于另一个命题。</p><h4 id="异或-Exclusive-or"><a class="header-anchor" href="#异或-Exclusive-or"></a>异或 (Exclusive or)</h4><p>令 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 为命题，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 的异或（记作 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>⊕</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p\oplus q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span>）是这样的一个命题：当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 中恰好有一个为真时命题为真，否则为假。</p><p>换句话说，命题 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 的真值相同则为假 (0) ，真值不同则为真 (1)。</p><table><thead><tr><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span></th><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span></th><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>⊕</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p\oplus q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span></th></tr></thead><tbody><tr><td style="text-align:center">T</td><td style="text-align:center">T</td><td style="text-align:center">F</td></tr><tr><td style="text-align:center">T</td><td style="text-align:center">F</td><td style="text-align:center">T</td></tr><tr><td style="text-align:center">F</td><td style="text-align:center">T</td><td style="text-align:center">T</td></tr><tr><td style="text-align:center">F</td><td style="text-align:center">F</td><td style="text-align:center">F</td></tr></tbody></table><blockquote><p>联想到异或运算，其实是同一个概念，二进制位相同则为 0，二进制位不同则为 1。</p></blockquote><p>和析取相比，异或排除了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 同时成立的情况，因此也称 “排斥或”。与之相对的，“析取” 也称 “相容或”</p><h4 id="蕴涵-Implication"><a class="header-anchor" href="#蕴涵-Implication"></a>蕴涵 (Implication)</h4><p>或称条件语句 (Conditional Statement)。</p><p>令 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>, <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 为命题，蕴含 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>→</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p\rightarrow q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 是命题 “如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>，则 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span>”，当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 为真而 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 为假时，条件语句 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>→</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p\rightarrow q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 为假，否则为真。在蕴涵中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 称为假设（hypothesis，或前件 antecedent，前提 premise），<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 称为结论（conclusion，或后件 consequence）。</p><table><thead><tr><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span></th><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span></th><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>→</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p\rightarrow q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span></th></tr></thead><tbody><tr><td style="text-align:center">T</td><td style="text-align:center">T</td><td style="text-align:center">T</td></tr><tr><td style="text-align:center">T</td><td style="text-align:center">F</td><td style="text-align:center">F</td></tr><tr><td style="text-align:center">F</td><td style="text-align:center">T</td><td style="text-align:center">T</td></tr><tr><td style="text-align:center">F</td><td style="text-align:center">F</td><td style="text-align:center">T</td></tr></tbody></table><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>为什么 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 为假时，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 不论真假，命题一定为真？<br>如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 为假，不必多说，确实符合这个命题。<br>如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 为真，命题没有规定 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 为假的情况，并且仍然在一定程度上符合命题。<br>因此，如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 为假，我们不需要使用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>→</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p\rightarrow q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span>。既然我们不会使用它，我们可以将其真值定义为任何我们喜欢的东西，但也要符合其他的联结词。</p></div></div><p>蕴含式中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 的顺序很重要。如果交换 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span>，会产生一个不同的命题。</p><p>常用的自然语言描述：</p><ul><li><strong>只要</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>，就 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span></li><li>因为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>，才 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 仅当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span></li><li><strong>只有</strong> <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 才 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span></li><li>除非 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 才 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span></li><li>除非 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span>，否则非 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">¬</mi><mi>q</mi><mo>→</mo><mi mathvariant="normal">¬</mi><mi>p</mi></mrow><annotation encoding="application/x-tex">\neg q \rightarrow \neg p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord">¬</span><span class="mord mathnormal">p</span></span></span></span>，假言易位）</li></ul><h4 id="等价-Biconditional"><a class="header-anchor" href="#等价-Biconditional"></a>等价 (Biconditional)</h4><p>如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>→</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p\rightarrow q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 且 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi><mo>→</mo><mi>p</mi></mrow><annotation encoding="application/x-tex">q\rightarrow p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span>，则称 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi></mrow><annotation encoding="application/x-tex">p</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>q</mi></mrow><annotation encoding="application/x-tex">q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span> 等价，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mo>↔</mo><mi>q</mi></mrow><annotation encoding="application/x-tex">p\leftrightarrow q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">↔</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">q</span></span></span></span>，也叫双条件。等价式中的两个命题可以交换。</p><h3 id="命题公式"><a class="header-anchor" href="#命题公式"></a>命题公式</h3>]]>
    </content>
    <id>https://watermelonabc.top/p/d73ba365/</id>
    <link href="https://watermelonabc.top/p/d73ba365/" rel="alternate"/>
    <published>2025-09-09T13:06:00.000Z</published>
    <summary>正如其名，“离散”</summary>
    <title>2025 福州大学离散数学笔记</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="复习笔记" scheme="https://watermelonabc.top/categories/%E5%A4%8D%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="FZU" scheme="https://watermelonabc.top/tags/FZU/"/>
    <content>
      <![CDATA[<div class="tag-plugin image"><div class="image-bg" style="padding:8px;aspect-ratio:1444/1438;width:250px;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/cannot-solve.webp" alt="破防了QAQ" data-fancybox="true" onerror="this.src='/asset/image/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(/asset/image/Fructose-Content-running-medium.webp);"></div></div><div class="image-meta"><span class="image-caption center">破防了 QAQ</span></div></div><p>（永恒的经典：<a href="https://www.bilibili.com/video/BV1XM4y1c7Jp/">【考试周破防】4K 高清重制版</a>）</p><p>沃日，90 分满绩，翁老师我爱你 😚</p><h2 id="教学内容与考核标准"><a class="header-anchor" href="#教学内容与考核标准"></a>教学内容与考核标准</h2><p>内容：基本知识、逻辑运算、逻辑函数化简、逻辑门电路、组合逻辑电路、触发器、时序逻辑电路、中规模逻辑电路</p><p>理论 40 学时 + 实验 36 学时</p><p>考核方式：雨课堂考勤 + 课程中心作业 + 期末考试</p><p>期末考试题目分布</p><ul><li>单选题 1 * 10 = 10 分</li><li>填空题 2 * 10 = 20 分</li><li>化简题 3 * 5 = 15 分</li><li>分析题 3 题 25 分</li><li>设计题 3 题 30 分</li></ul><h2 id="数制"><a class="header-anchor" href="#数制"></a>数制</h2><p>常用数制：十进制 (<strong>Dec</strong>imal)、二进制 (<strong>Bin</strong>ary)、十六进制 (<strong>Hex</strong>adecimal)、八进制 (<strong>Oct</strong>al)</p><p>数字的表示法：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mi>N</mi><msub><mo stretchy="false">)</mo><mi>R</mi></msub><mo>=</mo><mo stretchy="false">(</mo><msub><mi>K</mi><mi>n</mi></msub><msub><mi>K</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><msub><mi>K</mi><mn>1</mn></msub><msub><mi>K</mi><mn>0</mn></msub><mi mathvariant="normal">.</mi><msub><mi>K</mi><mrow><mo>−</mo><mn>1</mn></mrow></msub><msub><mi>K</mi><mrow><mo>−</mo><mn>2</mn></mrow></msub><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><msub><mo stretchy="false">)</mo><mi>R</mi></msub><mo>=</mo><msub><mi>K</mi><mi>n</mi></msub><mo>×</mo><msup><mi>R</mi><mi>n</mi></msup><mo>+</mo><msub><mi>K</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>×</mo><msup><mi>R</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>+</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo>+</mo><msub><mi>K</mi><mn>1</mn></msub><mo>×</mo><msup><mi>R</mi><mn>1</mn></msup><mo>+</mo><msub><mi>K</mi><mn>0</mn></msub><mo>×</mo><msup><mi>R</mi><mn>0</mn></msup><mo>+</mo><msub><mi>K</mi><mrow><mo>−</mo><mn>1</mn></mrow></msub><mo>×</mo><msup><mi>R</mi><mrow><mo>−</mo><mn>1</mn></mrow></msup><mo>+</mo><mi>K</mi><mrow><mo>−</mo><mn>2</mn></mrow><mo>×</mo><mi>R</mi><mrow><mo>−</mo><mn>2</mn></mrow><mo>+</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi></mrow><annotation encoding="application/x-tex">(N)_R = (K_nK_{n-1}...K_{1}K_{0}.K_{-1}K_{-2}...)_R = K_n × R^{n} + K_{n-1} × R^{n-1} + ... + K_{1} × R^{1} + K_{0} × R^{0} + K_{-1} × R^{-1} + K{-2} × R{-2} + ...</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.109em;">N</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0077em;">R</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">...</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">.</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord">...</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0077em;">R</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7977em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7144em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9474em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">...</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9474em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9474em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9474em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">K</span><span class="mord"><span class="mord">−</span><span class="mord">2</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mord"><span class="mord">−</span><span class="mord">2</span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.1056em;"></span><span class="mord">...</span></span></span></span></span></p><p>第二个等号后面的表示法称为 “按权展开法”。注意十六进制数的按权展开需要将字母换成对应的十进制数</p><h3 id="数制转换"><a class="header-anchor" href="#数制转换"></a>数制转换</h3><p>按权展开法会将数字<strong>转换成十进制的</strong>，因此其他进制转十进制非常简单。下面介绍其他进制转换。</p><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p></p><p>本部分在考试中仅作选择或填空题。选择自己可以熟练掌握的技巧，不需要考虑方法是否学过。</p></div></div><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p></p><p>一些计算器不支持小数的进制转换，你可能需要在线寻找，例如<a href="https://www.8jz.cn/binary">二进制转换</a>或 <a href="https://binary2hex.com/numberconverter.html">BINARY2HEX</a>；或者使用更高级的计算器，如 <a href="https://qalculate.github.io/">Qalculate!</a></p></div></div><h4 id="1-十进制转二进制"><a class="header-anchor" href="#1-十进制转二进制"></a>1. 十进制转二进制</h4><p>正规方法：整数<strong>除 2 取余</strong>；小数<strong>乘 2 取整</strong>。</p><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p>除 2 取余，除到商为 0 为止<br>乘 2 取整，乘到积为 1 或精度的后一位为止。期间，如果整数部分有进位，舍去进位。当得到精度的后一位（如要求 4 位小数，则进行 5 次乘法）时，如果整数部分为 0，则不进位；如果整数部分为 1，则进位。</p></div></div><p>其他方法：按位展开，逐次递减</p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20250908170449275.png" alt="image-20250908170136476" style="zoom: 50%;"><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p></p><p>由于其他进制转十进制很容易，因此如果想降低知识点负担，对于其他进制转二进制，只需要先转成十进制，然后再转成二进制即可。</p></div></div><h4 id="2-二进制转八进制"><a class="header-anchor" href="#2-二进制转八进制"></a>2. 二进制转八进制</h4><p>整数从右到左、小数从左到右，将数字按三位三位划分（三位二进制数最多表示到 7），不足三位的用 0 补齐。然后分别计算三位数字对应的八进制数，连接起来即可。</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>11100101.01</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mn>011</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo stretchy="false">(</mo><mn>100</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo stretchy="false">(</mo><mn>101</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mi mathvariant="normal">.</mi><mo stretchy="false">(</mo><mn>010</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mn>3</mn><msub><mo stretchy="false">)</mo><mn>8</mn></msub><mo stretchy="false">(</mo><mn>4</mn><msub><mo stretchy="false">)</mo><mn>8</mn></msub><mo stretchy="false">(</mo><mn>5</mn><msub><mo stretchy="false">)</mo><mn>8</mn></msub><mi mathvariant="normal">.</mi><mo stretchy="false">(</mo><mn>2</mn><msub><mo stretchy="false">)</mo><mn>8</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mn>345.2</mn><msub><mo stretchy="false">)</mo><mn>8</mn></msub></mrow><annotation encoding="application/x-tex">(11100101.01)_2 = (011)_2(100)_2(101)_2.(010)_2=(3)_{8}(4)_{8}(5)_{8}.(2)_{8}=(345.2)_8</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">11100101.01</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">011</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">100</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">101</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">.</span><span class="mopen">(</span><span class="mord">010</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">4</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">5</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">.</span><span class="mopen">(</span><span class="mord">2</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">345.2</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">8</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>八转二是逆过程，每一个八进制数用三位二进制数表示即可。</p><h4 id="3-二进制转十六进制"><a class="header-anchor" href="#3-二进制转十六进制"></a>3. 二进制转十六进制</h4><p>整数从右到左、小数从左到右，将数字按四位四位划分（四位二进制数最多表示到 F，即 15），不足四位的用 0 补齐。然后分别计算四位数字对应的十六进制数，连接起来即可。</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>11100101.01</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mn>1110</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo stretchy="false">(</mo><mn>0101</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mi mathvariant="normal">.</mi><mo stretchy="false">(</mo><mn>0100</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mtext>E</mtext><msub><mo stretchy="false">)</mo><mn>16</mn></msub><mo stretchy="false">(</mo><mn>5</mn><msub><mo stretchy="false">)</mo><mn>16</mn></msub><mi mathvariant="normal">.</mi><mo stretchy="false">(</mo><mn>8</mn><msub><mo stretchy="false">)</mo><mn>16</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mtext>E</mtext><mn>5.8</mn><msub><mo stretchy="false">)</mo><mn>16</mn></msub></mrow><annotation encoding="application/x-tex">(11100101.01)_2 = (1110)_2(0101)_2.(0100)_2=(\text{E})_{16}(5)_{16}.(8)_{16} = (\text{E}5.8)_{16}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">11100101.01</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1110</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">0101</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">.</span><span class="mopen">(</span><span class="mord">0100</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord text"><span class="mord">E</span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">16</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord">5</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">16</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">.</span><span class="mopen">(</span><span class="mord">8</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">16</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord text"><span class="mord">E</span></span><span class="mord">5.8</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">16</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>十六转二是逆过程，每一个十六进制数用四位二进制数表示即可。</p><h3 id="有符号数表达"><a class="header-anchor" href="#有符号数表达"></a>有符号数表达</h3><p>对于有符号数，数字的最高位（最左端）是符号位，用 “0” 表示正数，用 “1” 表示负数。符号位之后的位才表示数值。例如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>01010</mn><mo>=</mo><mo>+</mo><mn>1010</mn><mo>=</mo><mo>+</mo><mn>10</mn></mrow><annotation encoding="application/x-tex">01010 = +1010 = +10</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">01010</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">+</span><span class="mord">1010</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">+</span><span class="mord">10</span></span></span></span></p><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p></p><p>符号位只有<strong>一位</strong>，如果计算时发现符号位出现进位现象，舍弃进位。</p></div></div><p>通常将用 “+”、“-” 表示正、负的<strong>二进制数</strong>称为符号数的<strong>真值</strong>，而把将符号和数值一起编码表示的二进制数称为<strong>机器数或机器码</strong>。</p><h4 id="1-原码"><a class="header-anchor" href="#1-原码"></a>1. 原码</h4><p>数值位和无符号数一样，再加上符号位，就得到了原码。整数的符号位加在数值位最高位的左端，小数的符号位在整数部分上。</p><p>如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo><mn>1101</mn></mrow><annotation encoding="application/x-tex">+1101</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">+</span><span class="mord">1101</span></span></span></span> 的原码是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>01101</mn></mrow><annotation encoding="application/x-tex">01101</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">01101</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1101</mn></mrow><annotation encoding="application/x-tex">-1101</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">1101</span></span></span></span> 的原码是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>11101</mn></mrow><annotation encoding="application/x-tex">11101</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">11101</span></span></span></span>；<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo><mn>0.1011</mn></mrow><annotation encoding="application/x-tex">+0.1011</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">+</span><span class="mord">0.1011</span></span></span></span> 的原码是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0.1011</mn></mrow><annotation encoding="application/x-tex">0.1011</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0.1011</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>0.1011</mn></mrow><annotation encoding="application/x-tex">-0.1011</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">0.1011</span></span></span></span> 的原码是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.1011</mn></mrow><annotation encoding="application/x-tex">1.1011</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1.1011</span></span></span></span>。</p><p>原码虽然表示简单，但计算较为不便。例如，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>9</mn><mo>+</mo><mo stretchy="false">(</mo><mo>−</mo><mn>3</mn><mo stretchy="false">)</mo><mo>=</mo><mn>6</mn></mrow><annotation encoding="application/x-tex">9+(-3) = 6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">3</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">6</span></span></span></span>，但在原码表示中，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>9</mn><mo>+</mo><mo stretchy="false">(</mo><mo>−</mo><mn>3</mn><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><mn>01001</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo>+</mo><mo stretchy="false">(</mo><mn>10011</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mn>11100</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo>=</mo><mo>−</mo><mn>12</mn></mrow><annotation encoding="application/x-tex">9+(-3)=(01001)_2+(10011)_2=(11100)_2=-12</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">3</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">01001</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">10011</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">11100</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">12</span></span></span></span>，很明显是错误的！</p><h4 id="2-反码"><a class="header-anchor" href="#2-反码"></a>2. 反码</h4><p>相比原码，正数反码不变，而负数反码的数值位按位取反。如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo><mn>1101</mn></mrow><annotation encoding="application/x-tex">+1101</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">+</span><span class="mord">1101</span></span></span></span> 的反码是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>01101</mn></mrow><annotation encoding="application/x-tex">01101</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">01101</span></span></span></span>，而 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1101</mn></mrow><annotation encoding="application/x-tex">-1101</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">1101</span></span></span></span> 的反码是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>10010</mn></mrow><annotation encoding="application/x-tex">10010</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">10010</span></span></span></span>。</p><p>反码是解决原码带来的计算问题的一个过渡方案。这句话的意思是：它仍然有问题。比如反码仍然算不对上面的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>9</mn><mo>+</mo><mo stretchy="false">(</mo><mo>−</mo><mn>3</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">9+(-3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">3</span><span class="mclose">)</span></span></span></span>。</p><p>原码和反码还会多出来一个 “正负 0” 问题：“正 0” 表示为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0000</mn><mtext>&nbsp;</mtext><mn>0000</mn></mrow><annotation encoding="application/x-tex">0000\ 0000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0000</span><span class="mspace">&nbsp;</span><span class="mord">0000</span></span></span></span>，而 “负 0” 表示为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1000</mn><mtext>&nbsp;</mtext><mn>0000</mn></mrow><annotation encoding="application/x-tex">1000\ 0000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1000</span><span class="mspace">&nbsp;</span><span class="mord">0000</span></span></span></span></p><h4 id="3-补码"><a class="header-anchor" href="#3-补码"></a>3. 补码</h4><p>相比原码，正数补码不变，而负数补码的数值位按位取反后还要对最低位加 1。如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1101</mn></mrow><annotation encoding="application/x-tex">-1101</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">1101</span></span></span></span> 的补码是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo stretchy="false">(</mo><mn>0010</mn><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo>=</mo><mn>10011</mn></mrow><annotation encoding="application/x-tex">1(0010+1)=10011</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mopen">(</span><span class="mord">0010</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">10011</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>0.1101</mn></mrow><annotation encoding="application/x-tex">-0.1101</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">0.1101</span></span></span></span> 的补码是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1.</mn><mo stretchy="false">(</mo><mn>0010</mn><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo><mo>=</mo><mn>1.0011</mn></mrow><annotation encoding="application/x-tex">1.(0010+1)=1.0011</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1.</span><span class="mopen">(</span><span class="mord">0010</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1.0011</span></span></span></span></p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p></p><p>也可以这么看：对于负数，数值位从右到左（即最低位）数直到遇到第一个 1，这些位不变，之后的位取反，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>1101</mn><mo>=</mo><mn>1</mn><mo stretchy="false">(</mo><mn>110</mn><msub><mo stretchy="false">)</mo><mtext> 反</mtext></msub><mn> 1</mn><mo>=</mo><mn>10011</mn></mrow><annotation encoding="application/x-tex">-1101=1 (110)_{\text {反}} 1=10011</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">1101</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mopen">(</span><span class="mord">110</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight"> 反</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">10011</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>−</mo><mn>10110</mn><mo>=</mo><mn>1</mn><mo stretchy="false">(</mo><mn>101</mn><msub><mo stretchy="false">)</mo><mtext> 反</mtext></msub><mn> 10</mn><mo>=</mo><mn>101010</mn></mrow><annotation encoding="application/x-tex">-10110=1 (101)_{\text {反}} 10=101010</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">10110</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mopen">(</span><span class="mord">101</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight"> 反</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord">10</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">101010</span></span></span></span></p></div></div><p>补码解决了原码和反码的计算问题，这次就算对了 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>9</mn><mo>+</mo><mo stretchy="false">(</mo><mo>−</mo><mn>3</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">9+(-3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">3</span><span class="mclose">)</span></span></span></span> 。</p><p>补码也解决了 “正负 0” 问题：对于 8 位二进制数，“负 0” 的补码仍然是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0000</mn><mtext>&nbsp;</mtext><mn>0000</mn></mrow><annotation encoding="application/x-tex">0000\ 0000</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0000</span><span class="mspace">&nbsp;</span><span class="mord">0000</span></span></span></span>，因为第 9 位因溢出而舍弃。</p><p>计算机中的运算均采用补码形式。</p><h2 id="码制"><a class="header-anchor" href="#码制"></a>码制</h2><p>如果说数制表示数字，那么码制就表示信息。</p><h3 id="BCD-码"><a class="header-anchor" href="#BCD-码"></a>BCD 码</h3><p>BCD 码全称二 - 十进制 (Binary Coded Decimal) 码，通过四位二进制数对一位十进制数编码以传递信息。例如，对于十进制的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>12</mn></mrow><annotation encoding="application/x-tex">12</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">12</span></span></span></span>，我们不是直接转换成 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1100</mn></mrow><annotation encoding="application/x-tex">1100</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1100</span></span></span></span>，而是对 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn></mrow><annotation encoding="application/x-tex">2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span> 分别进行 BCD 编码。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p></p><p>由于一位十进制数仅由 0 ~ 9 表示，但四位二进制数可以表示 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mn>4</mn></msup><mo>=</mo><mn>16</mn></mrow><annotation encoding="application/x-tex">2^4=16</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8141em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">16</span></span></span></span> 个十进制数，于是每种 BCD 码仅取出其中 10 种作为有效编码，其余 6 种是无效编码（称为 “冗余码”）。</p></div></div><p>BCD 码有何好处？首先是转换方便。计算机只需要每四位二进制数按照映射表转换成一位十进制数，然后拼接即可得到完整的十进制数字，这比整体按权展开要容易得多。</p><p>其次，由于 BCD 按位编码，所以它可以精确表示十进制小数。如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0.1</mn></mrow><annotation encoding="application/x-tex">0.1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0.1</span></span></span></span> 在一种 BCD 码下表示为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0000.0001</mn></mrow><annotation encoding="application/x-tex">0000.0001</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0000.0001</span></span></span></span>，但如果乘 2 取整就会得到一个无限循环小数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0.000110011001100...</mn></mrow><annotation encoding="application/x-tex">0.000110011001100...</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0.000110011001100...</span></span></span></span>，计算机无法精确表示一个具有无限位的数，于是会出现精度问题。</p><p>本课主要学习 8421 码和余 3 码，2421 码仅作了解</p><h4 id="1-8421-码"><a class="header-anchor" href="#1-8421-码"></a>1. 8421 码</h4><p>8421 码是最常用的一种有权码。8421 码到十进制的转换和普通二进制数相同（按权展开），它们表示出来的 0 ~ 9 也完全相同。注意，1010 ~ 1111 是冗余码。</p><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p></p><p>8421 码表示的二进制数字和其对应十进制数字字符的 ASCII 码的低四位相同，因此使用 8421 码可以简化 BCD 码与对应 ASCII 码的转换。</p></div></div><p>8421 码按位编码，如：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>258</mn><msub><mo stretchy="false">)</mo><mn>10</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mn>0010</mn><mtext>&nbsp;</mtext><mn>0101</mn><mtext>&nbsp;</mtext><mn>1000</mn><msub><mo stretchy="false">)</mo><mtext>8421 码</mtext></msub></mrow><annotation encoding="application/x-tex"> (258)_{10}=(0010\ 0101\ 1000)_{\text {8421 码}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">258</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">10</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0010</span><span class="mspace">&nbsp;</span><span class="mord">0101</span><span class="mspace">&nbsp;</span><span class="mord">1000</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">8421</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>0001</mn><mtext>&nbsp;</mtext><mn>0001</mn><mtext>&nbsp;</mtext><mn>0100</mn><mtext>&nbsp;</mtext><mn>0101</mn><msub><mo stretchy="false">)</mo><mtext>8421</mtext></msub><mo>=</mo><mo stretchy="false">(</mo><mn>1145</mn><msub><mo stretchy="false">)</mo><mn>10</mn></msub></mrow><annotation encoding="application/x-tex">(0001\ 0001\ 0100\ 0101)_{\text{8421}}=(1145)_{10}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0001</span><span class="mspace">&nbsp;</span><span class="mord">0001</span><span class="mspace">&nbsp;</span><span class="mord">0100</span><span class="mspace">&nbsp;</span><span class="mord">0101</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">8421</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1145</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">10</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>8421 码之间的计算：<strong>如果某一位的和 ≤ 9</strong>，且<strong>没有产生进位</strong>，无需调整；<strong>如果某一位的和 &gt; 9</strong>，或者<strong>产生了进位</strong>（虽然和 ≤ 9 但向高位进了一位），则必须进行加 6 调整（即加上 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0110</mn></mrow><annotation encoding="application/x-tex">0110</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0110</span></span></span></span>）。和之后的余 3 码相比，8421 码的调整规则就多了一点。</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mn>17</mn><mo>+</mo><mn>18</mn><mo>=</mo><mn>0001</mn><mtext>&nbsp;</mtext><mn>0111</mn><mo>+</mo><mn>0001</mn><mtext>&nbsp;</mtext><mn>1000</mn><mo>=</mo><mn>0010</mn><mtext>&nbsp;</mtext><mn>1111</mn><mtext>(进位 + 低四位和&nbsp;&gt;&nbsp;9, 需要调整)</mtext></mrow><annotation encoding="application/x-tex"> 17 + 18=0001\ 0111 + 0001\ 1000=0010\ 1111\text {(进位 + 低四位和 &gt; 9, 需要调整)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">17</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">18</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0001</span><span class="mspace">&nbsp;</span><span class="mord">0111</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0001</span><span class="mspace">&nbsp;</span><span class="mord">1000</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">0010</span><span class="mspace">&nbsp;</span><span class="mord">1111</span><span class="mord text"><span class="mord">(</span><span class="mord cjk_fallback">进位</span><span class="mord"> +</span><span class="mord cjk_fallback"> 低四位和</span><span class="mord">&nbsp;&gt;&nbsp;9,</span><span class="mord cjk_fallback"> 需要调整</span><span class="mord">)</span></span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>调整：</mtext><mn>0010</mn><mtext>&nbsp;</mtext><mn>1111</mn><mo>+</mo><mn>0000</mn><mtext>&nbsp;</mtext><mn>0110</mn><mo>=</mo><mo stretchy="false">(</mo><mn>0011</mn><mtext>&nbsp;</mtext><mn>0101</mn><msub><mo stretchy="false">)</mo><mtext>8421 码</mtext></msub><mo> =</mo><mn>35</mn></mrow><annotation encoding="application/x-tex">\text {调整：} 0010\ 1111+ 0000\ 0110=(0011\ 0101)_{\text {8421 码}}=35</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord text"><span class="mord cjk_fallback">调整：</span></span><span class="mord">0010</span><span class="mspace">&nbsp;</span><span class="mord">1111</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0000</span><span class="mspace">&nbsp;</span><span class="mord">0110</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0011</span><span class="mspace">&nbsp;</span><span class="mord">0101</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">8421</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">35</span></span></span></span></span></p><h4 id="2-2421-码"><a class="header-anchor" href="#2-2421-码"></a>2. 2421 码</h4><p>2421 码也是一种有权码，它的权是 2、4、2、1。0101 ~ 1010 是冗余码。</p><p>2421 码是一种对 9 的自补代码，可以给运算带来方便。对 9 自补意味着一个数的 2421 码只要自身按位取反，便可以得到该数对 9 的补数的 2421 码。</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>258</mn><msub><mo stretchy="false">)</mo><mn>10</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mn>0010</mn><mtext>&nbsp;</mtext><mn>1011</mn><mtext>&nbsp;</mtext><mn>1110</mn><msub><mo stretchy="false">)</mo><mtext>2421 码</mtext></msub></mrow><annotation encoding="application/x-tex"> (258)_{10}=(0010\ 1011\ 1110)_{\text {2421 码}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">258</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">10</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0010</span><span class="mspace">&nbsp;</span><span class="mord">1011</span><span class="mspace">&nbsp;</span><span class="mord">1110</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">2421</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>0001</mn><mtext>&nbsp;</mtext><mn>0001</mn><mtext>&nbsp;</mtext><mn>0100</mn><mtext>&nbsp;</mtext><mn>1011</mn><msub><mo stretchy="false">)</mo><mtext>2421 码</mtext></msub><mo> =</mo><mo stretchy="false">(</mo><mn>1145</mn><msub><mo stretchy="false">)</mo><mtext>2421 码</mtext></msub></mrow><annotation encoding="application/x-tex"> (0001\ 0001\ 0100\ 1011)_{\text {2421 码}}=(1145)_{\text {2421 码}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0001</span><span class="mspace">&nbsp;</span><span class="mord">0001</span><span class="mspace">&nbsp;</span><span class="mord">0100</span><span class="mspace">&nbsp;</span><span class="mord">1011</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">2421</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1145</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">2421</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>4</mn><msub><mo stretchy="false">)</mo><mn>10</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mn>0100</mn><msub><mo stretchy="false">)</mo><mtext>2421 码</mtext></msub><mover><mo stretchy="true" minsize="3.0em">→</mo><mpadded width="+0.6em" lspace="0.3em"><mtext>按位取反</mtext></mpadded></mover><mo stretchy="false"> (</mo><mn>1011</mn><msub><mo stretchy="false">)</mo><mtext>2421&nbsp;码</mtext></msub><mo> =</mo><mo stretchy="false">(</mo><mn>5</mn><msub><mo stretchy="false">)</mo><mn>10</mn></msub></mrow><annotation encoding="application/x-tex">(4)_{10}=(0100)_{\text {2421 码}}\xrightarrow {\text {按位取反}}(1011)_{\text {2421 码}}=(5)_{10}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">10</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.3503em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0100</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">2421</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel x-arrow"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1003em;"><span style="top:-3.322em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight x-arrow-pad"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight">按位取反</span></span></span></span></span><span class="svg-align" style="top:-2.689em;"><span class="pstrut" style="height:2.7em;"></span><span class="hide-tail" style="height:0.522em;min-width:1.469em;"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="0.522em" viewBox="0 0 400000 522" preserveAspectRatio="xMaxYMin slice"><path d="M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67 151.7 139 205zm0 0v40h399900v-40z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.011em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1011</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">2421&nbsp;</span><span class="mord cjk_fallback mtight">码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">5</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">10</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><h4 id="3-余-3-码"><a class="header-anchor" href="#3-余-3-码"></a>3. 余 3 码</h4><p>余 3 码是 8421 码加上 0011 形成的一种无权码，因其比 8421 码多 3 而得名，如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>5</mn><msub><mo stretchy="false">)</mo><mn>10</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mn>0101</mn><msub><mo stretchy="false">)</mo><mtext>8421 码</mtext></msub><mo> +</mo><mo stretchy="false">(</mo><mn>0011</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mn>1000</mn><msub><mo stretchy="false">)</mo><mtext> 余 3 码</mtext></msub></mrow><annotation encoding="application/x-tex"> (5)_{10} = (0101)_{\text {8421 码}}+(0011)_{2}=(1000)_{\text {余 3 码}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">5</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">10</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0101</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">8421</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0011</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1000</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight"> 余</span><span class="mord mtight"> 3</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。0000、0001、0010、1101、1110、1111 是冗余码。</p><p>余 3 码同样是一种对 9 的自补代码。两个余 3 码相加的运算规则是：如果有进位，结果每四位加 3；如果没有进位，结果每四位减 3。注意将结果转换回十进制时使用的是余 3 码。</p><p>余 3 码同样按位编码。</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>256</mn><msub><mo stretchy="false">)</mo><mn>10</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mn>0010</mn><msub><mo stretchy="false">)</mo><mn>8421</mn></msub><mo>+</mo><mo stretchy="false">(</mo><mn>0011</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mtext>&nbsp;&nbsp;</mtext><mo stretchy="false">(</mo><mn>0101</mn><msub><mo stretchy="false">)</mo><mn>8421</mn></msub><mo>+</mo><mo stretchy="false">(</mo><mn>0011</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mtext>&nbsp;&nbsp;</mtext><mo stretchy="false">(</mo><mn>0110</mn><msub><mo stretchy="false">)</mo><mn>8421</mn></msub><mo>+</mo><mo stretchy="false">(</mo><mn>0011</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><msub><mo stretchy="false">)</mo><mtext> 余 3 码</mtext></msub><mo> =</mo><mo stretchy="false">(</mo><mn>0101</mn><mtext>&nbsp;</mtext><mn>1000</mn><mtext>&nbsp;</mtext><mn>1001</mn><msub><mo stretchy="false">)</mo><mtext> 余 3 码</mtext></msub></mrow><annotation encoding="application/x-tex"> (256)_{10}=((0010)_{8421}+(0011)_2\ \ (0101)_{8421}+(0011)_{2}\ \ (0110)_{8421}+(0011)_{2})_{\text {余 3 码}}=(0101\ 1000\ 1001)_{\text {余 3 码}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">256</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">10</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">((</span><span class="mord">0010</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8421</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0011</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace">&nbsp;</span><span class="mspace">&nbsp;</span><span class="mopen">(</span><span class="mord">0101</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8421</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0011</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace">&nbsp;</span><span class="mspace">&nbsp;</span><span class="mopen">(</span><span class="mord">0110</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8421</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0011</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight"> 余</span><span class="mord mtight"> 3</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">0101</span><span class="mspace">&nbsp;</span><span class="mord">1000</span><span class="mspace">&nbsp;</span><span class="mord">1001</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight"> 余</span><span class="mord mtight"> 3</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>1000</mn><mtext>&nbsp;</mtext><mn>1001</mn><mtext>&nbsp;</mtext><mn>1001</mn><mtext>&nbsp;</mtext><mn>1011</mn><msub><mo stretchy="false">)</mo><mtext> 余 3 码</mtext></msub><mo> =</mo><mo stretchy="false">(</mo><mn>5668</mn><msub><mo stretchy="false">)</mo><mn>10</mn></msub></mrow><annotation encoding="application/x-tex">(1000\ 1001\ 1001\ 1011)_{\text {余 3 码}}=(5668)_{10}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1000</span><span class="mspace">&nbsp;</span><span class="mord">1001</span><span class="mspace">&nbsp;</span><span class="mord">1001</span><span class="mspace">&nbsp;</span><span class="mord">1011</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight"> 余</span><span class="mord mtight"> 3</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">5668</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">10</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>计算：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mn>13</mn><mo>+</mo><mn>67</mn><mo>=</mo><mn>0100</mn><mtext>&nbsp;</mtext><mn>0110</mn><mo>+</mo><mn>1001</mn><mtext>&nbsp;</mtext><mn>1010</mn><mo>=</mo><mn>1110</mn><mtext>&nbsp;</mtext><mn>0000</mn><mtext>(进位，需要调整)</mtext></mrow><annotation encoding="application/x-tex"> 13+67=0100\ 0110+1001\ 1010=1110\ 0000\text {(进位，需要调整)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">13</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">67</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0100</span><span class="mspace">&nbsp;</span><span class="mord">0110</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1001</span><span class="mspace">&nbsp;</span><span class="mord">1010</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1110</span><span class="mspace">&nbsp;</span><span class="mord">0000</span><span class="mord text"><span class="mord">(</span><span class="mord cjk_fallback">进位，需要调整</span><span class="mord">)</span></span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>调整：</mtext><mn>1110</mn><mtext>&nbsp;</mtext><mn>0000</mn><mo>+</mo><mn>0011</mn><mtext>&nbsp;</mtext><mn>0011</mn><mo>=</mo><mo stretchy="false">(</mo><mn>1011</mn><mtext>&nbsp;</mtext><mn>0011</mn><msub><mo stretchy="false">)</mo><mtext> 余 3 码</mtext></msub><mo> =</mo><mn>80</mn></mrow><annotation encoding="application/x-tex">\text {调整：} 1110\ 0000 + 0011\ 0011 = (1011\ 0011)_{\text {余 3 码}} = 80</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord text"><span class="mord cjk_fallback">调整：</span></span><span class="mord">1110</span><span class="mspace">&nbsp;</span><span class="mord">0000</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0011</span><span class="mspace">&nbsp;</span><span class="mord">0011</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1011</span><span class="mspace">&nbsp;</span><span class="mord">0011</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight"> 余</span><span class="mord mtight"> 3</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">80</span></span></span></span></span></p><p>几种 BCD 码的映射表：</p><table><thead><tr><th style="text-align:center">十进制数字</th><th style="text-align:center">8421 码</th><th style="text-align:center">2421 码</th><th style="text-align:center">余 3 码</th></tr></thead><tbody><tr><td style="text-align:center">0</td><td style="text-align:center"><code>0000</code></td><td style="text-align:center"><code>0000</code></td><td style="text-align:center"><code>0011</code></td></tr><tr><td style="text-align:center">1</td><td style="text-align:center"><code>0001</code></td><td style="text-align:center"><code>0001</code></td><td style="text-align:center"><code>0100</code></td></tr><tr><td style="text-align:center">2</td><td style="text-align:center"><code>0010</code></td><td style="text-align:center"><code>0010</code></td><td style="text-align:center"><code>0101</code></td></tr><tr><td style="text-align:center">3</td><td style="text-align:center"><code>0011</code></td><td style="text-align:center"><code>0011</code></td><td style="text-align:center"><code>0110</code></td></tr><tr><td style="text-align:center">4</td><td style="text-align:center"><code>0100</code></td><td style="text-align:center"><code>0100</code></td><td style="text-align:center"><code>0111</code></td></tr><tr><td style="text-align:center">5</td><td style="text-align:center"><code>0101</code></td><td style="text-align:center"><code>1011</code></td><td style="text-align:center"><code>1000</code></td></tr><tr><td style="text-align:center">6</td><td style="text-align:center"><code>0110</code></td><td style="text-align:center"><code>1100</code></td><td style="text-align:center"><code>1001</code></td></tr><tr><td style="text-align:center">7</td><td style="text-align:center"><code>0111</code></td><td style="text-align:center"><code>1101</code></td><td style="text-align:center"><code>1010</code></td></tr><tr><td style="text-align:center">8</td><td style="text-align:center"><code>1000</code></td><td style="text-align:center"><code>1110</code></td><td style="text-align:center"><code>1011</code></td></tr><tr><td style="text-align:center">9</td><td style="text-align:center"><code>1001</code></td><td style="text-align:center"><code>1111</code></td><td style="text-align:center"><code>1100</code></td></tr><tr><td style="text-align:center">无效码</td><td style="text-align:center"><code>1010</code> - <code>1111</code></td><td style="text-align:center"><code>0101</code> - <code>1010</code></td><td style="text-align:center"><code>0000</code> - <code>0010</code> 和 <code>1101</code> - <code>1111</code></td></tr></tbody></table><h3 id="可靠性编码"><a class="header-anchor" href="#可靠性编码"></a>可靠性编码</h3><p>用于校验 / 纠错，提高信息传输的可靠性。</p><p>从 BCD 码转到可靠性编码，中间需要先转到二进制码。例如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>01001000</mn><msub><mo stretchy="false">)</mo><mtext>8421 码</mtext></msub><mo> =</mo><mo stretchy="false">(</mo><mn>110000</mn><msub><mo stretchy="false">)</mo><mn>2</mn></msub><mo>=</mo><mo stretchy="false">(</mo><mn>101000</mn><msub><mo stretchy="false">)</mo><mtext> 格雷码</mtext></msub></mrow><annotation encoding="application/x-tex"> (01001000)_{\text {8421 码}}=(110000)_{2}=(101000)_{\text {格雷码}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">01001000</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord mtight">8421</span><span class="mord cjk_fallback mtight"> 码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">110000</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">101000</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord text mtight"><span class="mord cjk_fallback mtight"> 格雷码</span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><blockquote><p>由于 8421 码的低四位和二进制码相同，因此在转换小等于 4 位的 8421 码时，可以直接转换成格雷码</p></blockquote><h4 id="格雷码"><a class="header-anchor" href="#格雷码"></a>格雷码</h4><p>格雷码的特点：任意两个相邻的数，其格雷码仅有一位不同。可以有效避免多位跳变，提高系统可靠性。</p><p>二进制码转格雷码：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mtext>设二进制码为&nbsp;</mtext><mi>B</mi><mo>=</mo><msub><mi>B</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><msub><mi>B</mi><mrow><mi>n</mi><mo>−</mo><mn>2</mn></mrow></msub><mo>…</mo><msub><mi>B</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub><msub><mi>B</mi><mi>i</mi></msub><mo>…</mo><msub><mi>B</mi><mn>1</mn></msub><msub><mi>B</mi><mn>0</mn></msub><mtext>，对应格雷码为</mtext><mi> G</mi><mo>=</mo><msub><mi>G</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><msub><mi>G</mi><mrow><mi>n</mi><mo>−</mo><mn>2</mn></mrow></msub><mo>…</mo><msub><mi>G</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub><msub><mi>G</mi><mi>i</mi></msub><mo>…</mo><msub><mi>G</mi><mn>1</mn></msub><msub><mi>G</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">\text {设二进制码为}\ B = B_{n-1} B_{n-2} … B_{i+1} B_i … B_1B_0\text {，对应格雷码为} G = G_{n-1} G_{n-2} … G_{i+1} G_i … G_1G_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord text"><span class="mord cjk_fallback">设二进制码为</span></span><span class="mspace">&nbsp;</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord text"><span class="mord cjk_fallback">，对应格雷码为</span></span><span class="mord mathnormal"> G</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>有：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>G</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>=</mo><msub><mi>B</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mtext>（最高位相同）</mtext></mrow><annotation encoding="application/x-tex">G_{n-1} = B_{n-1}\text {（最高位相同）}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord text"><span class="mord cjk_fallback">（最高位相同）</span></span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>G</mi><mi>i</mi></msub><mo>=</mo><msub><mi>B</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>⊕</mo><msub><mi>B</mi><mi>i</mi></msub><mtext>（其他位为高位二进制与当前位异或）</mtext></mrow><annotation encoding="application/x-tex">G_i = B_{i+1} ⊕ B_i\text {（其他位为高位二进制与当前位异或）}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord text"><span class="mord cjk_fallback">（其他位为高位二进制与当前位异或）</span></span></span></span></span></span></p><p>格雷码转二进制码：</p><p>逆向计算。二进制码的最高位（最左边）与格雷码的最高位相同。将产生的每一位二进制码，与下一位相邻的格雷码异或（舍去进位），作为二进制码的下一位。</p><p>即：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>B</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>=</mo><msub><mi>G</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub><mtext>（最高位相同）</mtext></mrow><annotation encoding="application/x-tex">B_{n-1} = G_{n-1}\text {（最高位相同）}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord text"><span class="mord cjk_fallback">（最高位相同）</span></span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>B</mi><mi>i</mi></msub><mo>=</mo><msub><mi>B</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>⊕</mo><msub><mi>G</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">B_{i} = B_{i+1} ⊕ G_{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>每位 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>B</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">B_{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 最终可以全部用格雷码表示。</p><h4 id="奇偶校验码"><a class="header-anchor" href="#奇偶校验码"></a>奇偶校验码</h4><p>奇偶校验码仅校验，不纠错（因为无法判断出错位置），只能检测奇数个 bit 错误。</p><ul><li><p>奇校验</p><p>如果给定一组数据位中 1 的个数是奇数，补一个 bit（0 或 1）在最右方，使得总的 1 的个数是<strong>奇数</strong>。例：0000001, 补一个 bit 为 0, 得到 0000001<strong>0</strong>。<br>校验时，对接收数据（含校验位）逐位相加，对 2 取余。如果余数为 1，则奇校验通过。</p></li><li><p>偶校验</p><p>如果一组给定数据位中 1 的个数是奇数，补一个 bit（0 或 1）在最右方，使得总的 1 的个数是<strong>偶数</strong>。例：0000001, 补一个 bit 为 1, 得到 0000001<strong>1</strong>。<br>校验时，对接收数据（含校验位）逐位相加，对 2 取余。如果余数为 0，则偶校验通过。</p></li></ul><p>异或的 “不进位加法” 性质和此校验方法相似。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>实际上，在数学中，一个二进制数的奇偶性只需要看它的最低位即可。如果最低位为 1，则为奇数；为 0，则为偶数。</p></div></div><blockquote><p>reference: <a href="https://zh.wikipedia.org/wiki/%E5%A5%87%E5%81%B6%E6%A0%A1%E9%AA%8C%E4%BD%8D">奇偶校验位</a></p></blockquote><h2 id="逻辑代数基础"><a class="header-anchor" href="#逻辑代数基础"></a>逻辑代数基础</h2><p>逻辑代数是逻辑电路的数学表达。</p><h3 id="代数系统概述"><a class="header-anchor" href="#代数系统概述"></a>代数系统概述</h3><p>逻辑变量以大写字母表示。逻辑变量的取值只有 “0” 和 “1” 两种可能</p><p>三大基本逻辑运算：</p><ul><li>与 (AND)<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mi>A</mi><mo>⋅</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">F = A\cdot B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span></li><li>对应逻辑电路中的 “或门”</li></ul></li><li>或 (OR)<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mi>A</mi><mo>+</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">F = A+B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span></li><li>对应逻辑电路中的 “与门”</li></ul></li><li>非 (NOT)<ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">F = \overline{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span></li><li>对应逻辑电路中的 “非门”/“反相器”</li></ul></li></ul><p>在一个表达式中，如果既有与运算又有或运算，则按<strong>先与后或</strong>的规则进行运算。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>“与” 也称 “逻辑乘”，只要有一个变量为假 (0)，那么运算结果也为假，和一般乘法相同<br>“或” 也称 “逻辑加”，只要有一个变量为真 (1)，那么运算结果也为真，和一般加法相似</p></div></div><p>五大公理：</p><ol><li><p>交换律</p></li><li><p>结合律</p></li><li><p>分配律</p></li></ol><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>+</mo><mo stretchy="false">(</mo><mi>B</mi><mo>⋅</mo><mi>C</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><mi>A</mi><mo>+</mo><mi>B</mi><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><mi>A</mi><mo>+</mo><mi>C</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A+(B\cdot C) = (A+B)\cdot (A+C)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>⋅</mo><mo stretchy="false">(</mo><mi>B</mi><mo>+</mo><mi>C</mi><mo stretchy="false">)</mo><mo>=</mo><mi>A</mi><mo>⋅</mo><mi>B</mi><mo>+</mo><mi>A</mi><mo>⋅</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">A\cdot (B+C) = A\cdot B + A\cdot C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span></span></li></ul><ol start="4"><li>0-1 律</li></ol><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>+</mo><mn>0</mn><mo>=</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">A + 0=A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>⋅</mo><mn>0</mn><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">A\cdot 0 = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>+</mo><mn>1</mn><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">A + 1 = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>⋅</mo><mn>1</mn><mo>=</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">A\cdot 1 = A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span></li></ul><ol start="5"><li>互补律</li></ol><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>+</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">A + \overline{A} = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>⋅</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">A\cdot \overline{A}=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span> <strong>唯一</strong>存在</li></ul><p>三种基本逻辑运算可以描述各种逻辑关系，对这些关系使用数学描述，即可得到逻辑函数。</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>F</mi><mo>=</mo><mi>f</mi><mrow><mo stretchy="false">(</mo><msub><mi>A</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>A</mi><mn>2</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>A</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow></mrow><annotation encoding="application/x-tex">F=f{(A_1,A_2,...,A_n)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mord"><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></span></p><p>逻辑函数的取值同样是 “0” 或 “1”。如果对应于逻辑变量 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>A</mi><mn>2</mn></msub><mo separator="true">,</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mo separator="true">,</mo><msub><mi>A</mi><mi>n</mi></msub></mrow><annotation encoding="application/x-tex">A_1,A_2,...,A_n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">...</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 的任意一组取值，逻辑函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>F</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">F_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>F</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">F_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 的取值均相等，则 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>F</mi><mn>1</mn></msub><mo>=</mo><msub><mi>F</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">F_1 = F_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。</p><p>表示逻辑函数的方法，除了上面给出的逻辑表达式之外，还有真值表和卡诺图两种。</p><h3 id="基本定理"><a class="header-anchor" href="#基本定理"></a>基本定理</h3><p>由五大公理可推出八大定理：</p><ol><li><p>0-1 律</p></li><li><p>重叠律（你，莫的选择）</p></li></ol><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>+</mo><mi>A</mi><mo>=</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">A+A=A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>⋅</mo><mi>A</mi><mo>=</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">A\cdot A =A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span></li></ul><ol start="3"><li>吸收律</li></ol><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>+</mo><mi>A</mi><mo>⋅</mo><mi>B</mi><mo>=</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">A+A\cdot B=A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>⋅</mo><mo stretchy="false">(</mo><mi>A</mi><mo>+</mo><mi>B</mi><mo stretchy="false">)</mo><mo>=</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">A\cdot (A+B)=A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span></li></ul><ol start="4"><li>消除律</li></ol><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>+</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mi>B</mi><mo>=</mo><mi>A</mi><mo>+</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">A+\overline{A}\cdot B = A + B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>⋅</mo><mo stretchy="false">(</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>B</mi><mo stretchy="false">)</mo><mo>=</mo><mi>A</mi><mo>⋅</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">A\cdot (\overline{A}+B)=A\cdot B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span></li></ul><ol start="5"><li>对合律（双重否定表肯定）</li></ol><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo stretchy="true">‾</mo></mover><mo>=</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">\overline{\overline{A}}=A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span></li></ul><ol start="6"><li>互补律</li></ol><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mrow><mi>A</mi><mo>+</mo><mi>B</mi></mrow><mo stretchy="true">‾</mo></mover><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{A+B}=\overline{A}\cdot \overline{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mrow><mi>A</mi><mo>⋅</mo><mi>B</mi></mrow><mo stretchy="true">‾</mo></mover><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{A\cdot B} = \overline{A} + \overline{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span></li></ul><ol start="7"><li>并项律</li></ol><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>⋅</mo><mi>B</mi><mo>+</mo><mi>A</mi><mo>⋅</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo>=</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">A\cdot B+A\cdot \overline{B} = A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo>+</mo><mi>B</mi><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><mi>A</mi><mo>+</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo stretchy="false">)</mo><mo>=</mo><mi>A</mi></mrow><annotation encoding="application/x-tex">(A+B)\cdot (A+\overline{B})=A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span></span></span></span></li></ul><ol start="8"><li>包含律</li></ol><ul><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>⋅</mo><mi>B</mi><mo>+</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mi>C</mi><mo>+</mo><mi>B</mi><mo>⋅</mo><mi>C</mi><mo>=</mo><mi>A</mi><mo>⋅</mo><mi>B</mi><mo>+</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">A\cdot B+\overline{A}\cdot C+B\cdot C=A\cdot B+\overline{A}\cdot C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>A</mi><mo>+</mo><mi>B</mi><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>C</mi><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><mi>B</mi><mo>+</mo><mi>C</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><mi>A</mi><mo>+</mo><mi>B</mi><mo stretchy="false">)</mo><mo>⋅</mo><mo stretchy="false">(</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>C</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(A+B)\cdot (\overline{A}+C)\cdot (B+C)=(A+B)\cdot (\overline{A}+C)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span></span></span></span></li></ul><h3 id="重要规则"><a class="header-anchor" href="#重要规则"></a>重要规则</h3><p>三个重要规则：</p><ol><li>代入规则</li></ol><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo stretchy="false">(</mo><mi>B</mi><mo>+</mo><mi>C</mi><mo stretchy="false">)</mo><mo>=</mo><mi>A</mi><mi>B</mi><mo>+</mo><mi>A</mi><mi>C</mi></mrow><annotation encoding="application/x-tex">A(B+C)=AB+AC</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">A</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span></span>，令 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><mo>=</mo><mi>C</mi><mo>+</mo><mi>D</mi></mrow><annotation encoding="application/x-tex">C=C+D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span></span></span></span>，则 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo stretchy="false">[</mo><mi>B</mi><mo>+</mo><mo stretchy="false">(</mo><mi>C</mi><mo>+</mo><mi>D</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo><mo>=</mo><mi>A</mi><mi>B</mi><mo>+</mo><mi>A</mi><mo stretchy="false">(</mo><mi>C</mi><mo>+</mo><mi>D</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">A[B+(C+D)]=AB+A(C+D)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">A</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mclose">)]</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">A</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mclose">)</span></span></span></span></p><ol start="2"><li>反演规则（德・摩根定理）</li></ol><p>一切运算 “反过来”：“<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⋅</mo></mrow><annotation encoding="application/x-tex">\cdot</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4445em;"></span><span class="mord">⋅</span></span></span></span>” 和 “<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo></mrow><annotation encoding="application/x-tex">+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">+</span></span></span></span>” 互换，“0” 和 “1” 互换，原反变量互换，<strong>保持运算顺序不变</strong>（如原式中的乘法优先于加法，反演后从乘法得到的加法仍然优先于从加法得到的乘法）。</p><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">复合逻辑的反演</div></div><div class="callout-content"><p>对于复合逻辑，有两种做法：</p><ul><li>不管复合逻辑，只做下面的基本运算。例如，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mrow><mi>A</mi><mi>B</mi><mi>C</mi></mrow><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{ABC}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span> 的反演式是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mrow><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover></mrow><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{\overline{A}+\overline{B}+\overline{C}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span></span></span></span>。如果需要化简，那么对上面的式子用互补律即可。例如，接上式，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mrow><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover></mrow><mo stretchy="true">‾</mo></mover><mo>=</mo><mover accent="true"><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo stretchy="true">‾</mo></mover><mover accent="true"><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo stretchy="true">‾</mo></mover><mover accent="true"><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover><mo stretchy="true">‾</mo></mover><mo>=</mo><mi>A</mi><mi>B</mi><mi>C</mi></mrow><annotation encoding="application/x-tex">\overline{\overline{A}+\overline{B}+\overline{C}} = \overline{\overline{A}}\overline{\overline{B}}\overline{\overline{C}}=ABC</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span></span></li><li>不管基本运算，直接将复合逻辑下的基本运算视为整体。例如，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mrow><mi>A</mi><mi>B</mi><mi>C</mi></mrow><mo stretchy="true">‾</mo></mover><mo>=</mo><mover accent="true"><mover accent="true"><mrow><mi>A</mi><mi>B</mi><mi>C</mi></mrow><mo stretchy="true">‾</mo></mover><mo stretchy="true">‾</mo></mover><mo>=</mo><mi>A</mi><mi>B</mi><mi>C</mi></mrow><annotation encoding="application/x-tex">\overline{ABC}=\overline{\overline{ABC}}=ABC</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span></span>，可以直接得到最简</li></ul></div></div><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mo stretchy="false">(</mo><mi>C</mi><mo>+</mo><mover accent="true"><mi>D</mi><mo stretchy="true">‾</mo></mover><mi>E</mi><mo stretchy="false">)</mo><mo>→</mo><mover accent="true"><mi>F</mi><mo stretchy="true">‾</mo></mover><mo>=</mo><mi>A</mi><mo>⋅</mo><mo stretchy="false">[</mo><mi>B</mi><mo>+</mo><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mo stretchy="false">(</mo><mi>D</mi><mo>+</mo><mover accent="true"><mi>E</mi><mo stretchy="true">‾</mo></mover><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">F=\overline{A}+\overline{B}\cdot (C+\overline{D}E) \rightarrow \overline{F}=A\cdot [B+\overline{C}\cdot (D+\overline{E})]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0576em;">E</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">E</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mclose">)]</span></span></span></span></p><p>可以求反函数。</p><ol><li>对偶规则</li></ol><p>与反演规则相比，对偶规则不需要原反变量的互换。得到的是函数的对偶式 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>F</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">F'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mo stretchy="false">(</mo><mi>C</mi><mo>+</mo><mover accent="true"><mi>D</mi><mo stretchy="true">‾</mo></mover><mi>E</mi><mo stretchy="false">)</mo><mo>→</mo><msup><mi>F</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mo stretchy="false">[</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>C</mi><mo>⋅</mo><mo stretchy="false">(</mo><mover accent="true"><mi>D</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>E</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">F=\overline{A}+\overline{B}\cdot (C+\overline{D}E) \rightarrow F'=\overline{A}\cdot [\overline{B}+C\cdot (\overline{D}+E)]</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0576em;">E</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">→</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0576em;">E</span><span class="mclose">)]</span></span></span></span></p><p>如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><msup><mi>F</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">F=F'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span>，则 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi></mrow><annotation encoding="application/x-tex">F</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span></span></span></span> 为自对偶函数。</p><p>如果 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mi>G</mi></mrow><annotation encoding="application/x-tex">F=G</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">G</span></span></span></span>，则 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>F</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>=</mo><msup><mi>G</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">F'=G'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal">G</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span>。</p><h3 id="复合逻辑"><a class="header-anchor" href="#复合逻辑"></a>复合逻辑</h3><ol><li>与非逻辑</li></ol><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mrow><mi>A</mi><mo>⋅</mo><mi>B</mi><mo>⋅</mo><mi>C</mi><mo>⋅</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi></mrow><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">F=\overline{A\cdot B\cdot C \cdot ...}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">...</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span></p><p>与非逻辑可以检测全 1 序列</p><p>使用与非逻辑可以实现与、或、非三种基本运算</p><ul><li><p>与：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mrow><mover accent="true"><mrow><mi>A</mi><mo>⋅</mo><mi>B</mi></mrow><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mn>1</mn></mrow><mo stretchy="true">‾</mo></mover><mo>=</mo><mover accent="true"><mover accent="true"><mrow><mi>A</mi><mo>⋅</mo><mi>B</mi></mrow><mo stretchy="true">‾</mo></mover><mo stretchy="true">‾</mo></mover><mo>+</mo><mn>0</mn><mo>=</mo><mi>A</mi><mo>⋅</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">F=\overline{\overline{A\cdot B}\cdot 1}=\overline{\overline{A\cdot B}}+0=A\cdot B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span></p></li><li><p>或：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mrow><mover accent="true"><mrow><mi>A</mi><mo>⋅</mo><mn>1</mn></mrow><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mover accent="true"><mrow><mi>B</mi><mo>⋅</mo><mn>1</mn></mrow><mo stretchy="true">‾</mo></mover></mrow><mo stretchy="true">‾</mo></mover><mo>=</mo><mover accent="true"><mover accent="true"><mrow><mi>A</mi><mo>⋅</mo><mn>1</mn></mrow><mo stretchy="true">‾</mo></mover><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mover accent="true"><mrow><mi>B</mi><mo>⋅</mo><mn>1</mn></mrow><mo stretchy="true">‾</mo></mover><mo stretchy="true">‾</mo></mover><mo>=</mo><mi>A</mi><mo>+</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">F=\overline{\overline{A\cdot 1}\cdot\overline{B\cdot 1}}=\overline{\overline{A\cdot 1}}+\overline{\overline{B\cdot 1}}=A+ B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span></p></li><li><p>非：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mrow><mi>A</mi><mo>⋅</mo><mn>1</mn></mrow><mo stretchy="true">‾</mo></mover><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mn>0</mn><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">F=\overline{A\cdot 1}=\overline{A} + 0=\overline{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span>（未使用的输入端全部挂高接 1）</p></li></ul><ol start="2"><li>或非逻辑</li></ol><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mrow><mi>A</mi><mo>+</mo><mi>B</mi><mo>+</mo><mi>C</mi><mo>+</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi></mrow><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">F=\overline{A+B+C+...}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">...</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span></span></span></span></p><p>或非逻辑可以检测全 0 序列</p><p>使用或非逻辑同样可以实现与、或、非三种基本运算</p><ul><li><p>与：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mrow><mover accent="true"><mrow><mi>A</mi><mo>+</mo><mn>0</mn></mrow><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mrow><mi>B</mi><mo>+</mo><mn>0</mn></mrow><mo stretchy="true">‾</mo></mover></mrow><mo stretchy="true">‾</mo></mover><mo>=</mo><mover accent="true"><mover accent="true"><mrow><mi>A</mi><mo>+</mo><mn>0</mn></mrow><mo stretchy="true">‾</mo></mover><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mover accent="true"><mover accent="true"><mrow><mi>B</mi><mo>+</mo><mn>0</mn></mrow><mo stretchy="true">‾</mo></mover><mo stretchy="true">‾</mo></mover><mo>=</mo><mi>A</mi><mo>+</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">F=\overline{\overline{A + 0} + \overline{B + 0}}=\overline{\overline{A + 0}}\cdot\overline{\overline{B+0}}=A + B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span></p></li><li><p>或：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mrow><mover accent="true"><mrow><mi>A</mi><mo>+</mo><mi>B</mi></mrow><mo stretchy="true">‾</mo></mover><mo>+</mo><mn>0</mn></mrow><mo stretchy="true">‾</mo></mover><mo>=</mo><mover accent="true"><mover accent="true"><mrow><mi>A</mi><mo>+</mo><mi>B</mi></mrow><mo stretchy="true">‾</mo></mover><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mn>1</mn><mo>=</mo><mi>A</mi><mo>+</mo><mi>B</mi></mrow><annotation encoding="application/x-tex">F=\overline{\overline{A + B}+ 0}=\overline{\overline{A+B}}\cdot 1=A+B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.0833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span></span></span><span style="top:-4.0033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span></p></li><li><p>非：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mrow><mi>A</mi><mo>+</mo><mn>0</mn></mrow><mo stretchy="true">‾</mo></mover><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mn>1</mn><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">F=\overline{A + 0}=\overline{A}\cdot 1=\overline{A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">0</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span>（未使用的输入端全部挂低接 0）</p></li></ul><ol><li>与或非逻辑</li></ol><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mrow><mi>A</mi><mi>B</mi><mo>+</mo><mi>C</mi><mi>D</mi><mo>+</mo><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi><mi mathvariant="normal">.</mi></mrow><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">F=\overline{AB+CD+...}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">...</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.0833em;"><span></span></span></span></span></span></span></span></span></p><p>使用与或非逻辑也可以实现与、或、非三种基本运算，但实际应用中成本较高，因此与或非逻辑更多用于实现与化简逻辑函数。</p><ol start="4"><li>异或逻辑</li></ol><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mi>A</mi><mo>⊕</mo><mi>B</mi><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mi>B</mi><mo>+</mo><mi>A</mi><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">F=A⊕B=\overline{A}B+A\overline{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord mathnormal">A</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span></p><p>相同为 0，不同为 1。异或可以检测二进制数据中 1 个数的奇偶性</p><p>快速计算方法：异或是 “不进位加法”。例如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn><mo>⊕</mo><mn>0</mn><mo>⊕</mo><mn>1</mn><mo>=</mo><mn>1</mn><mo>+</mo><mn>0</mn><mo>+</mo><mn>1</mn><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo><mn>0</mn><mo>=</mo><mn>0</mn><mtext>（舍去进位）</mtext></mrow><annotation encoding="application/x-tex">1⊕0⊕1=1+0+1=(1) 0=0\text {（舍去进位）}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord"> 1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">0</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mord">0</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord">0</span><span class="mord text"><span class="mord cjk_fallback">（舍去进位）</span></span></span></span></span></p><ol start="5"><li>同或逻辑（异或非）</li></ol><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mi>A</mi><mo>⊙</mo><mi>B</mi><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>A</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">F=A⊙B=\overline{A}\overline{B}+AB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊙</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span></p><p>相同为 1，不同为 0。同或可以按位检测二进制是否相等</p><p>同或和异或<strong>既互为相反，又互为对偶</strong>。由于同或可以由异或取反得到，因此实践中通常用异或实现同或。</p><h3 id="逻辑函数表达式"><a class="header-anchor" href="#逻辑函数表达式"></a>逻辑函数表达式</h3><h4 id="基本形式"><a class="header-anchor" href="#基本形式"></a>基本形式</h4><ul><li>与 - 或表达式（积之和）</li></ul><p>例如：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mi>B</mi><mo>+</mo><mi>A</mi><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mi>C</mi><mo>+</mo><mi>C</mi></mrow><annotation encoding="application/x-tex">F=\overline{A}B+A\overline{B}C+C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span></span></p><ul><li>或 - 与表达式（和之积）</li></ul><p>例如：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mo stretchy="false">(</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>B</mi><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>A</mi><mo>+</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>C</mi><mo stretchy="false">)</mo><mi>D</mi></mrow><annotation encoding="application/x-tex">F=(\overline{A}+B)(A+\overline{B}+C)D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span></span></span></span></p><p>混合表达式是 “两不像”，例如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><mo stretchy="false">(</mo><mi>A</mi><mi>B</mi><mo>+</mo><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mi>A</mi><mo>+</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mi>C</mi><mo stretchy="false">)</mo><mo>+</mo><mi>D</mi></mrow><annotation encoding="application/x-tex">F=(AB+\overline{C})(A+\overline{B}C)+D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span></span></span></span> 既不属于与 - 或表达式，也不属于或 - 与表达式</p><p>逻辑函数的基本形式是<strong>不唯一</strong>的。</p><h4 id="最小项和最大项"><a class="header-anchor" href="#最小项和最大项"></a>最小项和最大项</h4><ul><li>最小项</li></ul><p>包含所有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个变量的与项，共有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span> 种组合。每个变量以原变量或反变量形式<strong>出现且仅出现一次</strong>，在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span> 种变量组合中，每个最小项仅在一种组合下为 1，其余均为 0</p><p>相同变量构成的不同最小项的<strong>与和</strong>必定为 0；<strong>全部</strong>最小项的<strong>或和</strong>必定为 1。</p><ul><li>最大项</li></ul><p>包含所有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个变量的或项，也有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span> 种组合。每个变量以原变量或反变量形式<strong>出现且仅出现一次</strong>，在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span> 种变量组合中，每个最大项仅在一种组合下为 0，其余均为 1</p><p>相同变量构成的不同最大项的<strong>或和</strong>必定为 1。</p><p>相同变量构成的最大项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>M</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">M_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 和最小项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>m</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">m_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 互补，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>M</mi><mi>i</mi></msub><mo>=</mo><mover accent="true"><msub><mi>m</mi><mi>i</mi></msub><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">M_i=\overline{m_i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7806em;vertical-align:-0.15em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6306em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.5506em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span>。</p><p>对于相同变量，若用最小项列表表示为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∑</mo><mi>m</mi><mo stretchy="false">(</mo><msub><mi>S</mi><mi>m</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\sum m(S_m)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">m</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>，那么它的最大项列表 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>∏</mo><mi>M</mi><mo stretchy="false">(</mo><mo>⋯</mo><mtext> </mtext><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\prod M(\cdots)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mop op-symbol small-op" style="position:relative;top:0em;">∏</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mopen">(</span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mclose">)</span></span></span></span> 中的下标，恰好是全体下标中没出现在最小项列表里的那些，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mo>∑</mo><mrow><mi>i</mi><mo>∈</mo><msub><mi>S</mi><mi>m</mi></msub></mrow></msub><msub><mi>m</mi><mi>i</mi></msub><mo>=</mo><msub><mo>∏</mo><mrow><mi>j</mi><mo mathvariant="normal">∉</mo><msub><mi>S</mi><mi>m</mi></msub></mrow></msub><msub><mi>M</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">\sum_{i \in S_m} m_i = \prod_{j \notin S_m} M_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.1498em;vertical-align:-0.3998em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1786em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">∈</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1645em;"><span style="top:-2.357em;margin-left:-0.0576em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="katex-sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.3998em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.2247em;vertical-align:-0.4747em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∏</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2253em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0572em;">j</span><span class="mrel mtight"><span class="mord mtight"><span class="mrel mtight">∈</span></span><span class="mord katex-vbox mtight"><span class="katex-thinbox mtight"><span class="llap mtight"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="katex-inner"><span class="mord mtight"><span class="mord mtight">/</span><span class="mspace mtight" style="margin-right:0.0651em;"></span></span></span><span class="katex-fix"></span></span></span></span></span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1645em;"><span style="top:-2.357em;margin-left:-0.0576em;margin-right:0.0714em;"><span class="pstrut" style="height:2.5em;"></span><span class="katex-sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">m</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.143em;"><span></span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4747em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0572em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span></p><p>最小项和最大项的序号按照二进制转换成十进制，注意最小项中原变量为 1，而最大项中反变量为 1。例如，最小项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>B</mi><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover><mi>D</mi></mrow><annotation encoding="application/x-tex">AB\overline{C}D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span></span></span></span> 对应的二进制位是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1101</mn></mrow><annotation encoding="application/x-tex">1101</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1101</span></span></span></span>，对应 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>m</mi><mn>13</mn></msub></mrow><annotation encoding="application/x-tex">m_{13}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">13</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>；最大项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>+</mo><mi>B</mi><mo>+</mo><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>D</mi></mrow><annotation encoding="application/x-tex">A+B+\overline{C}+D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span></span></span></span> 对应的二进制位是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0010</mn></mrow><annotation encoding="application/x-tex">0010</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0010</span></span></span></span>，对应 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>M</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">M_{2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><p>如果两个最小/大项之间只有一项的原反性不同，则这两个最小/大项在逻辑上相邻。例如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">AB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mi>B</mi></mrow><annotation encoding="application/x-tex">\overline{A}B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span> 逻辑相邻，而 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mi>B</mi></mrow><annotation encoding="application/x-tex">AB</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{A}\overline{B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span> 在逻辑上不相邻。</p><h4 id="标准形式"><a class="header-anchor" href="#标准形式"></a>标准形式</h4><p>用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>m</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">m_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 或 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>M</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">M_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 替代变量。</p><ul><li>标准与 - 或（最小项）</li></ul><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>F</mi><mo stretchy="false">(</mo><mi>A</mi><mo separator="true">,</mo><mi>B</mi><mo separator="true">,</mo><mi>C</mi><mo stretchy="false">)</mo><mo>=</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mi>C</mi><mo>+</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mi>B</mi><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>A</mi><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>A</mi><mi>B</mi><mi>C</mi><mo>=</mo><msub><mi>m</mi><mn>1</mn></msub><mo>+</mo><msub><mi>m</mi><mn>2</mn></msub><mo>+</mo><msub><mi>m</mi><mn>4</mn></msub><mo>+</mo><msub><mi>m</mi><mn>7</mn></msub><mo>=</mo><mo>∑</mo><mrow><mi>m</mi><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mn>7</mn><mo stretchy="false">)</mo></mrow></mrow><annotation encoding="application/x-tex">F(A,B,C)=\overline{A}\cdot\overline{B}C+\overline{A}B\overline{C}+A\overline{B}\cdot\overline{C}+ABC=m_1+m_2+m_4+m_7=\sum{m(1,2,4,7)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord mathnormal">A</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">7</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.6em;vertical-align:-0.55em;"></span><span class="mop op-symbol large-op" style="position:relative;top:0em;">∑</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">7</span><span class="mclose">)</span></span></span></span></span></span></p><ul><li>标准或 - 与（最大项）</li></ul><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>F</mi><mo stretchy="false">(</mo><mi>A</mi><mo separator="true">,</mo><mi>B</mi><mo separator="true">,</mo><mi>C</mi><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><mi>A</mi><mo>+</mo><mi>B</mi><mo>+</mo><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>B</mi><mo>+</mo><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mi>B</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mi>C</mi><mo stretchy="true">‾</mo></mover><mo stretchy="false">)</mo><mo>=</mo><msub><mi>M</mi><mn>1</mn></msub><mo>+</mo><msub><mi>M</mi><mn>5</mn></msub><mo>+</mo><msub><mi>M</mi><mn>7</mn></msub><mo>=</mo><mo>∏</mo><mrow><mi>M</mi><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>5</mn><mo separator="true">,</mo><mn>7</mn><mo stretchy="false">)</mo></mrow></mrow><annotation encoding="application/x-tex">F(A,B,C)=(A+B+\overline{C})(\overline{A}+B+\overline{C})(\overline{A}+\overline{B}+\overline{C})=M_1+M_5+M_7=\prod{M(1,5,7)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mclose">)</span><span class="mopen">(</span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">5</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.109em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">7</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.6em;vertical-align:-0.55em;"></span><span class="mop op-symbol large-op" style="position:relative;top:0em;">∏</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">7</span><span class="mclose">)</span></span></span></span></span></span></p><h4 id="转化为标准形式"><a class="header-anchor" href="#转化为标准形式"></a>转化为标准形式</h4><ul><li>代数转换法</li></ul><p>第一步：转换成与 - 或表达式 / 或 - 与表达式<br>第二步：补项，将非最小/大项的项扩展成最小/大项形式。与 - 或表达式用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>+</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">A+\overline{A}=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 补项；或 - 与表达式用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>A</mi><mo>⋅</mo><mover accent="true"><mi>A</mi><mo stretchy="true">‾</mo></mover><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">A\cdot \overline{A}=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">A</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 补项</p><ul><li>真值表转换法</li></ul><p>列真值表，输出为 1 对应最小项，输出为 0 对应最大项</p><h4 id="表达式化简"><a class="header-anchor" href="#表达式化简"></a>表达式化简</h4><p>目标：项数最少，每一项中的<strong>变量也最少</strong>（和标准表达式不太一样，标准表达式每一项的变量都是全的）</p><ol><li>代数化简法</li></ol><p>化简与 - 或表达式常用定理：并项律、吸收律、消去律，参见<a href="https://watermelonabc.top/p/7d823f34/#%E5%9F%BA%E6%9C%AC%E5%AE%9A%E7%90%86">基本定理</a></p><p>化简或 - 与表达式：</p><p>Ⅰ 求 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi></mrow><annotation encoding="application/x-tex">F</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span></span></span></span> 的对偶式 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>F</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">F'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span>（加变乘，乘变加）<br>Ⅱ 化简 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>F</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">F'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span>（此时 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>F</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">F'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 又变成与 - 或那一套了）<br>Ⅲ 求化简后的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>F</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">F'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 的对偶式，即为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi></mrow><annotation encoding="application/x-tex">F</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span></span></span></span> 的最简或 - 与表达式</p><ol><li>卡诺图化简法</li></ol><p>卡诺图是一种图形化的逻辑函数化简方法，通过<strong>格雷码</strong>排列（00 -&gt; 01 -&gt; 11 -&gt; 10）的方式将<strong>逻辑相邻</strong>（上下、左右、首尾相接）的<strong>最小项</strong>放在物理相邻的位置。由于当变量大于 5 时难以构造，故一般最多考到 4 变量。</p><p>如何填写卡诺图？其实应当以格子对应的最小项序号为准。如果存在对应的最小项，则在对应格子填上 1。</p><p>设计过程中还会遇到无关项 d，这些无关项可 1 可 0。</p><p>然后画卡诺圈。画的时候需要遵循以下规则：</p><ul><li>所有的 1 都需要被至少一个卡诺圈圈起</li><li>圈的个数尽量少，面积尽量大，但面积必须是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>k</mi></msup></mrow><annotation encoding="application/x-tex">2^k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8491em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8491em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0315em;">k</span></span></span></span></span></span></span></span></span></span></span>（1、2、4、8、16）</li><li>卡诺圈可以 “头尾相接”，即最后一列/行的 1 可以和第一列/行的 1 圈在一起</li></ul><div class="tag-plugin image"><div class="image-bg" style="aspect-ratio:627/600;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251215165405655.png" alt="卡诺图画法示例，注意我们写的时候 AB 和 CD 要换过来" data-fancybox="true" onerror="this.src='/asset/image/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(/asset/image/Fructose-Content-running-medium.webp);"></div></div><div class="image-meta"><span class="image-caption center">卡诺图画法示例，注意我们写的时候 AB 和 CD 要换过来</span></div></div><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">示例不够？</div></div><div class="callout-content"><p><a href="https://karnaughmapsolver.com/zh">卡诺图 (K-Map) 化简工具</a> 提供了一个在线化简工具。你不仅可以得到化简后的表达式，还可以关联其对应的卡诺圈画法、真值表、最小 / 大项 <s>以及非国标的门电路图</s></p></div></div><p>从卡诺圈得到最小项：在一个卡诺圈内，如果一个变量的值始终为 1，则以原变量形式出现在最小项中；如果始终为 0，则以反变量形式出现；如果既有 1 也有 0，则不出现。</p><h2 id="集成门电路"><a class="header-anchor" href="#集成门电路"></a>集成门电路</h2><h3 id="电平"><a class="header-anchor" href="#电平"></a>电平</h3><p>逻辑值 0 和 1 在数字电路中体现就是电平。电平分为高电平和低电平。一般来讲，高电平对应 “1”，低电平对应 “0”。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">正逻辑和负逻辑</div></div><div class="callout-content"><p>正逻辑：高电平对应 “1”，低电平对应 “0”，现代的大部分接口使用正逻辑。<br>负逻辑：高电平对应 “0”，低电平对应 “1”，仅用于早期或特殊接口。</p></div></div><p>高低电平之间的差值越大，逻辑值 “1” 和 “0” 的在物理层面的区别越明显，电路工作越可靠。</p><p>电路不会一直稳定。为了应对电压波动，实际的高低电平判定有范围，如理想的低电平是 0V，实际可能 0.5V 也可以判定为低电平。</p><h3 id="常见逻辑门符号"><a class="header-anchor" href="#常见逻辑门符号"></a>常见逻辑门符号</h3><p>符号标准使用国标 GB/T 4728.12-1996，参见 <a href="https://www.cnblogs.com/icmaxwell/p/17374702.html">基本逻辑门电路图形符号</a> 的 “国标图形符号” 部分</p><ul><li><strong>与</strong>门标 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>&amp;</mo></mrow><annotation encoding="application/x-tex">\And</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6944em;"></span><span class="mord">&amp;</span></span></span></span></li><li><strong>或</strong>门标 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⩾</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\geqslant 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7733em;vertical-align:-0.1367em;"></span><span class="mrel amsrm">⩾</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></li><li><strong>非</strong>门标 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>，门后加圆圈表示 “非”</li><li><strong>与非</strong>门标 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>&amp;</mo></mrow><annotation encoding="application/x-tex">\And</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6944em;"></span><span class="mord">&amp;</span></span></span></span>，门后加圆圈</li><li><strong>或非</strong>门标 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>⩾</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\geqslant 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7733em;vertical-align:-0.1367em;"></span><span class="mrel amsrm">⩾</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>，门后加圆圈</li><li><strong>异或</strong>门标 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.3669em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></li></ul><h3 id="触发器"><a class="header-anchor" href="#触发器"></a>触发器</h3><p>在数字电路中，输入信号作用前的状态称为现态，记作 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span>；输入信号作用后的状态，称为次态，记作 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">Q^{n+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></p><p>触发器是一种具有记忆功能的电子器件，每次可以存储 1 位二进制信息，其输出除了和输入相关，有时还和现态相关。</p><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个触发器存储 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 位二进制信息，可以表示 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span> 状态</p></div></div><p>触发器可分为 RS 触发器、D 触发器、JK 触发器、T 触发器等类型。当输入的时钟脉冲 CP = 1 时：</p><table><thead><tr><th style="text-align:center">触发器</th><th style="text-align:center">次态方程</th><th style="text-align:center">约束方程</th><th style="text-align:center">功能</th><th style="text-align:center">备注</th></tr></thead><tbody><tr><td style="text-align:center">RS 触发器</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><mi>S</mi><mo>+</mo><mover accent="true"><mi>R</mi><mo stretchy="true">‾</mo></mover><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q^{n+1}=S + \overline{R}Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0077em;">R</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal">Q</span></span></span></span> / <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><mover accent="true"><mi>S</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mi>R</mi><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q^{n+1}=\overline{S} + RQ</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mord mathnormal">Q</span></span></span></span>（与非门构成的基本 RS<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>）</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi><mo>⋅</mo><mi>S</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">R\cdot S=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> / <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi><mo>+</mo><mi>S</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">R+ S=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.0077em;">R</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>（与非门构成的基本 RS）</td><td style="text-align:center">保留、置 0、置 1</td><td style="text-align:center">Reset（置 0），Set（置 1），约束方程表示 R、S 需要满足的条件</td></tr><tr><td style="text-align:center">D 触发器</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><mi>D</mi></mrow><annotation encoding="application/x-tex">Q^{n+1}=D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span></span></span></span></td><td style="text-align:center">-</td><td style="text-align:center">置 0、置 1</td><td style="text-align:center">状态变化仅与输入信号相关；锁存器</td></tr><tr><td style="text-align:center">JK 触发器</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><mi>J</mi><mover accent="true"><mi>Q</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mi>K</mi><mo stretchy="true">‾</mo></mover><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q^{n+1}=J\overline{Q}+\overline{K}Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0962em;">J</span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">Q</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">K</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal">Q</span></span></span></span></td><td style="text-align:center">-</td><td style="text-align:center">保留、置 0、置 1、翻转</td><td style="text-align:center"></td></tr><tr><td style="text-align:center">T 触发器</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><mi>T</mi><mover accent="true"><mi>Q</mi><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><mi>T</mi><mo stretchy="true">‾</mo></mover><mi>Q</mi><mo>=</mo><mi>T</mi><mo>⊕</mo><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q^{n+1}=T\overline{Q}+\overline{T}Q=T⊕Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">Q</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">T</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mord mathnormal">Q</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span></td><td style="text-align:center">-</td><td style="text-align:center">保留、翻转</td><td style="text-align:center">JK 触发器的特殊情况；计数触发器</td></tr><tr><td style="text-align:center">T' 触发器</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><mover accent="true"><mi>Q</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">Q^{n+1}=\overline{Q}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal">Q</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span></span></span></span></td><td style="text-align:center">-</td><td style="text-align:center">翻转</td><td style="text-align:center">T 触发器的特殊情况，可以通过 JK 触发器或 D 触发器实现</td></tr></tbody></table><p>当输入的时钟脉冲 CP = 0 时，所有触发器的状态保持不变，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mo>=</mo><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q^{n+1}=Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span>。这是<strong>电平触发</strong>。电平触发的时钟信号是<strong>使能信号</strong>，在它处于某个特定电平（高电平或低电平）的整个期间，输出都会实时跟随输入的变化。当使能信号无效时，输出才 “锁存” 住最后一个值并保持不变。所有简单结构触发器均采用这一触发方式。</p><p>简单结构触发器的抗干扰能力较弱，所以实际使用的触发器结构要复杂一些，分为<strong>主从触发</strong>和<strong>边沿触发</strong>。</p><p>主从触发器有两个触发器，分为主触发器和从触发器。假设主触发器高电平有效，从触发器低电平有效，当 CP = 1 时，仅有主触发器工作（主模式），实时响应输入信号；下降沿以及低电平时，主触发器被锁定，从触发器工作（主从模式），输出主触发器锁存的值。主从 RS 触发器和主从 JK 触发器属于这一类触发</p><p>边沿触发分为上升沿（正边沿）触发和下降沿（负边沿）触发。上升沿触发只有在时钟信号从低电平（逻辑 0）跳变到高电平（逻辑 1）的那个瞬间，电路才会采样输入并更新输出；下降沿触发只有在时钟信号从高电平（逻辑 1）跳变到低电平（逻辑 0）的那个瞬间，电路才会采样输入并更新输出。在时钟周期内的其他任何时间，输入信号都不会影响输出。维持 - 阻塞 D 触发器属于上升沿触发。</p><p>触发器需要注意两个问题：一个是简单结构触发器的 “空翻” 现象，另一个是主从 JK 触发器的 “一次翻转” 现象。</p><p>“空翻” 现象指的是在同一个脉冲作用周期内触发器状态发生两次及以上的变化的现象，原因是在使能信号生效期间，输出都会实时跟随输入的变化。“一次翻转” 指的是在同一个脉冲作用周期内，主触发器的状态只能根据输入信号的变化改变一次，翻转一次后主触发器锁定，状态不再受输入影响。</p><h3 id="几个触发器描述图表"><a class="header-anchor" href="#几个触发器描述图表"></a>几个触发器描述图表</h3><ol><li>状态表</li></ol><p>现态和对应输入下次态的输出</p><table><thead><tr><th style="text-align:center"></th><th style="text-align:center" colspan="4">次态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">Q^{n+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></th></tr><tr><th style="text-align:center">现态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span></th><th style="text-align:center">RS = 00</th><th style="text-align:center">RS=01</th><th style="text-align:center">RS=11</th><th style="text-align:center">RS=10</th></tr></thead><tbody><tr><td style="text-align:center">0</td><td style="text-align:center">d</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">1</td></tr><tr><td style="text-align:center">1</td><td style="text-align:center">d</td><td style="text-align:center">0</td><td style="text-align:center">1</td><td style="text-align:center">1</td></tr></tbody></table><ol start="2"><li>状态图</li></ol><p>反映状态转移关系的有向图</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217203018774.png" alt="RS 触发器的状态图" loading="lazy"></p><ol start="3"><li>激励表</li></ol><p>状态转移时对输入的要求</p><table><thead><tr><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span></th><th style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>Q</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">Q^{n+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></th><th style="text-align:center">R</th><th style="text-align:center">S</th></tr></thead><tbody><tr><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">d</td><td style="text-align:center">1</td></tr><tr><td style="text-align:center">0</td><td style="text-align:center">1</td><td style="text-align:center">1</td><td style="text-align:center">0</td></tr><tr><td style="text-align:center">1</td><td style="text-align:center">0</td><td style="text-align:center">0</td><td style="text-align:center">1</td></tr><tr><td style="text-align:center">1</td><td style="text-align:center">1</td><td style="text-align:center">1</td><td style="text-align:center">d</td></tr></tbody></table><ol start="4"><li>时间图（工作波形图）</li></ol><p>状态转移在一定时间内的连续变化。按照触发方式和功能表确定判决时刻线，在时刻线上判断输出变化，其它时刻保持不变</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217203138816.png" alt="RS 触发器的时间图" loading="lazy"></p><h3 id="有限状态机"><a class="header-anchor" href="#有限状态机"></a>有限状态机</h3><p>上面的状态图已经可以表示一个有限状态机了。有限状态机 (FSM) 是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型。</p><p>一个状态机一般由这几个部分组成：状态、转移、动作、转移条件。</p><ul><li>将一个系统离散化，可以得到很多种<strong>状态</strong></li><li>一个状态接收一个输入执行了某些动作到达了另外一个状态的过程就是一个<strong>转移</strong></li><li>在某一状态下，只有达到了<strong>转移条件</strong>，才会按照状态机的转移流程转移到下一状态，并执行相应的动作。</li><li>在状态机的运转过程中会有很多种<strong>动作</strong>，例如进入动作在进入状态时进行</li></ul><blockquote><p>如果你还知道 C 语言的话，<code>switch</code> - <code>case</code> 语句就可以构成一个简单的状态机。</p></blockquote><h2 id="组合逻辑电路"><a class="header-anchor" href="#组合逻辑电路"></a>组合逻辑电路</h2><p>输出仅取决于该时刻的输入，而与过去的输入值无关，没有反馈回路。</p><h3 id="分析组合电路的步骤"><a class="header-anchor" href="#分析组合电路的步骤"></a>分析组合电路的步骤</h3><ol><li>确定电路的输入和输出</li></ol><ul><li>识别电路的输入变量（通常用 A、B、C 等表示）</li><li>确定电路的输出变量（通常用 Y、F 等表示）</li></ul><ol start="2"><li>从输入到输出逐级分析</li></ol><ul><li>从输入端开始，逐级向输出端分析</li><li>写出每个门电路的输出逻辑表达式</li><li>将各级表达式代入，得到最终的逻辑函数</li></ul><ol start="3"><li>化简逻辑函数</li></ol><ul><li>使用布尔代数定律化简表达式</li><li>或使用卡诺图进行化简</li></ul><ol start="4"><li>列出真值表</li></ol><ul><li>根据化简后的逻辑函数，列出所有输入组合对应的输出值</li></ul><ol start="5"><li>描述电路功能</li></ol><ul><li>根据真值表分析电路实现的逻辑功能（序列检测、加减法、码制转换）</li><li>确定电路的应用场合</li></ul><h3 id="设计组合电路的步骤"><a class="header-anchor" href="#设计组合电路的步骤"></a>设计组合电路的步骤</h3><ol><li>建立给定问题的逻辑描述</li></ol><ul><li>设定输入、输出变量组成。一个二进制位对应一个独立变量。输出变量根据逻辑决定数量，两个没有直接逻辑关系的行为分属两个变量。</li><li>常用分析方法有真值表法（通用方法但是比较累）和分析方法（比较简洁但是难）</li></ul><ol start="2"><li>求出逻辑函数的最简表达式</li></ol><p>参考 <a href="https://watermelonabc.top/p/7d823f34/#%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%8C%96%E7%AE%80">表达式化简</a></p><ol start="3"><li>选择逻辑门类型，并进行逻辑函数变换</li><li>画出逻辑电路图</li></ol><p>设计路线不是唯一的。我们不要求最简洁的做法，只需要逻辑功能正确即可</p><h3 id="设计过程中的几个问题"><a class="header-anchor" href="#设计过程中的几个问题"></a>设计过程中的几个问题</h3><h4 id="无关项"><a class="header-anchor" href="#无关项"></a>无关项</h4><p>如果输入变量的某些取值组合不会出现或者对这些组合的输出不关心，则称这些输入项为无关项，用 X 或 d 表示</p><p>在卡诺图化简中，这些无关项的取值可 1 可 0，因此可以灵活选择以符合 “卡诺圈面积尽量大” 的规则</p><h4 id="多输出函数"><a class="header-anchor" href="#多输出函数"></a>多输出函数</h4><p>能掌握掌握，不能掌握可以不用，这是锦上添花的做法</p><h4 id="不提供反变量"><a class="header-anchor" href="#不提供反变量"></a>不提供反变量</h4><p>最直接的做法就是接一个非门，但设计结果往往不经济，因此不提供反变量也意味着使用最少的非门（或不使用）。具体怎么实现看题目有没有限制逻辑门使用。</p><p>没有一种系统而有效的方法以设计出不提供反变量的最简电路，因此灵活处理即可</p><h2 id="中规模组合逻辑电路"><a class="header-anchor" href="#中规模组合逻辑电路"></a>中规模组合逻辑电路</h2><p>中规模组合逻辑电路主要有以下种类芯片：加法器、译码器、数据选择器</p><h3 id="加法器"><a class="header-anchor" href="#加法器"></a>加法器</h3><p>加法器分为半加器和全加器。半加器不考虑来自低位的进位，而全加器需要考虑来自低位的进位。</p><h4 id="半加器"><a class="header-anchor" href="#半加器"></a>半加器</h4><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217094447136.png" alt="半加器" loading="lazy"></p><p>半加器的输入是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">A_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>B</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">B_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，输出是本位和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">S_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 与本位进位 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">C_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>S</mi><mi>i</mi></msub><mo>=</mo><msub><mi>A</mi><mi>i</mi></msub><mo>⊕</mo><msub><mi>B</mi><mi>i</mi></msub><mo separator="true">,</mo><mtext>&nbsp;</mtext><msub><mi>C</mi><mi>i</mi></msub><mo>=</mo><msub><mi>A</mi><mi>i</mi></msub><msub><mi>B</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">S_i=A_i \oplus B_i,\ C_i=A_iB_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⊕</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace">&nbsp;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>由于单个半加器不接受低位进位，因此只能对 1 位二进制数执行相加运算，也可以作为级联构成的加法器的第一级（因为此时没低位）</p><h4 id="全加器"><a class="header-anchor" href="#全加器"></a>全加器</h4><p>半加器的输入是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">A_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>B</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">B_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 和低位进位 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">C_{i-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>，输出是本位和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">S_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 与本位进位 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">C_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p><p>由于单个全加器接受低位进位，因此可以级联构成多位二进制数的加法器。</p><p>有两种方法得到全加器：</p><ul><li>通过完整的组合逻辑电路设计步骤，从真值表、卡诺图、表达式得到</li><li>通过两个半加器的叠加</li></ul><div class="tag-plugin image"><div class="image-bg" style="padding:8px;aspect-ratio:798/1089;width:300px;"><img class="lazy" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAABGdBTUEAALGPC/xhBQAAADhlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAAqACAAQAAAABAAAAAaADAAQAAAABAAAAAQAAAADa6r/EAAAAC0lEQVQIHWNgAAIAAAUAAY27m/MAAAAASUVORK5CYII=" data-src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217094622744.png" alt="全加器的构成方法" data-fancybox="true" onerror="this.src='/asset/image/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(/asset/image/Fructose-Content-running-medium.webp);"></div></div><div class="image-meta"><span class="image-caption center">全加器的构成方法</span></div></div><p>按进位方式分类，全加器可分为串行进位二进制加法器和超前进位二进制并行加法器</p><ul><li>串行进位二进制加法器</li></ul><p>由全加器级联构成，高位的进位输入依赖于低位的进位输出</p><ul><li>超前进位二进制并行加法器</li></ul><p>此内容较为困难，故仅介绍采用此方式的芯片</p><h4 id="74283"><a class="header-anchor" href="#74283"></a>74283</h4><p>74283 属于超前进位二进制并行加法器，有 4 个被加数输入端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">A_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>、4 个加数输入端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>B</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">B_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>、1 个低位进位输入端、4 个本位和输出端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>F</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">F_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>、1 个本位进位输出端</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217094841898.png" alt="74283 芯片符号" loading="lazy"></p><ul><li><p>码制转换（8421 码和余 3 码）</p><p>将 8421 码转换成余 3 码，只需要固定加数输入为 0011（3 的补码）；将余 3 码转换成 8421 码，只需要固定加数为 1101（-3 的补码），或者固定加数为 1100（-3 的反码），缺少的 “1” 由低位输出补齐；若要实现二者的互换，则引入控制信号 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span></span></span></span> 接入低位进位端和固定加数端，当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">M=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时实现将 8421 码转换成余 3 码，当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">M=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 时实现将余 3 码转换成 8421 码。</p></li><li><p>余 3 码的加法</p><p>由于余 3 码有修正机制（有进位时加 3，没进位时减 3），因此需要两片 74283，其中一片用于修正。</p></li><li><p>乘法</p><p>依照小学学过的竖式乘法，计算各位输出。（分析法）得到的输出应和此式相似：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Z</mi><mn>1</mn></msub><mo>=</mo><msub><mi>a</mi><mn>1</mn></msub><msub><mi>b</mi><mn>1</mn></msub><mo>+</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">Z_1=a_1b_1+0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">Z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span>，那么 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mn>1</mn></msub><msub><mi>b</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">a_1b_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 接入 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">A_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>/<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>B</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">B_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>0</mn></mrow><annotation encoding="application/x-tex">0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 接入 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>B</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">B_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>/<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">A_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></p></li></ul><h3 id="译码器"><a class="header-anchor" href="#译码器"></a>译码器</h3><p>译码即将二进制代码的原意 “翻译” 出来，还原成原特定含义的信息。输入是一组二进制代码，输出是一组对应的高低电平信号，<strong>只有一个输出端呈现有效信号</strong>。</p><p>变量译码器是将 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 位二进制输入变量译为 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span> 个不同输出信号的电路，每个输出对应一种输入代码，即一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 变量最小项。由于输出的是最小项，因此在化简逻辑函数表达式时需要将表达式写作最小项表示</p><p>课程所用的译码器输出均为低电平有效，因此化简后，需要再次变换让最小项带上 “非”，例如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>m</mi><mn>1</mn></msub><mo>+</mo><msub><mi>m</mi><mn>2</mn></msub><mo>+</mo><msub><mi>m</mi><mn>4</mn></msub><mo>+</mo><msub><mi>m</mi><mn>7</mn></msub></mrow><annotation encoding="application/x-tex">m_1+m_2+m_4+m_7</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">7</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 应该转换成 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mrow><mover accent="true"><msub><mi>m</mi><mn>1</mn></msub><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mover accent="true"><msub><mi>m</mi><mn>2</mn></msub><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mover accent="true"><msub><mi>m</mi><mn>4</mn></msub><mo stretchy="true">‾</mo></mover><mo>⋅</mo><mover accent="true"><msub><mi>m</mi><mn>7</mn></msub><mo stretchy="true">‾</mo></mover></mrow><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{\overline{m_1}\cdot\overline{m_2}\cdot\overline{m_4}\cdot\overline{m_7}}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9806em;vertical-align:-0.15em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8306em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6306em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.5506em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6306em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.5506em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6306em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.5506em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6306em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">7</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.5506em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span><span style="top:-3.7506em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></p><p>代表芯片是 74138（3-8 线译码器）、74139（双 2-4 线译码器）</p><h4 id="74138"><a class="header-anchor" href="#74138"></a>74138</h4><p>74138 是 3-8 线译码器，具有三个输入、八个输出以及三个使能端。当使能端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mn>1</mn></msub><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">S_1=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><msub><mi>S</mi><mn>2</mn></msub><mo stretchy="true">‾</mo></mover><mo>+</mo><mover accent="true"><msub><mi>S</mi><mn>3</mn></msub><mo stretchy="true">‾</mo></mover><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">\overline{S_2}+\overline{S_3}=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时，译码器才正常工作</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217095057808.png" alt="74138" loading="lazy"></p><h4 id="74139"><a class="header-anchor" href="#74139"></a>74139</h4><p>2-4 线译码器具有两个输入、四个输出以及一个使能端。当使能端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>E</mi><mo stretchy="true">‾</mo></mover><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">\overline{E}=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">E</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时，译码器才正常工作。</p><p>74139 是双 2-4 线译码器，就是两个 2-4 线译码器并排黏合组成的</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217094951081.png" alt="74139" loading="lazy"></p><h4 id="译码器的扩展"><a class="header-anchor" href="#译码器的扩展"></a>译码器的扩展</h4><p>在解决 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 输入问题时，除了对应使用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 输入的译码器，还可以使用多个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">n-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 输入的译码器。由于一个译码器只能覆盖目标输出的一部分，因此需要片选译码器以分段输出需要的最小项。</p><p>两个 2-4 译码器可以构成一个 3-8 译码器，两个 3-8 译码器可以构成一个 4-16 译码器。设计时可以利用译码器的使能端，将最高位分别接入两片译码器的不同使能端，使得同一个最高位内，仅有一片输出译码器正常工作</p><p>如果用 2-4 译码器构成 4-16 译码器呢？从输出来看，我们至少需要 4 个 2-4 译码器作为输出端（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn><mo>×</mo><mn>4</mn><mo>=</mo><mn>16</mn></mrow><annotation encoding="application/x-tex">4×4=16</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">4</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">16</span></span></span></span>），但 2-4 译码器满打满算也就只有 2 + 1 = 3 个输入端，连 4 位输入都无法满足。因此，我们还需要一个 2-4 译码器 “压缩” 一部分输入，总共五个 2-4 译码器。高二位和一个使能信号接压缩输入的那个译码器，其输出和低二位分别作为四个输出译码器的输入。</p><h4 id="函数发生"><a class="header-anchor" href="#函数发生"></a>函数发生</h4><p>译码器输出最小项，而逻辑函数就可以用最小项之和表示。因此，译码器可以生成我们需要的逻辑函数</p><p>例如，通过真值表得知，全加器的输出函数可以这么表示：</p><p class="katex-block"><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>S</mi><mi>i</mi></msub><mo stretchy="false">(</mo><msub><mi>A</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>B</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>C</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>=</mo><mo>∑</mo><mrow><mi>m</mi><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mn>7</mn><mo stretchy="false">)</mo></mrow><mo separator="true">,</mo><mtext>&nbsp;</mtext><msub><mi>C</mi><mi>i</mi></msub><mo>=</mo><mo stretchy="false">(</mo><msub><mi>A</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>B</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>C</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>=</mo><mo>∑</mo><mrow><mi>m</mi><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>5</mn><mo separator="true">,</mo><mn>6</mn><mo separator="true">,</mo><mn>7</mn><mo stretchy="false">)</mo></mrow></mrow><annotation encoding="application/x-tex">S_i(A_i,B_i,C_{i-1})=\sum{m(1,2,4,7)},\ C_i=(A_i,B_i,C_{i-1})=\sum{m(3,5,6,7)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.6em;vertical-align:-0.55em;"></span><span class="mop op-symbol large-op" style="position:relative;top:0em;">∑</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">7</span><span class="mclose">)</span></span><span class="mpunct">,</span><span class="mspace">&nbsp;</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">A</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0502em;">B</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0502em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.6em;vertical-align:-0.55em;"></span><span class="mop op-symbol large-op" style="position:relative;top:0em;">∑</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">6</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">7</span><span class="mclose">)</span></span></span></span></span></span></p><p>转换得到译码器工作模式</p><h3 id="数据选择器"><a class="header-anchor" href="#数据选择器"></a>数据选择器</h3><p>通过选择变量选择需要输出哪一路的数据，当选择变量符合对应最小项下标，则将选择变量与上数据输出。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个选择变量可以控制 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span> 个数据输出。</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 选 1 数据选择器的输出函数表达通式：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>F</mi><mo>=</mo><msubsup><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msubsup><mrow><msub><mi>m</mi><mi>i</mi></msub><msub><mi>D</mi><mi>i</mi></msub></mrow></mrow><annotation encoding="application/x-tex">F=\sum_{i=0}^{n-1}{m_iD_i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">F</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.2537em;vertical-align:-0.2997em;"></span><span class="mop"><span class="mop op-symbol small-op" style="position:relative;top:0em;">∑</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.954em;"><span style="top:-2.4003em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mrel mtight">=</span><span class="mord mtight">0</span></span></span></span><span style="top:-3.2029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2997em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span>，其中 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>m</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">m_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">m</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 表示<strong>选择变量</strong>的最小项</p><p>课程主要使用 74153（四选一）和 74151（八选一）</p><h4 id="74153"><a class="header-anchor" href="#74153"></a>74153</h4><p>4 个数据输入端，2 个选择变量端，1 个输出端，1 个使能端。当使能端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>E</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{E}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">E</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span> 为 0 时，数据选择器正常工作</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217095323946.png" alt="74153" loading="lazy"></p><p>实际应用时会将两个四选一 MUX 合并成一个 74153</p><h4 id="74151"><a class="header-anchor" href="#74151"></a>74151</h4><p>8 个数据输入端，3 个选择变量端，1 个输出端，1 个使能端。当使能端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>E</mi><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{E}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8833em;"></span><span class="mord katex-overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">E</span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span></span></span></span></span></span></span> 为 0 时，数据选择器正常工作</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217095403515.png" alt="74151" loading="lazy"></p><h4 id="数据选择器的扩展"><a class="header-anchor" href="#数据选择器的扩展"></a>数据选择器的扩展</h4><p>用 2 个 4 选 1 构成一个 8 选 1，用 2 个 8 选 1 构成一个 16 选 1</p><h4 id="函数发生-2"><a class="header-anchor" href="#函数发生-2"></a>函数发生</h4><p>由上面的通式可知，数据选择器可以输出选择变量的最小项。给不同的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>D</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">D_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">D</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 赋予不同数据，就可以选取不同的完整最小项，从而实现函数发生。</p><p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个控制变量可以实现 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">n+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 变量的函数发生（有一个变量可以接到数据端）</p><h2 id="时序逻辑电路"><a class="header-anchor" href="#时序逻辑电路"></a>时序逻辑电路</h2><p>按输入脉冲同步与否，将时序逻辑电路分为<strong>同步时序逻辑电路</strong>和<strong>异步时序逻辑电路</strong>。同步时序逻辑电路有一个统一的时钟脉冲控制每个触发器的状态，即每个触发器的 CP 端连接同一个脉冲；异步时序逻辑电路则没有，存在有的触发器的 CP 端连接到另外的脉冲上</p><p>根据输出信号的特点，将同步时序逻辑电路分为 <strong>Mealy</strong> 型和 <strong>Moore</strong> 型电路。Mealy 型电路的输出不仅和触发器现态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span> 有关，还和当前的输入 X 有关；Moore 型电路的输出仅和触发器现态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Q</mi></mrow><annotation encoding="application/x-tex">Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">Q</span></span></span></span> 有关</p><blockquote><p>换句话说，就是看输入连接到哪些元件上了。如果输入存在直接连到最后输出的逻辑门上的分支，那么就是 Mealy 型电路。</p></blockquote><p>时序电路的电路性质就是按这两点来描述的。</p><h3 id="描述方法"><a class="header-anchor" href="#描述方法"></a>描述方法</h3><ol><li>逻辑函数表达式</li></ol><p>分为输出函数表达式、激励函数表达式（驱动方程）和次态函数表达式。</p><p>输出函数表达式就是电路输出与输入和现态之间的关系表达式；激励函数表达式是<strong>存储电路的输入</strong>（电路内部）与输入和现态之间的关系表达式，具体来讲就是<strong>触发器的输入</strong>与输入和现态之间的关系表达式，一般从高序号到低序号写；次态函数表达式是次态与<strong>激励函数</strong>和现态之间关系表达式。</p><ol start="2"><li>状态表</li></ol><p>反映输出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">Z</span></span></span></span>、次态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>y</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">y^{n+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em;">y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span> 和输入 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>、现态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">y</span></span></span></span> 之间的关系</p><p>Mealy 型电路的状态表：</p><table><thead><tr><th style="text-align:center"></th><th style="text-align:center" colspan="2">次态 / 输出</th></tr><tr><th style="text-align:center">现态</th><th style="text-align:center">输入 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span></th></tr></thead><tbody><tr><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">y</span></span></span></span></td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>y</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup><mi mathvariant="normal">/</mi><mi>Z</mi></mrow><annotation encoding="application/x-tex">y^{n+1}/Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em;">y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mord">/</span><span class="mord mathnormal" style="margin-right:0.0715em;">Z</span></span></span></span></td></tr></tbody></table><p>输出跟着输入走</p><p>Moore 型电路的状态表：</p><table><thead><tr><th style="text-align:center"></th><th style="text-align:center">次态</th></tr><tr><th style="text-align:center">现态</th><th style="text-align:center">输入 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span></th><th style="text-align:center">输出</th></tr></thead><tbody><tr><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">y</span></span></span></span></td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>y</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">y^{n+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em;">y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>Z</mi></mrow><annotation encoding="application/x-tex">Z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">Z</span></span></span></span></td></tr></tbody></table><p>输出和输入无关</p><p>状态表简化得到转换表</p><table><thead><tr><th style="text-align:center">CP</th><th style="text-align:center">现态</th><th style="text-align:center">输出</th></tr></thead><tbody><tr><td style="text-align:center">0</td><td style="text-align:center"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>Q</mi><mn>2</mn><mi>n</mi></msubsup><msubsup><mi>Q</mi><mn>1</mn><mi>n</mi></msubsup><msubsup><mi>Q</mi><mn>0</mn><mi>n</mi></msubsup></mrow><annotation encoding="application/x-tex">Q_{2}^{n}Q_{1}^{n}Q_{0}^{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9314em;vertical-align:-0.2481em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-2.4519em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2481em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-2.4519em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2481em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-2.4519em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">0</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2481em;"><span></span></span></span></span></span></span></span></span></span></td><td style="text-align:center">Y</td></tr></tbody></table><ol start="3"><li>状态图</li></ol><p>反映状态转移规律，由状态表得出</p><p>Mealy 型电路的状态转换图：</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217203831925.png" alt="模 4 可逆计数器 A" loading="lazy"></p><p>Moore 型电路的状态转换图：</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217203648040.png" alt="模 4 可逆计数器 B" loading="lazy"></p><p>简化得到转换图，只表示状态转换顺序</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217204054905.png" alt="模 8 计数器" loading="lazy"></p><ol start="4"><li>时间图（工作波形图）</li></ol><p>状态转移在一定时间内的连续变化。按照触发方式和功能表确定判决时刻线，在时刻线上判断输出变化，其它时刻保持不变</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217204139632.png" alt="模 4 可逆计数器 B 的时间图" loading="lazy"></p><h3 id="分析方法"><a class="header-anchor" href="#分析方法"></a>分析方法</h3><h4 id="表格分析法"><a class="header-anchor" href="#表格分析法"></a>表格分析法</h4><ol><li>确定电路类型，是 Mealy 型还是 Moore 型</li><li>写出输出函数表达式和激励函数表达式</li><li>列出次态真值表</li></ol><table><thead><tr><th>输入</th><th>现态</th><th>激励函数（控制变量）</th><th>次态</th></tr></thead><tbody><tr><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">y</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>D</mi></mrow><annotation encoding="application/x-tex">D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0278em;">D</span></span></span></span>/<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>J</mi></mrow><annotation encoding="application/x-tex">J</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0962em;">J</span></span></span></span>/<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>K</mi></mrow><annotation encoding="application/x-tex">K</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">K</span></span></span></span></td><td><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>y</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">y^{n+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0359em;">y</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></td></tr></tbody></table><ol start="4"><li>由次态真值表和输出函数表达式，作出状态图和状态表</li><li>画出时序图和时间图，文字说明电路逻辑功能</li></ol><h4 id="代数分析法"><a class="header-anchor" href="#代数分析法"></a>代数分析法</h4><ol><li>确定电路类型</li><li>写出输出函数表达式和激励函数表达式</li><li>将激励函数表达式代入触发器的次态方程，得到电路的次态方程</li><li>由次态方程和输出函数表达式，作出状态图和状态表</li><li>画出时序图和时间图，文字说明电路逻辑功能</li></ol><h3 id="设计方法"><a class="header-anchor" href="#设计方法"></a>设计方法</h3><p>小规模同步时序逻辑电路主要设计计数器和序列检测器。触发器一般使用 JK 触发器</p><h4 id="计数器"><a class="header-anchor" href="#计数器"></a>计数器</h4><p>计数器，顾名思义就是在时钟的节拍下进行计数。计数器在工作时，所经历的状态是周期性的、有限的。我们将一次循环所包含的状态总数称为模数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span></span></span></span>，包含 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个触发器的最大模数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>=</mo><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">M=2^n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span>。</p><p>计数器也称为分频器。模 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span></span></span></span> 计数器的输出端的信号频率是 CP 信号的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mn>1</mn><mi>M</mi></mfrac></mrow><annotation encoding="application/x-tex">\frac{1}{M}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.109em;">M</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></p><p>计数器只需要时钟脉冲以使触发器工作，不需要额外输入，因此计数器电路属于 Moore 型电路</p><ol><li>输入输出变量</li><li>建立状态图和状态表。状态图仅包括从状态 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">S_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">S_{n-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span> 的状态，状态表则要讨论全部状态（包含无效状态 d）</li><li>求出各触发器输出端的卡诺图</li><li>写出电路的状态方程和输出方程</li><li>求出驱动方程</li><li>画电路图</li><li>检查电路能否自启动。具体来说，如果<strong>所有</strong>无效状态经过有限个时钟周期后可以转换为某个有效状态，进入正常循环，那么电路就可以 “自启动”</li></ol><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">自启动和挂起</div></div><div class="callout-content"><p></p><p>有些题目还会讨论 “挂起” 现象。“挂起” 说明有无效状态组成了一个死循环，导致电路可能无法进入正常工作循环。“挂起” 现象是一种设计错误，如果出现 “挂起”，则应认为此电路不可自启动。<br>不存在 “部分可自启动” 这个说法。它是一个全局属性，要么成立（即对所有状态成立），要么不成立（即至少对一个状态不成立）</p></div></div><h4 id="序列检测器"><a class="header-anchor" href="#序列检测器"></a>序列检测器</h4><p>序列检测器用于检测是否连续输入某个序列。</p><ol><li>建立原始状态图、原始状态表。原始状态图和原始状态表均只讨论题目明确说明的有效状态</li><li>状态化简。合并等价状态。</li><li>状态编码。根据化简后的状态数量确定触发器数量，进而确定每个状态要用几位编码。状态编码根据格雷码排序，需要讨论无效状态</li><li>求驱动方程和输出方程</li><li>画电路图</li><li>检查自启动特性</li></ol><h4 id="状态化简"><a class="header-anchor" href="#状态化简"></a>状态化简</h4><p>判断两个状态等价有两个条件：<strong>输出相同</strong>且<strong>次态等价</strong>。次态等价指两个状态的次态相等（等价）、交错（即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">S_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>​ 的次态是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">S_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0572em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>​，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mi>j</mi></msub></mrow><annotation encoding="application/x-tex">S_j</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0572em;">j</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em;"><span></span></span></span></span></span></span></span></span></span>​ 的次态是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>S</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">S_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0576em;">S</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.0576em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>）、循环（多个状态相互依赖）或者不变</p><p>状态化简分为两个方法：目测法和隐含表法</p><p>目测法就是按上面的定义 <s>义眼盯真</s> 目视找出等价状态。很明显只有明显的状态对才能被找出。</p><p>隐含表法遵循以下步骤：</p><ol><li>构成隐含表（横去尾、纵去头排列状态，等差阶梯状表格）</li><li>顺序比较：比较结果打 “√” 或 “×”，如果需要进一步确认则填上等效需要的条件状态对</li><li>关联比较状态对：查看条件状态对是否等价，如不等价则打 “×”</li><li>形成最大等效类：等价关系具有传递性，如等价对 AD、BD 等价，则最大等效类为 ABD</li><li>合并状态</li></ol><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217095538913.png" alt="隐含表" loading="lazy"></p><h2 id="中规模时序逻辑电路"><a class="header-anchor" href="#中规模时序逻辑电路"></a>中规模时序逻辑电路</h2><p>中规模组合逻辑电路主要有以下种类芯片：计数器和寄存器</p><h3 id="同步计数器"><a class="header-anchor" href="#同步计数器"></a>同步计数器</h3><p>本课程使用 74161 芯片。74161 的计数进制（模数）为十六进制，输出 4 位二进制码。置数方式采用同步方式，清零方式采用异步方式</p><blockquote><p>异步方式只需要使能信号有效即可（即时响应），而同步方式需要使能信号有效 + 时钟边沿到来（定时响应）</p></blockquote><p>74161 有 4 个置数输入端、2 个使能输入端 T 和 P、异步清零端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><msub><mi>C</mi><mi>r</mi></msub><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{C_r}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span>、同步预置端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><msub><mi>L</mi><mi>D</mi></msub><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{L_D}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span>、脉冲输入端 CP、溢出进位输出端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>O</mi><mi>C</mi></msub></mrow><annotation encoding="application/x-tex">O_C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 和 4 个数据输出端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Q</mi><mi>D</mi></msub><msub><mi>Q</mi><mi>C</mi></msub><msub><mi>Q</mi><mi>B</mi></msub><msub><mi>Q</mi><mi>A</mi></msub></mrow><annotation encoding="application/x-tex">Q_DQ_CQ_BQ_A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0502em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>（高位到低位，严格按照此字母顺序）</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217095700178.png" alt="74161" loading="lazy"></p><p>当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><msub><mi>C</mi><mi>r</mi></msub><mo stretchy="true">‾</mo></mover><mo>=</mo><mover accent="true"><msub><mi>L</mi><mi>D</mi></msub><mo stretchy="true">‾</mo></mover><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">\overline{C_r}=\overline{L_D}=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 且 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi><mo>⋅</mo><mi>P</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">T\cdot P=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时处于输出保持状态；在计数器正常工作状态（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>T</mi><mo>⋅</mo><mi>P</mi><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">T\cdot P=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>）下，当同步计数器加到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1111</mn></mrow><annotation encoding="application/x-tex">1111</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1111</span></span></span></span> 时，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>O</mi><mi>C</mi></msub><mo>=</mo><mi>T</mi><mo>⋅</mo><msub><mi>Q</mi><mi>D</mi></msub><mo>⋅</mo><msub><mi>Q</mi><mi>C</mi></msub><mo>⋅</mo><msub><mi>Q</mi><mi>B</mi></msub><mo>⋅</mo><msub><mi>Q</mi><mi>A</mi></msub><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">O_C=T\cdot Q_D\cdot Q_C\cdot Q_B\cdot Q_A=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0502em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></p><h4 id="构成小于十六进制的计数器"><a class="header-anchor" href="#构成小于十六进制的计数器"></a>构成小于十六进制的计数器</h4><p>两种方法：</p><ul><li>反馈复位法</li></ul><p>从输出端接收到特定信号时将信号返回给清零端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>C</mi><mi>r</mi></msub></mrow><annotation encoding="application/x-tex">C_r</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0715em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">r</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。由于异步方式清零，因此设计 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span></span></span></span> 进制计数器时，反馈复位法需要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi><mo>+</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">M+1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 个状态以防止有效状态被清零，并且因为清零端从接受信号到清零中间有时间差，因此时间图会有毛刺</p><ul><li>反馈预置法</li></ul><p>从输出端接收到特定信号时将信号返回给预置端 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>L</mi><mi>D</mi></msub></mrow><annotation encoding="application/x-tex">L_D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">L</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>。由于同步方式置数，因此设计 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span></span></span></span> 进制计数器时，反馈预置法只需要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span></span></span></span> 个状态且没有毛刺</p><p>如果预置数为 0，那么计数从 0 → M 循环；预置数为 (16 - M)，那么计数从预置数 → M 循环</p><h4 id="构成大于十六进制的计数器"><a class="header-anchor" href="#构成大于十六进制的计数器"></a>构成大于十六进制的计数器</h4><p>首先确定需要几位输出。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>M</mi></mrow><annotation encoding="application/x-tex">M</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span></span></span></span> 进制计数器所需状态数应在 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mrow><mi>n</mi><mo>−</mo><mn>1</mn></mrow></msup><mo>&lt;</mo><mi>M</mi><mo>⩽</mo><msup><mn>2</mn><mi>n</mi></msup></mrow><annotation encoding="application/x-tex">2^{n-1} \lt M \leqslant 2^{n}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8532em;vertical-align:-0.0391em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.82em;vertical-align:-0.1367em;"></span><span class="mord mathnormal" style="margin-right:0.109em;">M</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel amsrm">⩽</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6644em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span></span></span></span></span> 内，则需要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 位输出，那么就需要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn><mo stretchy="false">(</mo><mi>k</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><mo>&lt;</mo><mi>n</mi><mo>⩽</mo><mn>4</mn><mi>k</mi></mrow><annotation encoding="application/x-tex">4(k-1) \lt n \leqslant 4k</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">4</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7733em;vertical-align:-0.1367em;"></span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel amsrm">⩽</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6944em;"></span><span class="mord">4</span><span class="mord mathnormal" style="margin-right:0.0315em;">k</span></span></span></span>，即 k 个 74161 芯片。</p><p>芯片之间的两种连接方法：</p><ul><li>同步连接法</li></ul><p>两片芯片输入相同的 CP，片 2 的两个使能信号均引自片 1 的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>O</mi><mi>C</mi></msub></mrow><annotation encoding="application/x-tex">O_C</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 端</p><ul><li>异步连接法</li></ul><p>片 2 的 CP 来自片 1 的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><msub><mi>O</mi><mi>C</mi></msub><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{O_C}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.0278em;">O</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.0278em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span>（加非门），两片芯片的使能信号始终生效</p><h3 id="异步计数器"><a class="header-anchor" href="#异步计数器"></a>异步计数器</h3><p>异步二进制计数器由 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>T</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">T'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 触发器构成（而 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>T</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mrow><annotation encoding="application/x-tex">T'</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">T</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span> 触发器又可由 JK 触发器或 D 触发器构成），触发器之间串接，低位触发器的输出作为高位触发器的时钟</p><p>一个考点是判断是加法还是减法计数器</p><p>判断方法是看 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Q</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">Q_{i-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span>（低位输出）和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><msub><mi>P</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">CP_{i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3117em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>（高位脉冲端）之间的连接情况。如果连起偶数个（0 / 2 个）圆圈，则为减法计数器；如果连起奇数个（1 个）圆圈，则为加法计数器</p><p>代表芯片是 7490 芯片</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217004626008.png" alt="7490 芯片电路符号" loading="lazy"></p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217004845680.png" alt="7490 芯片逻辑功能表" loading="lazy"></p><h4 id="按指定码制构成十进制计数器"><a class="header-anchor" href="#按指定码制构成十进制计数器"></a>按指定码制构成十进制计数器</h4><ul><li>8421 码</li></ul><p>将 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Q</mi><mi>A</mi></msub></mrow><annotation encoding="application/x-tex">Q_A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><msub><mi>P</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">CP_B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0502em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 相连，计数脉冲从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><msub><mi>P</mi><mi>A</mi></msub></mrow><annotation encoding="application/x-tex">CP_A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 输入。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Q</mi><mi>D</mi></msub><msub><mi>Q</mi><mi>C</mi></msub><msub><mi>Q</mi><mi>B</mi></msub><msub><mi>Q</mi><mi>A</mi></msub></mrow><annotation encoding="application/x-tex">Q_DQ_CQ_BQ_A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0502em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>输出，构成 8421 码计数器</p><ul><li>5421 码</li></ul><p>将 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Q</mi><mi>D</mi></msub></mrow><annotation encoding="application/x-tex">Q_D</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><msub><mi>P</mi><mi>A</mi></msub></mrow><annotation encoding="application/x-tex">CP_A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 相连，计数脉冲从 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><msub><mi>P</mi><mi>B</mi></msub></mrow><annotation encoding="application/x-tex">CP_B</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0502em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 输入。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Q</mi><mi>D</mi></msub><msub><mi>Q</mi><mi>C</mi></msub><msub><mi>Q</mi><mi>B</mi></msub><msub><mi>Q</mi><mi>A</mi></msub></mrow><annotation encoding="application/x-tex">Q_DQ_CQ_BQ_A</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0502em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>输出，构成 5421 码计数器</p><h4 id="实现-10-以内-M-进制计数器"><a class="header-anchor" href="#实现-10-以内-M-进制计数器"></a>实现 10 以内 M 进制计数器</h4><p>把 M 进制对应的输出端为 1 的输出相与后反馈到清零端，作为计数满整清零信号</p><h4 id="实现-11-100-的-M-进制计数器"><a class="header-anchor" href="#实现-11-100-的-M-进制计数器"></a>实现 11 - 100 的 M 进制计数器</h4><ol><li>由两片（个位和十位）7490 扩展成 100 进制</li></ol><p>两芯片均连接成十进制，时钟脉冲从个位 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><msub><mi>P</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">CP_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 进，个位的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Q</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">Q_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 与十位芯片的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>C</mi><msub><mi>P</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">CP_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.0715em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.1389em;">P</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.1389em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 相连即可，</p><ol start="2"><li>把 M 进制所对应的十位、个位芯片上输出为 1 的端相与后反馈到清零端，作为个位和十位的计数满整清零信号</li></ol><h3 id="计数型序列发生器"><a class="header-anchor" href="#计数型序列发生器"></a>计数型序列发生器</h3><p>循环产生指定序列。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 位长度的序列需要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个状态，即需要先构成 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 进制计数器。</p><p>计数器的计数输出需要翻译为 1 位二进制，可以使用基本逻辑门实现</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251218124702237.png" alt="0101101 序列发生器" loading="lazy"></p><p>或者将计数器输出引入译码器（74138）或数据选择器（74151）。</p><p>如果使用译码器，则把 “序列输出 F 为 1 的那些状态” 找出来，用译码器把这些状态 “识别” 出来，然后把识别结果 “与非” 在一起。</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251218000449635.png" alt="11000101 序列发生器" loading="lazy"></p><p>如果使用数据选择器，则数据选择器的数据输入端设置为指定的序列值</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251218000810449.png" alt="011101 序列发生器" loading="lazy"></p><h3 id="寄存器"><a class="header-anchor" href="#寄存器"></a>寄存器</h3><p>寄存器用于暂时存放一组二进制代码，由触发器和控制门构成。</p><p>基本寄存器有<strong>读出、写入、复位</strong>（清零）功能，使用 D 触发器构成最简单。一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 位寄存器由 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个触发器构成，能存放 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 位二进制数</p><p>移位寄存器在基本寄存器的基础上增加了<strong>左移 / 右移</strong>功能。右移指 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>Q</mi><mi>i</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msubsup><mo>=</mo><msubsup><mi>Q</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow><mi>n</mi></msubsup></mrow><annotation encoding="application/x-tex">Q^{n+1}_{i}=Q^{n}_{i-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.1311em;vertical-align:-0.2769em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8542em;"><span style="top:-2.4231em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2769em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0003em;vertical-align:-0.317em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-2.4413em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.317em;"><span></span></span></span></span></span></span></span></span></span>，左移指 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi>Q</mi><mi>i</mi><mrow><mi>n</mi><mo>+</mo><mn>1</mn></mrow></msubsup><mo>=</mo><msubsup><mi>Q</mi><mrow><mi>i</mi><mo>+</mo><mn>1</mn></mrow><mi>n</mi></msubsup></mrow><annotation encoding="application/x-tex">Q^{n+1}_{i}=Q^{n}_{i+1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.1311em;vertical-align:-0.2769em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8542em;"><span style="top:-2.4231em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span></span></span></span><span style="top:-3.1031em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2769em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:1.0003em;vertical-align:-0.317em;"></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-2.4413em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">i</span><span class="mbin mtight">+</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.317em;"><span></span></span></span></span></span></span></span></span></span>。空出来的位置由对应的串行输入取代，被挤出去的数据就没有了</p><p>代表芯片是 74194，实现了双向移位</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251217094024220.png" alt="74194 芯片电路符号" loading="lazy"></p><blockquote><p>这个芯片比较难 QAQ</p></blockquote><h3 id="环形和扭环形计数器"><a class="header-anchor" href="#环形和扭环形计数器"></a>环形和扭环形计数器</h3><p>环形计数器的有效循环为：唯一的 1 右移，或者唯一的 0 左移</p><p>环形计数器的状态利用率低，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个触发器构成的环形计数器仅有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个有效状态，有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup><mo>−</mo><mi>n</mi></mrow><annotation encoding="application/x-tex">2^n-n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7477em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个无效状态</p><p>扭环形计数器的有效循环为：从左到右，1 填满 0；从右到左，0 填满 1</p><p>扭环形计数器的状态利用率较高，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个触发器构成的环形计数器有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>2</mn><mi>n</mi></mrow><annotation encoding="application/x-tex">2n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">2</span><span class="mord mathnormal">n</span></span></span></span> 个有效状态，有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mn>2</mn><mi>n</mi></msup><mo>−</mo><mn>2</mn><mi>n</mi></mrow><annotation encoding="application/x-tex">2^n-2n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.7477em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord">2</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6644em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">2</span><span class="mord mathnormal">n</span></span></span></span> 个无效状态</p><p>扭环形计数器也可以用 74194 芯片构成。</p><h3 id="奇数分频器"><a class="header-anchor" href="#奇数分频器"></a>奇数分频器</h3><p>本质计数器，按反馈预置法接线</p><p>有一个规律：使用 74194 芯片右移时，置数端</p><ul><li>接 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><msub><mi>Q</mi><mi>D</mi></msub><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{Q_D}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span></span></span></span> 是模 8 计数</li><li>接 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><msub><mi>Q</mi><mi>C</mi></msub><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{Q_C}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span></span></span></span> 是模 6 计数</li><li>接 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><msub><mi>Q</mi><mi>B</mi></msub><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{Q_B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0502em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span></span></span></span> 是模 4 计数</li><li>接 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><msub><mi>Q</mi><mi>A</mi></msub><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{Q_A}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">A</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span></span></span></span> 是模 2 计数</li><li>接 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mrow><msub><mi>Q</mi><mi>D</mi></msub><msub><mi>Q</mi><mi>C</mi></msub></mrow><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{Q_DQ_C}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span></span></span></span> 是模 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mrow><mn>8</mn><mo>+</mo><mn>6</mn></mrow><mn>2</mn></mfrac><mo>=</mo><mn>7</mn></mrow><annotation encoding="application/x-tex">\frac{8+6}{2}=7</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span><span class="mbin mtight">+</span><span class="mord mtight">6</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">7</span></span></span></span> 计数</li><li>接 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mrow><msub><mi>Q</mi><mi>C</mi></msub><msub><mi>Q</mi><mi>B</mi></msub></mrow><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{Q_CQ_B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0715em;">C</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0502em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span></span></span></span> 是模 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mrow><mn>6</mn><mo>+</mo><mn>4</mn></mrow><mn>2</mn></mfrac><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">\frac{6+4}{2}=5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">6</span><span class="mbin mtight">+</span><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span> 计数</li><li>接 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mrow><msub><mi>Q</mi><mi>D</mi></msub><msub><mi>Q</mi><mi>B</mi></msub></mrow><mo stretchy="true">‾</mo></mover></mrow><annotation encoding="application/x-tex">\overline{Q_DQ_B}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord katex-overline"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8833em;"><span style="top:-3em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0278em;">D</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">Q</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3283em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.0502em;">B</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.8033em;"><span class="pstrut" style="height:3em;"></span><span class="overline-line" style="border-bottom-width:0.04em;"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1944em;"><span></span></span></span></span></span></span></span></span> 是模 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mrow><mn>8</mn><mo>+</mo><mn>4</mn></mrow><mn>2</mn></mfrac><mo>=</mo><mn>6</mn></mrow><annotation encoding="application/x-tex">\frac{8+4}{2}=6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">2</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="katex-sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">8</span><span class="mbin mtight">+</span><span class="mord mtight">4</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">6</span></span></span></span> 计数</li></ul><h3 id="脉冲型序列发生器"><a class="header-anchor" href="#脉冲型序列发生器"></a>脉冲型序列发生器</h3><p>先设置左移右移，然后设计反馈电路</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/20251218130455641.png" alt="10110 序列发生器" loading="lazy"></p><hr><h2 id="实验提示"><a class="header-anchor" href="#实验提示"></a>实验提示</h2><p>建议使用芯片乃至实验仪前测试一下功能。基础门电路芯片尽量对每个门（至少测你需要的门）都测一遍功能，不然会成小丑 🤡</p><p>数码管记得 “共阳极” 接法，即在数码管右侧、逻辑灯泡的左下角，有对 “-5V” 和 “+5V” 的接口，将它们连一起。否则你的数码管数值会乱跳，然后求助老师并收获一番质问 😦</p><p>要对自己的电路有信心。也可以先用 Multisim 仿真一下结果</p><p>一般实验的数据记录可以提前写，因为我们做的毕竟是 “理论验证实验” 🤣</p><p>实验考试难度，就我抽到的题目（74161 实现模 10 计数器）而言，<strong>不会超过</strong>实验书的实验难度（远远没达到综合实验的难度），但<strong>一定要带实验书和一般实验的报告</strong>，因为你要看芯片的接线图的！</p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p>集成触发器（如 D 触发器、JK 触发器）中，其内部的核心锁存单元绝大多数都是基于<strong>或非门</strong>（或等效结构）的 RS 锁存器。 <a href="#fnref1" class="footnote-backref">↩︎</a></p></li></ol></section>]]>
    </content>
    <id>https://watermelonabc.top/p/7d823f34/</id>
    <link href="https://watermelonabc.top/p/7d823f34/" rel="alternate"/>
    <published>2025-09-08T07:06:34.000Z</published>
    <summary>还剩第五章，时序逻辑（</summary>
    <title>2025 福州大学数字逻辑笔记</title>
    <updated>2026-08-06T05:38:08.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="学习笔记" scheme="https://watermelonabc.top/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="CTF" scheme="https://watermelonabc.top/tags/CTF/"/>
    <category term="Reverse" scheme="https://watermelonabc.top/tags/Reverse/"/>
    <content>
      <![CDATA[<p>C# 用于微软 .NET 的开发。如果我们尝试使用 IDA 对 C# 程序反汇编，很可能只能收到一个无情的 <code>Sorry, the current file is not decompilable</code>。C# 反编译需要专门工具。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>Unity 同样使用 C#。对于使用 Mono 作为脚本后端 (Scripting Backend) 的 Unity 游戏，可以使用下面介绍的 C# 反编译工具对 <code>Assembly-CSharp.dll</code> 反编译，即可得到源码。</p></div></div><h2 id="dnSpy-和-ILSpy"><a class="header-anchor" href="#dnSpy-和-ILSpy"></a>dnSpy 和 ILSpy</h2><p>dnSpy 是一个调试器和 .NET 程序集编辑器。它提供了和 Visual Studio 类似的界面，并且有官方中文！</p><p>我们关心的特性有这几个：</p><ul><li>调试 .NET Framework、.NET 和 Unity 游戏程序集，<strong>无需源代码</strong></li><li>所有元数据都可以编辑</li><li>使用 IntelliSense 编辑 C# 或 Visual Basic 中的方法和类，<strong>无需源代码</strong></li><li>在 C# 或 Visual Basic 中添加新的方法、类或成员</li></ul><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>所以没有用反逆向机制的 C# 或 .NET 程序是很容易被破解的……</p></div></div><p>原始的 dnSpy 已经在 2020 年归档，现在仍在活跃的是分支版本 <a href="https://github.com/dnSpyEx/dnSpy">dnSpyEx</a>。</p><p>dnSpy 采用和 VS 类似的文件组织架构，导入的文件显示在 “程序集资源管理器” 中</p><p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/Snipaste_2025-09-07_00-13-42.png" alt="dnSpy截图" loading="lazy"></p><p>一个文件被划分为以下部分（从上到下）：</p><ul><li>PE</li><li>类型引用</li><li>引用</li><li>类 (<code>{}</code>)</li></ul><p>我们主要关注的是 <code>{}</code> 下的那些方法。</p><p>如果你需要全局查找字符串，请使用 “搜索程序集” 功能，并选择搜索 “数字 / 字符串”。它可以在工具栏最右端、“编辑” 菜单中找到，或者按快捷键 <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>K</kbd>。</p><hr><p>dnSpy 的反编译器是 <a href="https://github.com/icsharpcode/ILSpy/">ILSpy</a>，它同样拥有图形化界面。由于 ILSpy 专注于反编译工作，因此它的更新速度比较快，反编译效果也更好。我们建议将 dnSpy 和 ILSpy 配合使用。</p><p>其他反编译软件有 dotPeek（效果媲美 ILSpy，但启动过慢）、.NET Reflector（祖师爷级别，但已经不再进一步更新）等。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/b88b7467/</id>
    <link href="https://watermelonabc.top/p/b88b7467/" rel="alternate"/>
    <published>2025-09-04T14:15:33.000Z</published>
    <summary>专人专用</summary>
    <title>C# 逆向入门</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="学习笔记" scheme="https://watermelonabc.top/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="CTF" scheme="https://watermelonabc.top/tags/CTF/"/>
    <category term="Android" scheme="https://watermelonabc.top/tags/Android/"/>
    <content>
      <![CDATA[<p><img src="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/Android_logo_2023_(stacked).png" alt="安卓刷机一点通" /></p>
<p>对于数年前的安卓用户而言，刷机并不是一个生涩的词。厂商官网上提供解锁 Bootloader 服务，应用市场里躺着 Root 获取器和刷机软件，专业论坛里有着丰富的刷机包，Root 之后，像是烧饼、葫芦侠、幸运、GG 等修改器就可以大显身手了。这些构成了我当时对于安卓刷机的印象。</p><p>那时，我在一个一键刷机软件上找了一个看的过去的刷机包，把我的乐视 1（大概？）刷上了机。当然，我当时只是一个小萌新，丝毫不知道这 “一键” 的后果是什么。我自信地勾选了 “保留软件”，但在刷机后却发现这只是把刷机前安装的软件再安装一遍，而原有的用户数据自然是菠萝菠萝哒了 (OMO)</p><p>在现在这个时间谈刷机似乎不合时宜。各品牌都在收紧解 BL 锁的权利，乃至禁止 <s>（猜猜看是哪个品牌既有高考又有体考的）</s>。因此，要学刷机，我们就只好折腾旧手机了，这也是更经济的选择。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>本文使用 Google Pixel 2 作为示例。作为 Google 亲儿子，Pixel 系列的刷机难度是比较低的，开发工具和文档也很完善。<br>请确认你购买的机型是否可以解 OEM 锁，这是解 Bootloader 锁的前提。商家页面会写，一般标 “O” 的就是可以解 OEM 锁。实际上，更有可能的情况是商家已经默认帮你提前解锁好了 Bootloader <s>买这种破烂机器做什么他们门儿清</s><br>依照财力选择，量力而行。Pixel 1 不太推荐，我在淘宝上买了两家的 Pixel 1，一家脱了我数天不发货，然后看了小肩膀的推荐去了另外一家，我买完就下架了，并且客服跟我说现在他们手里的都是功能缺陷品。当然，你也可以在咸鱼上面找一找，多半是比我买的要便宜的。</p></div></div><h2 id="了解-Android-文件目录"><a class="header-anchor" href="#了解-Android-文件目录"></a>了解 Android 文件目录</h2><p>Android 系统有三种权限：第三方软件权限、用户权限和超级用户 (ROOT)，从低到高排序。如果我们想在软件层面折腾手机，就必须先获取 ROOT 权限。</p><div class="callout" data-callout="question"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-help-circle"><circle cx="12" cy="12" r="10"></circle><path d="M9.09 9a3 3 0 0 1 5.83 1c0 2-3 3-3 3"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Root 后会不会不安全</div></div><div class="callout-content"><p></p><blockquote><p>是的，手机 Root 后确实会带来显著的安全风险。但这并不意味着它 “绝对不安全”，而是意味着安全的重心从手机厂商转移到了你自己身上。<br>—— DeepSeek V3</p></blockquote><blockquote><p>…… 我是用一台全新的平板折腾，并永不打算在这台设备上安装微信、支付宝、银行 APP 等敏感 APP。再就是解锁 ROOT、安装 Magisk 和 LSPosed 后，千万不可随意安装需要 ROOT 的 APP、脚本、模块等。因为你会给这些程序赋予你手机的最高权限，程序可以在完全不询问你、不显示 UI 的前提下，对你的手机进行一切权限操作。<br>所以一般来说，只敢选择 Github 开源的，在 B 站、酷安、V 站等平台口碑较好的存活时间较长的软件、模块。并且建议选择 Github 开源代码的，直接在原版作者的 Gtihub 的 releases 中下载 APK/ZIP。安装后，设置生效范围，比如 Guise 模块只有 Tiktok 用，生效范围只选 Tiktok。在 Magisk 中的排除列表，排除所有敏感 APP，这些被排除的 APP 不参与到 ROOT、模块中。<br>——<a href="https://leanote.zzzmh.cn/blog/post/admin/66de7344c0a657000b034f85">关于 2024 年如何 ROOT 安卓系统 并进行系统优化等 基础入门 Magisk lsposed</a></p></blockquote><p>与真正的 Linux 相比，Android 的 Root 的权限相对更 “大”。当然，这种 “大” 是不受控的、“粗糙的”，因为 Android 设计时就不希望用户获取 Root 权限，所以一旦你获取了 Root 权限，Android 系统内就几乎没有安全机制限制权限。由于 Android 的权限控制是基于应用的，所以一个获取了 Root 权限的应用实际上也获取了和你一样的权力。</p></div></div><p>在旧版的 Android 中，系统文件目录分为：</p><ul><li><code>Boot</code> 分区：包含 <code>Kernel</code>（内核）和 <code>Ramdisk</code>（虚拟内存），和开机启动引导有关。我们折腾手机很大一部分就是在折腾 <code>Boot</code> 分区。如果 <code>Boot</code> 分区损坏，那么手机开机就会卡在第一屏（有 “Powered by ...” 的）<s>变砖辣</s></li><li><code>System</code> 和 <code>Vendor</code> 分区：存放操作系统和系统软件，系统升级 / 刷机就是刷 <code>System</code> 的。如果 <code>System</code> 分区损坏，那么手机开机就会卡在第二屏 <s>又变砖啦</s></li><li><code>Data</code> 分区：存放软件数据</li><li><code>Cache</code> 分区：缓存区</li><li><code>Recovery</code> 分区：包含一个简易的 Linux 系统，用于恢复和维护手机，类似于 Windows PE。</li></ul><p>从 7.0 开始，Android 引入了新的升级方式：A/B System Updates。手机中同时存在两套 <code>Boot</code> 和 <code>System</code>，其中一套作为备份，必要时可以切换。这种更新方式的特征就是无缝升级和容灾。用户在系统升级时仍然可以操作手机，如果升级失败，备份分区的存在也不至于造成无法挽回的损失。A/B 分区下的 <code>Recovery</code> 集成到 <code>Boot</code> 分区中。</p><p>从 10.0 开始，Android 引入了动态分区技术，备份的 A/B <code>System</code>、<code>Vendor</code> 等系统分区整合到 <code>Super</code> 分区中，开发者无需关心 <code>Super</code> 分区下各子分区的大小。注意，由于原理限制，<code>Boot</code> 分区不使用动态分区。</p><p>A/B 分区由于多了一个备份分区，会导致系统空间占用增加，于是 Android 11 又出现了 VAB（虚拟 A/B 分区）。VAB 仅备份 <code>Boot</code> 分区，其他分区（包括 <code>Super</code>）将更新的增量内容写入快照中。更新后，如果正常启动，那么系统就会将快照内容合并到老数据，这样就完成了一次 VAB 更新。</p><p>由于 AB 和 VAB 分区中 <code>Recovery</code> 分区被合并到 <code>Boot</code> 分区中，所以刷第三方 Recovery（如 TWRP）会比较麻烦。现在更推荐一种更接近底层的刷机方法—— Fastboot。</p><h2 id="Fastboot"><a class="header-anchor" href="#Fastboot"></a>Fastboot</h2><p>Android 系统启动前，会加载 Bootloader（引导加载器，相当于 BIOS/UEFI），初始化硬件设备并引导硬件设备。在引导后期，我们可以通过快捷键进入 Fastboot 模式。Fastboot 是一种引导加载程序模式，可以在该模式下刷写设备。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>我们所说的 BL 锁是一个系统分区签名检查机制。运行时，Bootloader 会检查设备状态，如果是 <code>Locked</code>，则检查签名，匹配成功后正常引导系统，匹配不成功则拒绝引导；如果是 <code>Unlocked</code>，则不检查签名。<br>第三方系统镜像基本没有签名，因此 Bootloader 无法引导这些镜像。当然，理论上讲，如果有正确的签名工具对分区签名，也可以过一些 BL 锁，不过可能都是华强北山寨机了。<br>如何查看 BL 有没有解锁？一个是查看手机正常启动时有没有提示，例如 Google Pixel 在 BL 解锁后会先显示一个警告，然后进入开机画面时会有一个开锁 🔓 图标。另一个是进入 Fastboot 模式查看 <code>Device State</code> 是否为 <code>Unlocked</code></p><blockquote><p>当您开启 Android 设备时，系统会对操作系统进行检查，以确保它可以安全使用。可以安全使用意味着代码均来自可信来源，而且没有遭到更改或损坏。</p><p>如果您的操作系统可能存在问题，系统会向您发出一条警告消息，该消息会将您转至此页面 (<a href="http://g.co/ABH">g.co/ABH</a>)。</p><p>——<a href="https://support.google.com/android/answer/6185381?visit_id=638966596883160126-2115184733&amp;p=verified_boot&amp;rd=1">了解关于操作系统安全的警告</a></p></blockquote></div></div><p>Fastboot 独立于 Android 文件目录之外。如果刷 Recovery 刷砖了，可以试试能否用 Fastboot 救回来。有时候情况更加危急，比如刷机刷坏了基带、字库等，连 Fastboot 都进不去，那么就只能通过更加底层的刷机模式—— EDL 串口线刷模式来救了。在高通平台，它的别名更加知名：9008 模式。</p><p>用 <code>fastboot devices</code> 检查是否进入 fastboot 模式。如果没有输出，请先查看是否安装驱动。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">检查驱动</div></div><div class="callout-content"><p>如果 fastboot 找不到设备，请查看设备管理器是否有显示感叹号 ⚠ 的设备（我这里显示 Android+）。如果有，右键 -&gt; 更新驱动程序 -&gt; 浏览我的计算机以查找驱动程序 -&gt; 让我从计算机上的可用驱动程序列表选取。如果弹出的选项直接有 “ADB 设备”，则选择。否则返回，我们需要手动指向 Google USB 驱动。</p><p>如果你在 Android Studio 中勾选安装了 Google USB Driver，那么驱动在 <code>&lt;Android SDK Location&gt;\extras\google\usb_driver</code>。在 “浏览我的计算机以查找驱动程序” 填入以上位置搜索驱动程序。</p><p>Android Studio 是<strong>唯一</strong>的官方驱动获取途径。<a href="https://developer.android.google.cn/studio/run/win-usb?hl=zh-cn">文档</a>提供的独立下载链接不知为何返回的是 404。</p></div></div><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p>在设备关机时，可使用以下组合键进入 fastboot 模式：同时按住音量 “-” 键和电源键<br>在设备开机时，可以通过 <code>adb reboot bootloader</code> 进入 fastboot 模式。</p></div></div><h2 id="刷-LineageOS-22"><a class="header-anchor" href="#刷-LineageOS-22"></a>刷 LineageOS 22</h2><p>LineageOS 是一个非常长寿而著名的类原生安卓发行版。正如它的宣传语：“为您的设备注入新的活力，无论是旧设备还是新设备。” 他们为许多老旧手机提供了远超官方维护期限的系统更新服务，例如我手里的 Google Pixel 2，当它的 Google 官方最高版本停留在 2020 年 Android 11 时，LineageOS 维护至今，已经适配到了 Android 15。</p><p>LineageOS 是开源软件，且默认不包含 Google 服务，因此吸引了其他开发者以此作为基底，开发自己的 Android 发行版。</p><p>Pixel 2 在 LineageOS 官网有良好的安装指引：<a href="https://wiki.lineageos.cn/devices/walleye/">关于 walleye 的信息</a>。可遵循该指引安装 LineageOS。</p><p>LineageOS 是一个纯净的系统，自身没有提供 Root 权限，所以要获取 Root 权限，我们还需要安装其他的东西。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>根据 LineageOS 文档和 XDA 论坛的说法，如果想要再刷其他的自定义系统，建议先刷回 Google 的出厂镜像，然后再按照一般方法刷入第三方镜像。</p></div></div><h2 id="Magisk"><a class="header-anchor" href="#Magisk"></a>Magisk</h2><p>Magisk 在刷机界大名鼎鼎，适配性比较好。本次我们选择的是 topjohnwu/Magisk，其他分支版本请自己探索。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>Magisk 不是唯一选择。你还有 KernelUS。<br>Apatch、SukiSU 等由 KernelUS 派生而来，同样是另外的选择。<br>注意 LineageOS 22 或者低 Linux 内核版本（老机型）可能无法安装 KernelUS 系。Magisk 系是更稳妥的选择。<br>比如，Google 从 Pixel 6 才开始引入 GKI 内核，而 KernelSU 就是基于 GKI 内核的。如果是非 GKI 内核，那么需要<strong>自行修改 Adnroid 源码并编译</strong>。</p></div></div><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">Warning</div></div><div class="callout-content"><p>仅从官方 Github 页面下载 Magisk。</p></div></div><p>使用 Magisk 前，你需要获取当前系统的原版 <code>boot.img</code>/<code>init_boot.img</code> 文件。LineageOS 在下载页面提供了 <code>boot.img</code>，如果没有专门提供 <code>boot.img</code> 下载，则需要从刷机包中提取。</p><p>将提取好的 <code>boot.img</code> 文件传输到手机上，Magisk 首页点击 “安装” 按钮，选择 “选择并修补一个文件”，然后选择你刚刚传输的 <code>img</code> 文件，等待修补完成。</p><p>将修补后的文件传回电脑，使用 fastboot 刷入修补镜像。重启，就可以得到 Root 权限了。</p><p>你可能会用到的 ADB/Fastboot 命令：</p><div class="tag-plugin copy"><input class="copy-area" id="copy_2" value="adb push <src_PC> <dest_Phone>"><button class="copy-btn" onclick="util.copy('copy_2','复制成功')"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><div class="tag-plugin copy"><input class="copy-area" id="copy_3" value="adb pull <src_Phone> <dest_PC>"><button class="copy-btn" onclick="util.copy('copy_3','复制成功')"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><div class="tag-plugin copy"><input class="copy-area" id="copy_4" value="adb reboot fastboot"><button class="copy-btn" onclick="util.copy('copy_4','复制成功')"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><div class="tag-plugin copy"><input class="copy-area" id="copy_5" value="fastboot flash boot </path/to/magisk_patched_[random_strings].img>"><button class="copy-btn" onclick="util.copy('copy_5','复制成功')"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><div class="tag-plugin copy"><input class="copy-area" id="copy_6" value="fastboot reboot"><button class="copy-btn" onclick="util.copy('copy_6','复制成功')"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>之后除非重装 / 升级系统，否则可以直接使用 Magisk 应用升级 Magisk 修补镜像。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/58cd3450/</id>
    <link href="https://watermelonabc.top/p/58cd3450/" rel="alternate"/>
    <link href="https://rt265-blog.oss-cn-hongkong.aliyuncs.com/img/Android_logo_2023_(stacked).png" rel="enclosure" type="image/png"/>
    <published>2025-08-29T08:08:04.000Z</published>
    <summary>安卓逆向到最后，玩的就是系统</summary>
    <title>安卓刷机一点通</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>Watermelonabc</name>
    </author>
    <category term="学习笔记" scheme="https://watermelonabc.top/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    <category term="Study" scheme="https://watermelonabc.top/tags/Study/"/>
    <category term="CTF" scheme="https://watermelonabc.top/tags/CTF/"/>
    <category term="Reverse" scheme="https://watermelonabc.top/tags/Reverse/"/>
    <content>
      <![CDATA[<p>算法算法，离不开各种公式。我们坚信：只要解出这些公式，就可以得到 flag。</p><p>但计算机中的 “公式” 往往不会是简单的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>+</mo><mi>y</mi><mo>=</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">x+y=2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span> 之类，而会是掺杂了算术、位向量、数据结构等。我们（判断能否）解出这些公式的过程，就是在判断这些公式的可满足性 (Satisfiability) 如何。</p><p>这里我们就提出了<strong>可满足性模理论</strong> (Satisfiability Modulo Theories, SMT)：</p><ol><li>给定一组理论 (Theory)，根据给定逻辑，求在该组理论解释下公式的可满足性</li><li>现有理论通常针对一阶理论，即公理都是一阶的</li></ol><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">理论 Theory</div></div><div class="callout-content"><p>从逻辑学角度来看，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mo>&lt;</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">a+b&lt;c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.7335em;vertical-align:-0.0391em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&lt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span> 或者 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>b</mi><mo stretchy="false">)</mo><mo>&gt;</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">f(b)&gt;c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord mathnormal">b</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">&gt;</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span> 都是逻辑系统中不包含的符号，计算机需要知道他们的意思，这就引出了理论的概念：</p><ol><li>理论用于对这类符号谓词 / 函数（比如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>&gt;</mo></mrow><annotation encoding="application/x-tex">&gt;</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.5782em;vertical-align:-0.0391em;"></span><span class="mrel">&gt;</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mo>⋅</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(⋅)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mopen">(</span><span class="mord">⋅</span><span class="mclose">)</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo>+</mo></mrow><annotation encoding="application/x-tex">+</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord">+</span></span></span></span>，...）赋予含义;</li><li>理论包含一组公理和这组公理能推导出的结论;</li></ol><p>因此，如果想解决 SMT 问题，求解器就需要内置基本的理论。</p></div></div><div class="callout" data-callout="warning"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-alert-triangle"><path d="m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3Z"></path><path d="M12 9v4"></path><path d="M12 17h.01"></path></svg></div><div class="callout-title-inner">公理都是一阶的</div></div><div class="callout-content"><p>首先，Z3 内置的理论都是在一阶逻辑 (FOL, first-order logic) 下定义的，需要推的公理只使用这些一阶逻辑理论定义。<br>一阶逻辑的显著特点是只对<strong>对象变量</strong>（如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.0359em;">y</span></span></span></span> 等）进行量化（全称量化 ∀ 和存在量化 ∃），没有对函数或谓词本身做量化，它们在这些理论中应当是固定的。一阶逻辑相对好求，因为对象集合离散且数量级较小，可以用 SMT 技术穷举。<br>二阶逻辑量化的是谓词/函数本身，这些谓词和函数在现有理论中是不固定的。二阶逻辑难求，因为它需要遍历所有可能的谓词/函数，数量级非常大，Z3 不支持这一类问题。</p><p>换句话说，一阶逻辑相当于数学考试中的 “求符合条件的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 的值”，二阶逻辑相当于 “求符合条件的函数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mrow><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow></mrow><annotation encoding="application/x-tex">f{(x)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="katex-base"><span class="katex-strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.1076em;">f</span><span class="mord"><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span></span>”</p></div></div><p>将程序算法当成一个 SMT 问题，我们便可以从正向破解它，并且相对于逆向的难度较小。Z3 就是一个高效的 SMT 求解器，具有专门用于解决一阶逻辑理论的算法。</p><h2 id="Z3Py-入门"><a class="header-anchor" href="#Z3Py-入门"></a>Z3Py 入门</h2><p>要使用 Python 的 Z3，请通过 pip 安装：</p><div class="tag-plugin copy"><input class="copy-area" id="copy_1" value="pip install z3-solver | sh"><button class="copy-btn" onclick="util.copy('copy_1','复制成功')"><svg class="icon copy-btn" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M5.75 1a.75.75 0 00-.75.75v3c0 .414.336.75.75.75h4.5a.75.75 0 00.75-.75v-3a.75.75 0 00-.75-.75h-4.5zm.75 3V2.5h3V4h-3zm-2.874-.467a.75.75 0 00-.752-1.298A1.75 1.75 0 002 3.75v9.5c0 .966.784 1.75 1.75 1.75h8.5A1.75 1.75 0 0014 13.25v-9.5a1.75 1.75 0 00-.874-1.515.75.75 0 10-.752 1.298.25.25 0 01.126.217v9.5a.25.25 0 01-.25.25h-8.5a.25.25 0 01-.25-.25v-9.5a.25.25 0 01.126-.217z"></path></svg></button></div><p>接下来我们解一个简单的二元一次方程：</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> z3 <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">x= Int(<span class="string">'x'</span>)</span><br><span class="line">y= Int(<span class="string">'y'</span>)</span><br><span class="line">solve(x &gt; <span class="number">2</span>, y &lt; <span class="number">10</span>, x + <span class="number">2</span> * y == <span class="number">7</span>)</span><br></pre></td></tr></tbody></table></figure><p>得到输出：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[y = 0, x = 7]</span><br></pre></td></tr></tbody></table></figure><p>函数 <code>Int('x')</code> 用于在 Z3 中创建一个名为 <code>x</code> 的整数变量。<code>solve</code> 函数求解一个约束系统 (System of Constraints)。上面的例子使用了两个变量 <code>x</code> 和 <code>y</code>，以及三个约束 (Constraints)：</p><ol><li><p><code>x</code> 必须大于 2</p></li><li><p><code>y</code> 必须小于 10</p></li><li><p>当 <code>x</code> 加上 <code>y</code> 的两倍时，它必须等于 7</p></li></ol><p>约束就相当于考试中的条件和公式。</p><p>Z3Py 和 Python 一样使用 <code>=</code> 进行赋值，使用运算符 <code>&lt;</code>、<code>&lt;=</code>、<code>&gt;</code>、<code>&gt;=</code>、<code>==</code> 和 <code>!=</code> 进行比较。</p><hr><p>接下来，我们将介绍 Z3 Solver 的一些特性。</p><h2 id="表达式属性"><a class="header-anchor" href="#表达式属性"></a>表达式属性</h2><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">x = Int(<span class="string">'x'</span>)</span><br><span class="line">y = Int(<span class="string">'y'</span>)</span><br><span class="line">n = x + y &gt;= <span class="number">3</span></span><br><span class="line"><span class="built_in">print</span> (<span class="string">"num args: "</span>, n.num_args())</span><br><span class="line"><span class="built_in">print</span> (<span class="string">"children: "</span>, n.children())</span><br><span class="line"><span class="built_in">print</span> (<span class="string">"1st child:"</span>, n.arg(<span class="number">0</span>))</span><br><span class="line"><span class="built_in">print</span> (<span class="string">"2nd child:"</span>, n.arg(<span class="number">1</span>))</span><br><span class="line"><span class="built_in">print</span> (<span class="string">"operator: "</span>, n.decl())</span><br><span class="line"><span class="built_in">print</span> (<span class="string">"op name:  "</span>, n.decl().name())</span><br></pre></td></tr></tbody></table></figure><p>输出：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">num args:  2</span><br><span class="line">children:  [x + y, 3]</span><br><span class="line">1st child: x + y</span><br><span class="line">2nd child: 3</span><br><span class="line">operator:  &gt;=</span><br><span class="line">op name:   &gt;=</span><br></pre></td></tr></tbody></table></figure><p><code>n</code> 注册了一个表达式类，通过类 <code>n</code> 提供的方法，我们可以得到表达式的参数、子式（左右两边的式子）和比较运算符信息。</p><h2 id="基本数学运算"><a class="header-anchor" href="#基本数学运算"></a>基本数学运算</h2><p>Z3 提供所有基本的数学运算。Z3Py 使用与 Python 语言相同的运算符优先级。<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup></p><p>Z3 内置的整数算术是 Presburger 算术，只完备支持<strong>加减法、乘常数和比较运算</strong>。</p><div class="tag-plugin quot p"><p class="content"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from BoxIcons Solid by Atisa - https://creativecommons.org/licenses/by/4.0/ --><path fill="currentColor" d="M3.691 6.292C5.094 4.771 7.217 4 10 4h1v2.819l-.804.161c-1.37.274-2.323.813-2.833 1.604A2.9 2.9 0 0 0 6.925 10H10a1 1 0 0 1 1 1v7c0 1.103-.897 2-2 2H3a1 1 0 0 1-1-1v-5l.003-2.919c-.009-.111-.199-2.741 1.688-4.789M20 20h-6a1 1 0 0 1-1-1v-5l.003-2.919c-.009-.111-.199-2.741 1.688-4.789C16.094 4.771 18.217 4 21 4h1v2.819l-.804.161c-1.37.274-2.323.813-2.833 1.604A2.9 2.9 0 0 0 17.925 10H21a1 1 0 0 1 1 1v7c0 1.103-.897 2-2 2"></path></svg><span class="text">Z3 基本数学运算支持与完备性速查表</span><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24"><!-- Icon from BoxIcons Solid by Atisa - https://creativecommons.org/licenses/by/4.0/ --><path fill="currentColor" d="M20.309 17.708C22.196 15.66 22.006 13.03 22 13V5a1 1 0 0 0-1-1h-6c-1.103 0-2 .897-2 2v7a1 1 0 0 0 1 1h3.078a2.9 2.9 0 0 1-.429 1.396c-.508.801-1.465 1.348-2.846 1.624l-.803.16V20h1c2.783 0 4.906-.771 6.309-2.292m-11.007 0C11.19 15.66 10.999 13.03 10.993 13V5a1 1 0 0 0-1-1h-6c-1.103 0-2 .897-2 2v7a1 1 0 0 0 1 1h3.078a2.9 2.9 0 0 1-.429 1.396c-.508.801-1.465 1.348-2.846 1.624l-.803.16V20h1c2.783 0 4.906-.771 6.309-2.292"></path></svg></p></div><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>本表由 GPT-5 生成<br>本表基于 Z3Py 与 SMT-LIB2 标准，标明完备性（✅ 完备 / ⚠️ 部分完备 / ❌ 不完备）。</p><ul><li>✅ <strong>完备</strong>：Z3 在相应理论（如 LIA/LRA）下可保证可判定且一定返回 SAT/UNSAT。</li><li>⚠️ <strong>部分完备</strong>：Z3 尝试求解，但可能返回 <code>unknown</code>。</li><li>❌ <strong>不完备 / 不支持</strong>：Z3 无内置语义，需人工编码或近似化。</li></ul><p>参考</p><ul><li><a href="https://z3prover.github.io/api/html/z3.html">Z3Py API Reference</a></li><li><a href="http://smtlib.cs.uiowa.edu/">SMT-LIB Standard</a></li></ul></div></div><ol><li>通用 (LIA / LRA)</li></ol><table><thead><tr><th>Z3Py</th><th>SMT-LIB2</th><th>含义</th><th>完备性</th></tr></thead><tbody><tr><td><code>+</code></td><td><code>+</code></td><td>加法</td><td>✅</td></tr><tr><td><code>-</code></td><td><code>-</code></td><td>减法 / 取负</td><td>✅</td></tr><tr><td><code>*</code></td><td><code>*</code></td><td>乘法（线性，有一个是常量）</td><td>✅</td></tr><tr><td><code>/</code></td><td><code>/</code></td><td>实数除法</td><td>✅</td></tr><tr><td><code>&lt;</code>, <code>&lt;=</code></td><td><code>&lt;</code>, <code>&lt;=</code></td><td>小于 / 小于等于</td><td>✅</td></tr><tr><td><code>&gt;</code>, <code>&gt;=</code></td><td><code>&gt;</code>, <code>&gt;=</code></td><td>大于 / 大于等于</td><td>✅</td></tr><tr><td><code>=</code></td><td><code>=</code></td><td>等式</td><td>✅</td></tr><tr><td><code>Distinct(a,b,c)</code></td><td><code>distinct</code></td><td>两两不等</td><td>✅</td></tr></tbody></table><ol start="2"><li>整数专用 (LIA / LIA+mod)</li></ol><table><thead><tr><th>Z3Py</th><th>SMT-LIB2</th><th>含义</th><th>完备性</th></tr></thead><tbody><tr><td><code>IntDiv(x, y)</code></td><td><code>div</code></td><td>整数除法（向零取整）</td><td>✅</td></tr><tr><td><code>x % y</code> / <code>Mod(x, y)</code></td><td><code>mod</code></td><td>取模（符号与被除数相同）</td><td>✅</td></tr><tr><td><code>Abs(x)</code></td><td><code>abs</code></td><td>绝对值</td><td>✅</td></tr><tr><td><code>ToReal(x)</code></td><td><code>to_real</code></td><td>Int → Real 转换</td><td>✅</td></tr><tr><td><code>ToInt(x)</code></td><td><code>to_int</code></td><td>Real → Int 转换（向零取整）</td><td>✅</td></tr><tr><td><code>is_int(x)</code></td><td><code>is_int</code></td><td>检查实数是否是整数值</td><td>✅</td></tr></tbody></table><ol start="3"><li>常量与类型装换</li></ol><table><thead><tr><th>Z3Py</th><th>SMT-LIB2</th><th>含义</th></tr></thead><tbody><tr><td><code>IntVal(n)</code></td><td>numeral</td><td>整数常量</td></tr><tr><td><code>RealVal(r)</code></td><td>numeral</td><td>实数常量</td></tr></tbody></table><ol><li>不属于基本运算的运算（非线性 / 超越）</li></ol><table><thead><tr><th>运算</th><th>例子</th><th>完备性</th><th>备注</th></tr></thead><tbody><tr><td>非线性乘法</td><td><code>x*y</code></td><td>⚠️</td><td>两个算子都属于变量</td></tr><tr><td>幂运算（常数指数）</td><td><code>x**2</code></td><td>⚠️</td><td>属于非线性算术，可求但不完备</td></tr><tr><td>幂运算（变量指数）</td><td><code>x**y</code></td><td>❌</td><td>一般不可判定</td></tr><tr><td>平方根 / 开方</td><td><code>sqrt(x)</code></td><td>⚠️/❌</td><td>需编码为幂运算</td></tr><tr><td>三角函数</td><td><code>sin(x)</code></td><td>❌</td><td>不支持内置语义</td></tr><tr><td>对数 / 指数函数</td><td><code>log(x)</code> / <code>exp(x)</code></td><td>❌</td><td>不支持内置语义</td></tr><tr><td>其他超越函数</td><td>—</td><td>❌</td><td>不支持</td></tr></tbody></table><h2 id="布尔逻辑运算"><a class="header-anchor" href="#布尔逻辑运算"></a>布尔逻辑运算</h2><p>Z3 支持布尔运算符：与 (<code>And</code>)、或 (<code>Or</code>)、非 (<code>Not</code>)、蕴含 / 充分条件 (<code>Implies</code>)、如果 (<code>If</code>)。双蕴含（即充要条件）使用等号 (<code>==</code>) 表示。</p><h2 id="常-变量表示"><a class="header-anchor" href="#常-变量表示"></a>常 / 变量表示</h2><p>一阶逻辑公式由项（变量或常量）与扩展布尔结构组成。变量在 Z3 中可表示为：</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">x = Int(name = <span class="string">'x'</span>) <span class="comment"># x is an integer</span></span><br><span class="line"></span><br><span class="line">y = Real(name = <span class="string">'y'</span>) <span class="comment"># y is a real number</span></span><br><span class="line"></span><br><span class="line">z = BitVec(name = <span class="string">'z'</span>, bv = <span class="number">32</span>) <span class="comment"># z is a 32-bit vector</span></span><br><span class="line"></span><br><span class="line">p = Bool(name = <span class="string">'p'</span>) <span class="comment"># p is a bool</span></span><br></pre></td></tr></tbody></table></figure><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p>这里可以忽略掉 <code>name</code> 和 <code>bv</code>，直接写参数，如 <code>BitVec('z', 32)</code></p><p>在 Z3 中，<code>Int</code> 类型使用的是<strong>数学</strong>上的 “整数” 概念，这和我们在<strong>计算机</strong>中有范围的 <code>int</code> 类型不一样。如果需要指定类型可以表示的数字大小，请使用 <code>BitVec</code>，如 <code>BitVec('x', 32)</code> 表示一个 32 位位向量，就相当于我们在计算机中使用的 <code>int</code>。</p><p>我们建议，如果想要声明 “整数” 变量，请使用 <code>Int</code> 而不是 <code>BitVec</code> 以避免截断导致的精度问题。</p></div></div><p>整型与实数类型变量之间可以互相进行转换：</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">ToReal(x)</span><br><span class="line"></span><br><span class="line">ToInt(y)</span><br></pre></td></tr></tbody></table></figure><p>Z3 也支持序列的表示：</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">flag = [BitVec(<span class="string">'x%d'</span> % i, <span class="number">8</span>) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">32</span>)] <span class="comment"># a char array, like `char flag[32]` in C</span></span><br><span class="line"></span><br><span class="line">flag = [Int(<span class="string">'%d'</span> % i) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">32</span>)] <span class="comment"># an 'integer' array</span></span><br><span class="line"></span><br><span class="line">flag = [BitVec(<span class="string">'x%d'</span> % i, <span class="number">32</span>) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">32</span>)] <span class="comment"># an int array, like `int flag[32]` in C</span></span><br></pre></td></tr></tbody></table></figure><div class="callout" data-callout="tip"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-flame"><path d="M8.5 14.5A2.5 2.5 0 0 0 11 12c0-1.38-.5-2-1-3-1.072-2.143-.224-4.054 2-6 .5 2.5 2 4.9 4 6.5 2 1.6 3 3.5 3 5.5a7 7 0 1 1-14 0c0-1.153.433-2.294 1-3a2.5 2.5 0 0 0 2.5 2.5z"></path></svg></div><div class="callout-title-inner">Tip</div></div><div class="callout-content"><p><code>BitVec('x%d' % i, 8)</code> 应该这样理解：<code>%d</code> 对应循环计数器 <code>i</code>，本句实际上在创建从 <code>x0</code> 到 <code>x31</code> 的数个 8 位符号位向量。<br>这种方式声明的序列，在添加约束时应该调用 <code>flag[i]</code>，默认输出 <code>x&lt;i&gt; = ...</code></p></div></div><p>对于常量，除了 Python 原有的数据类型外，也可以用 Z3 自己的数据类型表示：</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;&gt;&gt; </span>IntVal(val = <span class="number">114514</span>) <span class="comment"># integer</span></span><br><span class="line"><span class="number">114514</span></span><br><span class="line"></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>RealVal(val = <span class="number">1919810</span>) <span class="comment"># real number</span></span><br><span class="line"><span class="number">1919810</span></span><br><span class="line"></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>BitVecVal(val = <span class="number">1145141919810</span>, bv = <span class="number">32</span>) <span class="comment"># bit vector，自动截断</span></span><br><span class="line"><span class="number">2680619074</span></span><br><span class="line"></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>BitVecVal(val = <span class="number">1145141919810</span>, bv = <span class="number">64</span>) <span class="comment"># bit vector</span></span><br><span class="line"><span class="number">1145141919810</span></span><br></pre></td></tr></tbody></table></figure><p>Z3 中的布尔常量用 <code>True</code> 和 <code>False</code> 表示。</p><h2 id="求解器"><a class="header-anchor" href="#求解器"></a>求解器</h2><p>如果只有公式（约束）较少，那我们调用 <code>solve</code> 方法就好，但有时我们会有大量约束，单行命令易读性就很差了。此时需要创建一个求解器类 <code>Solver</code>，一行一行地将约束添加进去。所以，求解器是<strong>一群约束的集合</strong>。</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">s = Solver()</span><br></pre></td></tr></tbody></table></figure><p>现在我们创建了一个求解器实例 <code>s</code>，需要用 <code>add</code> 方法向这个求解器添加约束：</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">s.add(x * <span class="number">5</span> == <span class="number">10</span>)</span><br><span class="line">s.add(y * <span class="number">1</span>/<span class="number">2</span> == x)</span><br></pre></td></tr></tbody></table></figure><p>添加约束之后，我们可以调用 <code>check</code> 方法检查约束是否可满足 (<strong>sat</strong>isfiable)。如果返回 <code>sat</code> 即为 “可以满足”，<code>unsat</code> 即为 “不可满足”。</p><p>如果约束可以满足，则我们可以调用 <code>model</code> 方法得到一组解。</p><p>如果需要输出结果（包括满足性情况），注意使用 <code>print</code> 函数。</p><div class="callout" data-callout="note"><div class="callout-title"><div class="callout-title-icon"><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-pencil"><path d="M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z"></path><path d="m15 5 4 4"></path></svg></div><div class="callout-title-inner">Note</div></div><div class="callout-content"><p>之前示例中使用的 <code>solve</code> 方法是通过 Z3 求解器 API 实现的。当你调用 <code>solve</code> 时，Z3 会帮你创建一个临时的求解器，将约束传入，检查是否满足并输出结果。可以将 <code>solve</code> 方法简单理解为 <code>check</code>、<code>model</code> 和 <code>print</code> 的一次性封装。</p></div></div><p>一个求解器示例：</p><figure class="highlight python"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> z3 <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">flag = [Int(<span class="string">'s[%d]'</span> % i) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">6</span>)]</span><br><span class="line"></span><br><span class="line">s = Solver()</span><br><span class="line"></span><br><span class="line"><span class="comment"># a1[2] - a1[3] == 0x84A236FFLL</span></span><br><span class="line"><span class="comment">#     &amp;&amp; a1[3] + a1[4] == 0xFA6CB703LL</span></span><br><span class="line"><span class="comment">#     &amp;&amp; a1[2] - a1[4] == 0x42D731A8</span></span><br><span class="line"><span class="comment">#     &amp;&amp; *a1 == 0xDF48EF7E</span></span><br><span class="line"><span class="comment">#     &amp;&amp; a1[5] == 0x84F30420</span></span><br><span class="line"><span class="comment">#     &amp;&amp; a1[1] == 0x20CAACF4</span></span><br><span class="line"></span><br><span class="line">s.add(flag[<span class="number">2</span>] - flag[<span class="number">3</span>] == <span class="number">0x84A236FF</span>)</span><br><span class="line">s.add(flag[<span class="number">3</span>] + flag[<span class="number">4</span>] == <span class="number">0xFA6CB703</span>)</span><br><span class="line">s.add(flag[<span class="number">2</span>] - flag[<span class="number">4</span>] == <span class="number">0x42D731A8</span>)</span><br><span class="line">s.add(flag[<span class="number">0</span>] == <span class="number">0xDF48EF7E</span>)</span><br><span class="line">s.add(flag[<span class="number">5</span>] == <span class="number">0x84F30420</span>)</span><br><span class="line">s.add(flag[<span class="number">1</span>] == <span class="number">0x20CAACF4</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> s.check() == sat:</span><br><span class="line">    m = s.model()</span><br><span class="line">    <span class="built_in">print</span>(m)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">"No solution"</span>)</span><br></pre></td></tr></tbody></table></figure><p>运行后输出：</p><figure class="highlight bash"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">[s[4] = 2652626477,</span><br><span class="line"> s[2] = 3774025685,</span><br><span class="line"> s[0] = 3746099070,</span><br><span class="line"> s[1] = 550153460,</span><br><span class="line"> s[5] = 2230518816,</span><br><span class="line"> s[3] = 1548802262]</span><br></pre></td></tr></tbody></table></figure><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p><a href="https://www.runoob.com/python/python-operators.html">Python 运算符</a> <a href="#fnref1" class="footnote-backref">↩︎</a></p></li></ol></section>]]>
    </content>
    <id>https://watermelonabc.top/p/975d5fe4/</id>
    <link href="https://watermelonabc.top/p/975d5fe4/" rel="alternate"/>
    <published>2025-08-12T10:05:58.000Z</published>
    <summary>我们一起解方程！</summary>
    <title>Z3-Solver 教程</title>
    <updated>2026-08-04T09:53:11.000Z</updated>
  </entry>
</feed>
