<?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-05-11T08:32:33.000Z</updated>
  <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="markdownIt-Anchor" href="#7-x86-汇编语言元素"></a> 7. x86 汇编语言元素</h2><p>现在我们带你讲解一下一个汇编语言程序是怎么写的。x86 汇编语言由<strong>语句</strong> (statement) 构成，一条语句可能有以下元素：</p><h3 id="71-常量整数和常量整数表达式"><a class="markdownIt-Anchor" href="#71-常量整数和常量整数表达式"></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="72-其他常量"><a class="markdownIt-Anchor" href="#72-其他常量"></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><mn>1</mn><msup><mn>0</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="base"><span class="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="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="73-保留字"><a class="markdownIt-Anchor" href="#73-保留字"></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="74-标识符"><a class="markdownIt-Anchor" href="#74-标识符"></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="75-指令"><a class="markdownIt-Anchor" href="#75-指令"></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="76-段式存储"><a class="markdownIt-Anchor" href="#76-段式存储"></a> 7.6 段式存储</h3><p>正如 4.2 所述，x86 处理器底层依然属于段式存储模型。在大部分操作系统上，采用的模型和各位在 C / C++ 学的内存布局是一样的。</p><p>现在这个阶段，需要我们设置的内存段只有 <code>.data</code>（数据段）和 <code>.code</code>（代码段）。</p><h3 id="77-示例-1"><a class="markdownIt-Anchor" href="#77-示例-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="78-数据类型与数据操作"><a class="markdownIt-Anchor" href="#78-数据类型与数据操作"></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></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="79-操作数和寻址方式"><a class="markdownIt-Anchor" href="#79-操作数和寻址方式"></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="710-示例-2"><a class="markdownIt-Anchor" href="#710-示例-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="711-基本运算"><a class="markdownIt-Anchor" href="#711-基本运算"></a> 7.11 基本运算</h3><p>基本运算指令分为算术运算和逻辑运算。所有运算都会同步修改标志寄存器。</p><h4 id="7111-加减运算"><a class="markdownIt-Anchor" href="#7111-加减运算"></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="7112-乘除运算"><a class="markdownIt-Anchor" href="#7112-乘除运算"></a> 7.11.2 乘除运算</h4><h4 id="7113-位运算"><a class="markdownIt-Anchor" href="#7113-位运算"></a> 7.11.3 位运算</h4><h2 id="8-分支与循环程序设计"><a class="markdownIt-Anchor" href="#8-分支与循环程序设计"></a> 8. 分支与循环程序设计</h2><p>默认情况下，CPU 按顺序加载和执行程序。但条件指令会根据 CPU 状态标志的值（<code>Zero</code>、<code>Sign</code>、<code>Carry</code> 等）将控制权转移到程序中的新位置。控制转移分为两种：无条件转移和条件转移。</p><p>循环在这里视为分支，因为它也可以使用条件转移指令实现。</p><h3 id="81-无条件转移"><a class="markdownIt-Anchor" href="#81-无条件转移"></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="82-条件转移"><a class="markdownIt-Anchor" href="#82-条件转移"></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="markdownIt-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="91-运行时栈"><a class="markdownIt-Anchor" href="#91-运行时栈"></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="92-函数调用"><a class="markdownIt-Anchor" href="#92-函数调用"></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="93-保存和恢复寄存器"><a class="markdownIt-Anchor" href="#93-保存和恢复寄存器"></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="94-用栈传递参数"><a class="markdownIt-Anchor" href="#94-用栈传递参数"></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="941-栈帧"><a class="markdownIt-Anchor" href="#941-栈帧"></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="942-栈参数的调用和清理"><a class="markdownIt-Anchor" href="#942-栈参数的调用和清理"></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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20260411002051973.png" alt="AddTwo(5,6)的栈结构"></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="943-调用约定"><a class="markdownIt-Anchor" href="#943-调用约定"></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="95-引用传参的使用"><a class="markdownIt-Anchor" href="#95-引用传参的使用"></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="96-综合示例"><a class="markdownIt-Anchor" href="#96-综合示例"></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="97-局部变量"><a class="markdownIt-Anchor" href="#97-局部变量"></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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20260411013833285.png" alt="MySub()的栈帧"></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="markdownIt-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-05-11T08:32:33.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="markdownIt-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-05-11T08:32:33.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="markdownIt-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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20260315000544252.jpg" alt="Pixel Code Workflow"></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="markdownIt-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-05-11T08:32:33.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;width:100%;"><img class="lazy" src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20260101132018453.png" data-src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20260101132018453.png" alt="和ROIS队友们联机Minecraft" style="width:400px;" onerror="this.src='https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/Fructose-Content-running-medium.gif);"></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;width:100%;"><img class="lazy" src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20260101140431492.jpg" data-src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20260101140431492.jpg" alt="和一位Furry老师的合影，也是跨年夜唯一一张集邮🥲" style="width:250px;" onerror="this.src='https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/Fructose-Content-running-medium.gif);"></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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20260101140201376.png" rel="enclosure" type="image/png"/>
    <published>2025-12-31T14:31:49.000Z</published>
    <summary>也许是2025年总结（负能量致歉！）</summary>
    <title>Hello,2026</title>
    <updated>2026-05-11T08:32:33.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="markdownIt-Anchor" href="#lightsummary"></a> LightSummary</h2><h3 id="基础数据结构"><a class="markdownIt-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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">O</span><span class="mopen">(</span><span class="mop">lo<span style="margin-right:0.01389em;">g</span></span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">N</span></span><span class="mclose">)</span></span></span></span>)，但使用时是排序好的</p><p>堆 (Heap) 是一种二叉树的特例，用数组实现，常用于优先队列 (priority queue)</p><h2 id="实践部分"><a class="markdownIt-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="markdownIt-Anchor" href="#表"></a> 表</h2><h3 id="亚克星上的军队"><a class="markdownIt-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="markdownIt-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="markdownIt-Anchor" href="#队列"></a> 队列</h2><h3 id="rescue-the-princess"><a class="markdownIt-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="markdownIt-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="markdownIt-Anchor" href="#栈"></a> 栈</h2><h3 id="火车"><a class="markdownIt-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="markdownIt-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="markdownIt-Anchor" href="#排序与选择"></a> 排序与选择</h2><h3 id="魔音吉他"><a class="markdownIt-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><mn> 1</mn><msup><mn>0</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="base"><span class="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="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="base"><span class="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> 1</mn><msup><mn>0</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="base"><span class="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="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="base"><span class="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><mn>1</mn><msup><mn>0</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="base"><span class="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="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><mn>1</mn><msup><mn>0</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="base"><span class="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="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="base"><span class="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="markdownIt-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="markdownIt-Anchor" href="#树"></a> 树</h2><h3 id="文件管理器"><a class="markdownIt-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="markdownIt-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="markdownIt-Anchor" href="#散列表"></a> 散列表</h2><h3 id="sins-of-a-solar-empire-p7"><a class="markdownIt-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="markdownIt-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="markdownIt-Anchor" href="#优先队列"></a> 优先队列</h2><h3 id="哈夫曼问题"><a class="markdownIt-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="base"><span class="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="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="base"><span class="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="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="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="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="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="markdownIt-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="markdownIt-Anchor" href="#并查集"></a> 并查集</h2><h3 id="转移炸弹"><a class="markdownIt-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="markdownIt-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="markdownIt-Anchor" href="#图"></a> 图</h2><h3 id="图论难题"><a class="markdownIt-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="base"><span class="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="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="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">N</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.10903em;">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="markdownIt-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="markdownIt-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-05-11T08:32:33.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="markdownIt-Anchor" href="#简答题部分"></a> 简答题部分</h2><p>一题就 5 分，不用多答</p><h3 id="第一章"><a class="markdownIt-Anchor" href="#第一章"></a> 第一章</h3><ol><li>简述当前我国主要矛盾<br>人民日益增长的美好生活需要和不平衡不充分的发展之间的矛盾</li><li>如何理解 “四个全面” 战略布局新内涵<br>“全面建成小康社会、全面深化改革、全面依法治国、全面从严治党”。全面建成小康社会后，又发展出 “全面建设社会主义现代化国家”</li><li>中国共产党的初心使命是什么<br>为中国人民谋幸福，为中华民族谋复兴</li></ol><h3 id="第二章"><a class="markdownIt-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="markdownIt-Anchor" href="#第三章"></a> 第三章</h3><ol><li>简述 “两个拥护” 的内涵<br>坚决维护习近平总书记党中央的核心、全党的核心地位，坚决维护党中央权威和集中统一领导</li><li>如何理解中国共产党在国家政治生活中的领导核心地位<br>在当今中国，没有大于中国共产党的政治力量或其他什么力量。党政军民学，东西南北中，党是领导一切的，是最高的政治领导力量。</li><li>如何理解民主集中制基本原则中第一条的内涵<br>党员个人服从党的组织，少数服从多数，下级组织服从上级组织，全党各个组织和全体党员服从党的全国代表大会和中央委员会</li><li>简述 “四个意识” 的内涵<br>政治意识、大局意识、核心意识、看齐意识</li></ol><h3 id="第四章"><a class="markdownIt-Anchor" href="#第四章"></a> 第四章</h3><ol><li>如何理解 “人民是历史的创造者，是真正的英雄”<br>人民群众是社会物质财富、精神财富的创造者和社会变革的决定性力量</li><li>如何理解 “人民立场”<br>政治立场是一个政党观察、认识、处理政治问题的立足点，反映了这个政党的世界观、方法论和执政理念，体现了这个党的根本属性。人民立场是中国共产党的根本政治立场，是我们党区别于其他政党的显著标志</li><li>如何依靠人民创造历史伟业<br>尊重人民的主体地位，尊重群众的首创精神</li></ol><h3 id="第五章"><a class="markdownIt-Anchor" href="#第五章"></a> 第五章</h3><ol><li>简述全面深化改革的总目标<br>完善和发展中国特色社会主义制度，推进国家治理体系和治理能力现代化</li><li>简述国家治理体系的内涵<br>国家治理体系是在党领导下管理国家的制度体系，包括经济、政治、文化、社会、生态文明和党的建设等各领域体制机制、法律法规安排，也就是一整套紧密相连、相互协调的国家制度</li><li>简述国家治理能力的内涵<br>国家治理能力是运用国家制度管理社会各方面事务的能力，包括改革发展稳定、内政外交国防、治党治国治军等各个方面</li></ol><h3 id="第六章"><a class="markdownIt-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="markdownIt-Anchor" href="#第八章"></a> 第八章</h3><ol><li>简要回答 “全过程人民民主” 的内涵<br>全过程人民民主实现了过程民主和成果民主、程序民主和实质民主、直接民主和间接民主、人民民主和国家意志相统一，是全链条、全方位、全覆盖的民主，是最广泛、最真实、最管用的社会主义民主。</li><li>坚持走中国特色社会主义政治发展道路的三个支点是什么<br>党的领导、人民当家作主、依法治国有机统一</li><li>简述人民当家作主的制度保障<br>人民代表大会制度（根本）；中国共产党领导的多党合作和政治协商制度、民族区域自治制度、基层群众自治制度（基本、重要）</li></ol><h3 id="第十章"><a class="markdownIt-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="markdownIt-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="markdownIt-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="markdownIt-Anchor" href="#第十三章"></a> 第十三章</h3><ol><li>简述国家安全的内涵<br>国家安全是指国家政权、主权、统一和领土完整、人民福祉、经济社会可持续发展和国家其他重大利益相对处于没有危险和不受内外威胁的状态，以及保障持续安全状态的能力</li><li>如何理解政治安全<br>政治安全涉及国家主权、政权、制度和意识形态的稳固，是一个国家最根本的需求，是国家赖以生存和发展的基础条件</li><li>如何理解 “统筹发展与安全”<br>发展是安全的基础和目的，安全是发展的条件和保障，要坚持发展和安全并重</li><li>列举 5 个中国国家安全重点领域<br>国土安全、经济安全、社会安全、网络安全、生物安全、公共卫生安全、外部安全等</li></ol><h3 id="第十六章"><a class="markdownIt-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="markdownIt-Anchor" href="#b3-卷考后回忆版"></a> B3 卷考后回忆版</h2><h3 id="客观题部分"><a class="markdownIt-Anchor" href="#客观题部分"></a> 客观题部分</h3><p>难度不会太大，建议找个同伴齐头复习，随时提问。有些题目的答案甚至会在其他题目的题干中有所呈现。</p><h3 id="简答题部分-2"><a class="markdownIt-Anchor" href="#简答题部分-2"></a> 简答题部分</h3><ol><li>简述 “四个全面” 战略布局新的时代内涵</li><li>如何理解 “人民立场”</li><li>简述国家治理能力的内涵</li><li>如何理解 “统筹发展与安全”</li></ol><h3 id="材料题部分"><a class="markdownIt-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="markdownIt-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-05-11T08:32:33.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="markdownIt-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="markdownIt-Anchor" href="#frida-调试基础"></a> Frida 调试基础</h2><p>两种模式：Spawn（生成）和 Attach（附加）。Spawn 模式是从头启动应用并调试，Attach 模式是在应用运行时才开始调试。</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="markdownIt-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="markdownIt-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="markdownIt-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-05-15T13:59:28.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-05-11T08:32:33.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="markdownIt-Anchor" href="#什么是-vmp"></a> 什么是 VMP</h2><p>VMP 全称是 “基于虚拟机的代码保护技术” (Virtual Machine-Based Protection)。当然，和各位可能听到过的 VMWare 等不太一样，程序保护中的 “虚拟机” 更多像 “解释器”。虚拟机先将原始代码翻译成其自己的专有字节码（这个过程称为虚拟化），然后在运行时解释并执行字节码对应函数。</p><p>这种保护技术的特点是，我们不能直接看到自己可能熟悉的原始指令；相反，我们必须首先分析解释器，然后使用所获得的知识来理解翻译后的专有字节码。</p><h2 id="以一道-ctf-题目为基础"><a class="markdownIt-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-05-11T08:32:33.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="markdownIt-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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251025222838981.png" alt=""></p><blockquote><p>此处 DIE 识别不完全正确。识别为 JAR 的实际依然是 ZIP。</p></blockquote><p>DIE 内置的提取器，选择 Binary 模式，“扫描” 并 “转储全部”：</p><p><img src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251025223036093.png" alt=""></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-05-11T08:32:33.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="markdownIt-Anchor" href="#铜盘校区"></a> 铜盘校区</h2><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="markdownIt-Anchor" href="#旗山校区"></a> 旗山校区</h2><p>最赤石的来哩 🤣</p><p>旗山校区虽然有一个名义上的 “快递服务中心”，但实际上这个 “中心” 实在要打个问号。也许是 “天下大势，分久必合，合久必分”，好几个快递企业选择将它们的服务点搬出快递中心，这就苦了我们这些网购大学生。</p><blockquote><p>还真是 “分久必合，合久必分”，有 ldx 说好几年前快递也是东一个西一个的，后面建了快递中心才集聚起来，现在又分出去了。</p></blockquote><p>旗山有 4 个主要的快递集散点：<strong>快递中心、生活一区 9 号楼邮政、福大学生街驿站（兔喜生活，或者显示在周麻婆后）和筑安商业中心的多多驿站</strong>。由于快递点多且散，建议旗山的同学买一辆电动车。</p><p><strong>德邦</strong>快递在福大<strong>没有固定的服务点</strong>，需要同学自己去生活区大门和快递员取件。一般来讲，快递员会在下午 4:30 ~ 5:00 内到生活区门口，到了会电话通知。就我的体验来讲，如果你下午有第二节大课，那么你<strong>肯定是领不到</strong>了，因为 5:30 人已经下班了（</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"><img class="lazy" src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/FZU-Express-Map-20251208.png" data-src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/FZU-Express-Map-20251208.png" alt="底图来自福州大学校园地图服务系统，使用 GIMP 于 2025/12/08 标注" data-fancybox="true" onerror="this.src='https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/Fructose-Content-running-medium.gif);"></div></div><div class="image-meta"><span class="image-caption center">底图来自福州大学校园地图服务系统，使用 GIMP 于 2025/12/08 标注</span></div></div><h3 id="快递中心"><a class="markdownIt-Anchor" href="#快递中心"></a> 快递中心</h3><blockquote><p>从 2026/01/20 日起，<strong>圆通</strong>迁回快递中心。</p></blockquote><p>位于生活三区 35 号楼后。从两个生活区大门左转沿路直走均可到达。平日营业时间为 9:00 ~ 19:00。有时 19:00 后快递站仍会开放，但此时快递公司人员基本下班，你只能使用自助机器进行取件。</p><p>快递中心驻扎<strong>顺丰、申通、极兔、圆通、京东、菜鸟（天猫超市）</strong>。不同快递企业（甚至同一企业的不同货架区域）有自己的出库机，一般来说你在哪个区域就用哪里的出库机。有些出库机会标明适用于哪些号码的货架。</p><p>一些大件物品（如显示器）可能不在快递中心的室内架，找不到可以问问对应快递企业的工作人员。</p><p>所有出库机都需要扫描快递单条码。一些出库机需要同时使用身份码，请根据机身说明打开对应软件的身份码（淘宝 / 拼多多）</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="markdownIt-Anchor" href="#生活一区-9-号楼邮政"></a> 生活一区 9 号楼邮政</h3><p>位于一区京元食堂背后宿舍楼下沿街铺面。顾名思义，<strong>邮政</strong>的快递都送到这里来。信件自然也在此处寄收。平日营业时间为 9:00 ~ 19:00</p><p>门口有 1 台出库机，需要拼多多身份码。门口的出库机旁边有集中存放明信片的整理箱，直接拿就好。</p><h3 id="福大学生街驿站"><a class="markdownIt-Anchor" href="#福大学生街驿站"></a> 福大学生街驿站</h3><p><strong>中通</strong>驻扎。平日营业时间为 10:00 ~ 17:00</p><p>出库机不需要身份码。</p><h3 id="筑安商业中心的多多驿站"><a class="markdownIt-Anchor" href="#筑安商业中心的多多驿站"></a> 筑安商业中心的多多驿站</h3><p>随着美食广场（现改名为 “筑安商业中心”）进入下一阶段的整修，此驿站开始迁回。</p><p>这个驿站是给<strong>韵达</strong>用的。从四区门口对面的入口直走即可看到驿站。但是四区后门仅限行人通过，骑车建议从旁边高架桥下的道路通过（上面所示蓝色路线），或者从学生街绕（绿色路线）</p><p>入口处有一台出库机，不需要身份码。</p><p><s>最难找的一集！这个驿站是给<strong>韵达</strong>用的，本来是在四区后门出去对面的华联超市里的，但由于超市所在的美食广场在暑期末开始整修，所以驿站又搬迁到了如今的位置。</s></p><p><s>四区后门出去后左转几百米就可以看到了。具体营业时间不明确，但结束时间要比其他快递点晚，21 点也有开。</s></p><p><s>有两台出库机。入口处的仓库的出库机不需要身份码，旁边 60-79 的小仓库的出库机需要 PDD 身份码。两个仓库的出库机不能通用，应该是分成两个驿站了 (Shit!)。</s></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-05-15T13:59:28.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="markdownIt-Anchor" href="#数理逻辑"></a> 数理逻辑</h2><h3 id="命题"><a class="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="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="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="markdownIt-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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span> 为真，否则为假。(AND)</p><p>如果一个命题为假，那么整个合取式固定为假；如果一个命题为真，那么整个合取式的真值取决于另一个命题。</p><h4 id="析取-disjunction"><a class="markdownIt-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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span> 为假, 否则为真。(OR)</p><p>如果一个命题为真，那么整个析取式固定为真；如果一个命题为假，那么整个析取式的真值取决于另一个命题。</p><h4 id="异或-exclusive-or"><a class="markdownIt-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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span> 同时成立的情况，因此也称 “排斥或”。与之相对的，“析取” 也称 “相容或”</p><h4 id="蕴涵-implication"><a class="markdownIt-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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="markdownIt-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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">q</span></span></span></span>，也叫双条件。等价式中的两个命题可以交换。</p><h3 id="命题公式"><a class="markdownIt-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-05-11T08:32:33.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;width:100%;"><img class="lazy" src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251213110901530.png" data-src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251213110901530.png" alt="破防了QAQ" style="width:250px;" onerror="this.src='https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/Fructose-Content-running-medium.gif);"></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="markdownIt-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="markdownIt-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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.10903em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.00773em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">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="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.07153em;">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="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.07153em;">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="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.07153em;">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="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.07153em;">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="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.07153em;">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="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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.00773em;">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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">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="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="base"><span class="strut" style="height:0.7977em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">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="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="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">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="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="base"><span class="strut" style="height:0.9474em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">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="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="base"><span class="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">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="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="base"><span class="strut" style="height:0.9474em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">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="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="base"><span class="strut" style="height:0.9474em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">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="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="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">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="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="base"><span class="strut" style="height:0.9474em;vertical-align:-0.0833em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em;">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="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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">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="base"><span class="strut" style="height:0.1056em;"></span><span class="mord">...</span></span></span></span></span></p><p>第二个等号后面的表示法称为 “按权展开法”。注意十六进制数的按权展开需要将字母换成对应的十进制数</p><h3 id="数制转换"><a class="markdownIt-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="markdownIt-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://githubpage-image.obs.cn-east-3.myhuaweicloud.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="markdownIt-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="base"><span class="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="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="base"><span class="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="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="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="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="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="base"><span class="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="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="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="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="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="base"><span class="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="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="markdownIt-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="base"><span class="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="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="base"><span class="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="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="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="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="base"><span class="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="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="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="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="base"><span class="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="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="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="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="base"><span class="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="base"><span class="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="base"><span class="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="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="markdownIt-Anchor" href="#码制"></a> 码制</h2><p>如果说数制表示数字，那么码制就表示信息。</p><h3 id="bcd-码"><a class="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="markdownIt-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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="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="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">35</span></span></span></span></span></p><h4 id="2-2421-码"><a class="markdownIt-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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="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="base"><span class="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="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="base"><span class="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="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="markdownIt-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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="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="base"><span class="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="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="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="base"><span class="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="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="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="base"><span class="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="markdownIt-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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="markdownIt-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="base"><span class="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.05017em;"> 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="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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.05017em;">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="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.05017em;">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="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.05017em;">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="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.05017em;">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="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.05017em;">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="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="base"><span class="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="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="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="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="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="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="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="base"><span class="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="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="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="base"><span class="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="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="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="markdownIt-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="markdownIt-Anchor" href="#逻辑代数基础"></a> 逻辑代数基础</h2><p>逻辑代数是逻辑电路的数学表达。</p><h3 id="代数系统概述"><a class="markdownIt-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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">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="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="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="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="base"><span class="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="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="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord 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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:1.0833em;"></span><span class="mord 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 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="base"><span class="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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.05017em;">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="base"><span class="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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.05017em;">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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord 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.05017em;">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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord 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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord 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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mclose">)</span></span></span></span></li></ul><h3 id="重要规则"><a class="markdownIt-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="base"><span class="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.05017em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="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.05017em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="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.07153em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.07153em;">BC</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="base"><span class="strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord 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 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 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.05017em;">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 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.07153em;">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="base"><span class="strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord 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 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 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.05017em;">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 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.07153em;">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="base"><span class="strut" style="height:1.0833em;"></span><span class="mord 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 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 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 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.05017em;">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 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 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.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.07153em;">BC</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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.07153em;">BC</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="base"><span class="strut" style="height:1.0833em;"></span><span class="mord 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 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.07153em;">BC</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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.07153em;">BC</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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord 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.02778em;">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.05764em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.13889em;">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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.07153em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord 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.05764em;">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="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord 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.02778em;">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.05764em;">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="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">[</span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord 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.02778em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="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="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="markdownIt-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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.05017em;">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.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:1.0833em;"></span><span class="mord 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 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.05017em;">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="base"><span class="strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord 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 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.05017em;">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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:1.0833em;"></span><span class="mord 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 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 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.05017em;">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="base"><span class="strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord 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 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="base"><span class="strut" style="height:1.0833em;"></span><span class="mord 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 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.05017em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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="base"><span class="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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.05017em;">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.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord 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 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 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.05017em;">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="base"><span class="strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord 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 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="base"><span class="strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord 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 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.05017em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord 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 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.05017em;">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="base"><span class="strut" style="height:1.1667em;vertical-align:-0.0833em;"></span><span class="mord 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 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.05017em;">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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.05017em;">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.07153em;">C</span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord mathnormal">A</span><span class="mord 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.05017em;">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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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 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.05017em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span></span></span></span></p><p>相同为 1，不同为 0。同或可以按位检测二进制是否相等</p><p>同或和异或<strong>既互为相反，又互为对偶</strong>。由于同或可以由异或取反得到，因此实践中通常用异或实现同或。</p><h3 id="逻辑函数表达式"><a class="markdownIt-Anchor" href="#逻辑函数表达式"></a> 逻辑函数表达式</h3><h4 id="基本形式"><a class="markdownIt-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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">A</span><span class="mord 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.05017em;">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.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord 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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mclose">)</span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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.05017em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord 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.07153em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord 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.05017em;">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.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">D</span></span></span></span> 既不属于与 - 或表达式，也不属于或 - 与表达式</p><p>逻辑函数的基本形式是<strong>不唯一</strong>的。</p><h4 id="最小项和最大项"><a class="markdownIt-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="base"><span class="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="base"><span class="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="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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">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="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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">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="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="base"><span class="strut" style="height:0.7806em;vertical-align:-0.15em;"></span><span class="mord 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="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="base"><span class="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.05764em;">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="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="base"><span class="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.10903em;">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="base"><span class="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="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.05764em;">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="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="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="base"><span class="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="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">j</span><span class="mrel mtight"><span class="mord mtight"><span class="mrel mtight">∈</span></span><span class="mord vbox mtight"><span class="thinbox mtight"><span class="llap mtight"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="inner"><span class="mord mtight"><span class="mord mtight">/</span><span class="mspace mtight" style="margin-right:0.0651em;"></span></span></span><span class="fix"></span></span></span></span></span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05764em;">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="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.10903em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">B</span><span class="mord 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.07153em;">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.02778em;">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="base"><span class="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="base"><span class="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="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="base"><span class="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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">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="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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 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.05017em;">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="markdownIt-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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">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="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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.05017em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.05017em;">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.07153em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.05017em;">B</span><span class="mord 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.07153em;">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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord mathnormal">A</span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal">A</span><span class="mord mathnormal" style="margin-right:0.07153em;">BC</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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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.05017em;">B</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord 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.07153em;">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 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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord 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.07153em;">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 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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.05017em;">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="base"><span class="strut" style="height:1.1333em;vertical-align:-0.25em;"></span><span class="mord 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.07153em;">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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em;">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="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="base"><span class="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.10903em;">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="markdownIt-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="base"><span class="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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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="base"><span class="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="markdownIt-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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em;">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"><img class="lazy" src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251215165405655.png" data-src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251215165405655.png" alt="卡诺图画法示例，注意我们写的时候 AB 和 CD 要换过来" onerror="this.src='https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/Fructose-Content-running-medium.gif);"></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="markdownIt-Anchor" href="#集成门电路"></a> 集成门电路</h2><h3 id="电平"><a class="markdownIt-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="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.3669em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></li></ul><h3 id="触发器"><a class="markdownIt-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="base"><span class="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="base"><span class="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="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="base"><span class="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="base"><span class="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="base"><span class="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="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="base"><span class="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="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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord 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.00773em;">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="base"><span class="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="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="base"><span class="strut" style="height:0.9667em;vertical-align:-0.0833em;"></span><span class="mord 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.05764em;">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="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">RQ</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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">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="base"><span class="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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.00773em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">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="base"><span class="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="base"><span class="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="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="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="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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">J</span><span class="mord 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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord 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.07153em;">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="base"><span class="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="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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">T</span><span class="mord 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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord 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.13889em;">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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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="base"><span class="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="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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord 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="base"><span class="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="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="base"><span class="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="markdownIt-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="base"><span class="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="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="base"><span class="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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217203018774.png" alt="RS 触发器的状态图"></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="base"><span class="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="base"><span class="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="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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217203138816.png" alt="RS 触发器的时间图"></p><h3 id="有限状态机"><a class="markdownIt-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="markdownIt-Anchor" href="#组合逻辑电路"></a> 组合逻辑电路</h2><p>输出仅取决于该时刻的输入，而与过去的输入值无关，没有反馈回路。</p><h3 id="分析组合电路的步骤"><a class="markdownIt-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="markdownIt-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="markdownIt-Anchor" href="#设计过程中的几个问题"></a> 设计过程中的几个问题</h3><h4 id="无关项"><a class="markdownIt-Anchor" href="#无关项"></a> 无关项</h4><p>如果输入变量的某些取值组合不会出现或者对这些组合的输出不关心，则称这些输入项为无关项，用 X 或 d 表示</p><p>在卡诺图化简中，这些无关项的取值可 1 可 0，因此可以灵活选择以符合 “卡诺圈面积尽量大” 的规则</p><h4 id="多输出函数"><a class="markdownIt-Anchor" href="#多输出函数"></a> 多输出函数</h4><p>能掌握掌握，不能掌握可以不用，这是锦上添花的做法</p><h4 id="不提供反变量"><a class="markdownIt-Anchor" href="#不提供反变量"></a> 不提供反变量</h4><p>最直接的做法就是接一个非门，但设计结果往往不经济，因此不提供反变量也意味着使用最少的非门（或不使用）。具体怎么实现看题目有没有限制逻辑门使用。</p><p>没有一种系统而有效的方法以设计出不提供反变量的最简电路，因此灵活处理即可</p><h2 id="中规模组合逻辑电路"><a class="markdownIt-Anchor" href="#中规模组合逻辑电路"></a> 中规模组合逻辑电路</h2><p>中规模组合逻辑电路主要有以下种类芯片：加法器、译码器、数据选择器</p><h3 id="加法器"><a class="markdownIt-Anchor" href="#加法器"></a> 加法器</h3><p>加法器分为半加器和全加器。半加器不考虑来自低位的进位，而全加器需要考虑来自低位的进位。</p><h4 id="半加器"><a class="markdownIt-Anchor" href="#半加器"></a> 半加器</h4><p><img src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217094447136.png" alt="半加器"></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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">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="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="base"><span class="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="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="base"><span class="strut" style="height:0.8778em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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.07153em;">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="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="base"><span class="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="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.05017em;">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="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="markdownIt-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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">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="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;width:100%;"><img class="lazy" src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217094622744.png" data-src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217094622744.png" alt="全加器的构成方法" style="width:300px;" onerror="this.src='https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/image-error-cat.webp'"><div class="lazy-icon" style="background-image:url(https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/Fructose-Content-running-medium.gif);"></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="markdownIt-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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217094841898.png" alt="74283 芯片符号"></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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">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="base"><span class="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">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="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="base"><span class="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="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="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="base"><span class="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="base"><span class="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="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="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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="base"><span class="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05017em;">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="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="base"><span class="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="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="markdownIt-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="base"><span class="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="base"><span class="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="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="base"><span class="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="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="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="base"><span class="strut" style="height:0.9806em;vertical-align:-0.15em;"></span><span class="mord 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 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="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 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="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 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="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 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="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="markdownIt-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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">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="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="base"><span class="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="base"><span class="strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord 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.05764em;">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="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="base"><span class="strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord 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.05764em;">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="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="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时，译码器才正常工作</p><p><img src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217095057808.png" alt="74138"></p><h4 id="74139"><a class="markdownIt-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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.05764em;">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="base"><span class="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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217094951081.png" alt="74139"></p><h4 id="译码器的扩展"><a class="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="markdownIt-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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">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="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="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.05017em;">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="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.07153em;">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="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="base"><span class="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.07153em;">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="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="base"><span class="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="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.05017em;">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="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.07153em;">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="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="base"><span class="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="markdownIt-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="base"><span class="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="base"><span class="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="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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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="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="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="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.02778em;">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="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="base"><span class="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="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="markdownIt-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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.05764em;">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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217095323946.png" alt="74153"></p><p>实际应用时会将两个四选一 MUX 合并成一个 74153</p><h4 id="74151"><a class="markdownIt-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="base"><span class="strut" style="height:0.8833em;"></span><span class="mord 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.05764em;">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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217095403515.png" alt="74151"></p><h4 id="数据选择器的扩展"><a class="markdownIt-Anchor" href="#数据选择器的扩展"></a> 数据选择器的扩展</h4><p>用 2 个 4 选 1 构成一个 8 选 1，用 2 个 8 选 1 构成一个 16 选 1</p><h4 id="函数发生-2"><a class="markdownIt-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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">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="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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 变量的函数发生（有一个变量可以接到数据端）</p><h2 id="时序逻辑电路"><a class="markdownIt-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="base"><span class="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="base"><span class="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="markdownIt-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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">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="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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="strut" style="height:1.0641em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">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="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.07153em;">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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">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="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="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="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="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="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="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="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="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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217203831925.png" alt="模 4 可逆计数器 A"></p><p>Moore 型电路的状态转换图：</p><p><img src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217203648040.png" alt="模 4 可逆计数器 B"></p><p>简化得到转换图，只表示状态转换顺序</p><p><img src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217204054905.png" alt="模 8 计数器"></p><ol start="4"><li>时间图（工作波形图）</li></ol><p>状态转移在一定时间内的连续变化。按照触发方式和功能表确定判决时刻线，在时刻线上判断输出变化，其它时刻保持不变</p><p><img src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217204139632.png" alt="模 4 可逆计数器 B 的时间图"></p><h3 id="分析方法"><a class="markdownIt-Anchor" href="#分析方法"></a> 分析方法</h3><h4 id="表格分析法"><a class="markdownIt-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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.09618em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:1.0085em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">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="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="markdownIt-Anchor" href="#代数分析法"></a> 代数分析法</h4><ol><li>确定电路类型</li><li>写出输出函数表达式和激励函数表达式</li><li>将激励函数表达式代入触发器的次态方程，得到电路的次态方程</li><li>由次态方程和输出函数表达式，作出状态图和状态表</li><li>画出时序图和时间图，文字说明电路逻辑功能</li></ol><h3 id="设计方法"><a class="markdownIt-Anchor" href="#设计方法"></a> 设计方法</h3><p>小规模同步时序逻辑电路主要设计计数器和序列检测器。触发器一般使用 JK 触发器</p><h4 id="计数器"><a class="markdownIt-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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">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="base"><span class="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="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">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="base"><span class="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="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">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="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="base"><span class="strut" style="height:0.8917em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">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="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="markdownIt-Anchor" href="#序列检测器"></a> 序列检测器</h4><p>序列检测器用于检测是否连续输入某个序列。</p><ol><li>建立原始状态图、原始状态表。原始状态图和原始状态表均只讨论题目明确说明的有效状态</li><li>状态化简。合并等价状态。</li><li>状态编码。根据化简后的状态数量确定触发器数量，进而确定每个状态要用几位编码。状态编码根据格雷码排序，需要讨论无效状态</li><li>求驱动方程和输出方程</li><li>画电路图</li><li>检查自启动特性</li></ol><h4 id="状态化简"><a class="markdownIt-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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">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="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="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">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="base"><span class="strut" style="height:0.9694em;vertical-align:-0.2861em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em;">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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em;">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="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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217095538913.png" alt="隐含表"></p><h2 id="中规模时序逻辑电路"><a class="markdownIt-Anchor" href="#中规模时序逻辑电路"></a> 中规模时序逻辑电路</h2><p>中规模组合逻辑电路主要有以下种类芯片：计数器和寄存器</p><h3 id="同步计数器"><a class="markdownIt-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="base"><span class="strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord 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.07153em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord 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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">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="base"><span class="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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">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="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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217095700178.png" alt="74161"></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="base"><span class="strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord 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.07153em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord 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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.13889em;">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="base"><span class="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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="base"><span class="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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">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="base"><span class="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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">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="base"><span class="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="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="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></p><h4 id="构成小于十六进制的计数器"><a class="markdownIt-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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">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="base"><span class="strut" style="height:0.7667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">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="base"><span class="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="base"><span class="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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">M</span></span></span></span> 个状态且没有毛刺</p><p>如果预置数为 0，那么计数从 0 → M 循环；预置数为 (16 - M)，那么计数从预置数 → M 循环</p><h4 id="构成大于十六进制的计数器"><a class="markdownIt-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="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">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="base"><span class="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="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="base"><span class="strut" style="height:0.82em;vertical-align:-0.1367em;"></span><span class="mord mathnormal" style="margin-right:0.10903em;">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="base"><span class="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="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="base"><span class="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="base"><span class="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.03148em;">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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.6944em;"></span><span class="mord">4</span><span class="mord mathnormal" style="margin-right:0.03148em;">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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:1.0333em;vertical-align:-0.15em;"></span><span class="mord 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.02778em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">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="markdownIt-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="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.7519em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217004626008.png" alt="7490 芯片电路符号"></p><p><img src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217004845680.png" alt="7490 芯片逻辑功能表"></p><h4 id="按指定码制构成十进制计数器"><a class="markdownIt-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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">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="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="base"><span class="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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">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="base"><span class="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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">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="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="markdownIt-Anchor" href="#实现-10-以内-m-进制计数器"></a> 实现 10 以内 M 进制计数器</h4><p>把 M 进制对应的输出端为 1 的输出相与后反馈到清零端，作为计数满整清零信号</p><h4 id="实现-11-100-的-m-进制计数器"><a class="markdownIt-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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="base"><span class="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="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="base"><span class="strut" style="height:0.8333em;vertical-align:-0.15em;"></span><span class="mord mathnormal" style="margin-right:0.07153em;">C</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em;">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="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="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 进制计数器。</p><p>计数器的计数输出需要翻译为 1 位二进制，可以使用基本逻辑门实现</p><p><img src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251218124702237.png" alt="0101101 序列发生器"></p><p>或者将计数器输出引入译码器（74138）或数据选择器（74151）。</p><p>如果使用译码器，则把 “序列输出 F 为 1 的那些状态” 找出来，用译码器把这些状态 “识别” 出来，然后把识别结果 “与非” 在一起。</p><p><img src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251218000449635.png" alt="11000101 序列发生器"></p><p>如果使用数据选择器，则数据选择器的数据输入端设置为指定的序列值</p><p><img src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251218000810449.png" alt="011101 序列发生器"></p><h3 id="寄存器"><a class="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="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="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="base"><span class="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="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="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="base"><span class="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="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="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="base"><span class="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="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="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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251217094024220.png" alt="74194 芯片电路符号"></p><blockquote><p>这个芯片比较难 QAQ</p></blockquote><h3 id="环形和扭环形计数器"><a class="markdownIt-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="base"><span class="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="base"><span class="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="base"><span class="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="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="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="base"><span class="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="markdownIt-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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord 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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord 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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord 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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord 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="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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord 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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">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="base"><span class="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="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="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="base"><span class="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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord 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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.07153em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">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="base"><span class="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="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="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="base"><span class="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="base"><span class="strut" style="height:1.0778em;vertical-align:-0.1944em;"></span><span class="mord 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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02778em;">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="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05017em;">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="base"><span class="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="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="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="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">6</span></span></span></span> 计数</li></ul><h3 id="脉冲型序列发生器"><a class="markdownIt-Anchor" href="#脉冲型序列发生器"></a> 脉冲型序列发生器</h3><p>先设置左移右移，然后设计反馈电路</p><p><img src="https://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/20251218130455641.png" alt="10110 序列发生器"></p><hr><h2 id="实验提示"><a class="markdownIt-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-05-13T17:24:54.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="markdownIt-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://githubpage-image.obs.cn-east-3.myhuaweicloud.com/img/Snipaste_2025-09-07_00-13-42.png" alt="dnSpy截图"></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-05-11T08:32:33.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://githubpage-image.obs.cn-east-3.myhuaweicloud.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="markdownIt-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="markdownIt-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="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="markdownIt-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="markdownIt-Anchor" href="#magisk"></a> Magisk</h2><p>Magisk 在刷机界大名鼎鼎，适配性比较好（支持 Android 5.0+）。本次我们选择的是官方 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 可能无法安装 KernelUS 系。Magisk 系是更稳妥的选择。</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://githubpage-image.obs.cn-east-3.myhuaweicloud.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-05-11T08:32:33.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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">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="base"><span class="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="base"><span class="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="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">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="base"><span class="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="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">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="markdownIt-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="markdownIt-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="markdownIt-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="markdownIt-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="markdownIt-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="markdownIt-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-05-11T08:32:33.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/"/>
    <content>
      <![CDATA[<p>在做 BUUCTF 上的 [2019 红帽杯] easyRE 时，出题人将我引导进了一篇看雪的文章：<a href="https://bbs.kanxue.com/thread-254172.htm">[原创] 看雪 CTF 从入门到存活（六）主动防御</a>。由于时过境迁，评论区已经给出了正确的 flag，但在 2019 年的评论中，我们依然能体会到当时参赛者们满头问号的感受。这样一篇高视角的理论文章，到底对解题有多大作用呢？</p><p>实际上，出题人就是以该文章的理念设计了这么一道题目。</p><h2 id="什么是主动防御"><a class="markdownIt-Anchor" href="#什么是主动防御"></a> 什么是 “主动防御”</h2><p>在初期我们做的 CTF 题目中，出题人都是将 flag 获取逻辑放在一个函数中，然后设置障碍，我们称为 “被动防御”。虽然这些障碍可能难以跨越，但参赛者心中都有一条明确的思路：只要越过这些障碍，就能得到 flag。</p><p>与之相对的 “主动防御”，是指将参赛者引导到一条无法获取正确 flag 的路径。这条路径同样有一些障碍，参赛者往往会错判预期，认为只需要跨过这些障碍，就可以得到 flag，结果却折服于出题人的小巧思。</p><p>主动防御基于过程激励理论，该理论又有三大理论：期望理论、公平理论和强化理论。总结起来就是让参赛者认为 “此路可通” 并不断强化这种信念。</p><p>这本身需要出题人有一定水平，可以合理安排真假线索。</p><h2 id="示例"><a class="markdownIt-Anchor" href="#示例"></a> 示例</h2><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><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></pre></td><td class="code"><pre><span class="line">__int64 <span class="title function_">sub_4009C6</span><span class="params">()</span></span><br><span class="line">{</span><br><span class="line">  __int64 result; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">int</span> i; <span class="comment">// [rsp+Ch] [rbp-114h]</span></span><br><span class="line">  __int64 v2; <span class="comment">// [rsp+10h] [rbp-110h]</span></span><br><span class="line">  __int64 v3; <span class="comment">// [rsp+18h] [rbp-108h]</span></span><br><span class="line">  __int64 v4; <span class="comment">// [rsp+20h] [rbp-100h]</span></span><br><span class="line">  __int64 v5; <span class="comment">// [rsp+28h] [rbp-F8h]</span></span><br><span class="line">  __int64 v6; <span class="comment">// [rsp+30h] [rbp-F0h]</span></span><br><span class="line">  __int64 v7; <span class="comment">// [rsp+38h] [rbp-E8h]</span></span><br><span class="line">  __int64 v8; <span class="comment">// [rsp+40h] [rbp-E0h]</span></span><br><span class="line">  __int64 v9; <span class="comment">// [rsp+48h] [rbp-D8h]</span></span><br><span class="line">  __int64 v10; <span class="comment">// [rsp+50h] [rbp-D0h]</span></span><br><span class="line">  __int64 v11; <span class="comment">// [rsp+58h] [rbp-C8h]</span></span><br><span class="line">  _BYTE key[<span class="number">13</span>]; <span class="comment">// [rsp+60h] [rbp-C0h] BYREF</span></span><br><span class="line">  _BYTE key1[<span class="number">4</span>]; <span class="comment">// [rsp+6Dh] [rbp-B3h] BYREF</span></span><br><span class="line">  _BYTE key2[<span class="number">19</span>]; <span class="comment">// [rsp+71h] [rbp-AFh] BYREF</span></span><br><span class="line">  _QWORD buf[<span class="number">5</span>]; <span class="comment">// [rsp+90h] [rbp-90h] BYREF</span></span><br><span class="line">  _QWORD buf_1[<span class="number">8</span>]; <span class="comment">// [rsp+C0h] [rbp-60h] BYREF</span></span><br><span class="line">  <span class="type">char</span> v17; <span class="comment">// [rsp+100h] [rbp-20h]</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v18; <span class="comment">// [rsp+108h] [rbp-18h]</span></span><br><span class="line"></span><br><span class="line">  v18 = __readfsqword(<span class="number">0x28u</span>);</span><br><span class="line">  qmemcpy(key, <span class="string">"Iodl&gt;Qnb(ocy"</span>, <span class="number">12</span>);</span><br><span class="line">  key[<span class="number">12</span>] = <span class="number">127</span>;</span><br><span class="line">  qmemcpy(key1, <span class="string">"y.i"</span>, <span class="number">3</span>);</span><br><span class="line">  key1[<span class="number">3</span>] = <span class="number">127</span>;</span><br><span class="line">  qmemcpy(key2, <span class="string">"d`3w}wek9{iy=~yL@EC"</span>, <span class="keyword">sizeof</span>(key2));</span><br><span class="line">  <span class="built_in">memset</span>(buf, <span class="number">0</span>, <span class="number">37</span>);</span><br><span class="line">  bufRead(<span class="number">0</span>, buf, <span class="number">37</span>);</span><br><span class="line">  BYTE4(buf[<span class="number">4</span>]) = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">if</span> ( bufLength(buf) == <span class="number">36</span> )</span><br><span class="line">  {</span><br><span class="line">    <span class="keyword">for</span> ( i = <span class="number">0</span>; i &lt; bufLength(buf); ++i )</span><br><span class="line">    {</span><br><span class="line">      <span class="keyword">if</span> ( (*(buf + i) ^ i) != key[i] )         <span class="comment">// key = key + key1 + key2</span></span><br><span class="line">      {</span><br><span class="line">        result = <span class="number">4294967294LL</span>;</span><br><span class="line">        <span class="keyword">goto</span> LABEL_13;</span><br><span class="line">      }</span><br><span class="line">    }</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">"continue!"</span>);</span><br><span class="line">    <span class="built_in">memset</span>(buf_1, <span class="number">0</span>, <span class="keyword">sizeof</span>(buf_1));</span><br><span class="line">    v17 = <span class="number">0</span>;</span><br><span class="line">    bufRead(<span class="number">0</span>, buf_1, <span class="number">64</span>);</span><br><span class="line">    HIBYTE(buf_1[<span class="number">4</span>]) = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">if</span> ( bufLength(buf_1) == <span class="number">39</span> )</span><br><span class="line">    {</span><br><span class="line">      v2 = base64Encode(buf_1);</span><br><span class="line">      v3 = base64Encode(v2);</span><br><span class="line">      v4 = base64Encode(v3);</span><br><span class="line">      v5 = base64Encode(v4);</span><br><span class="line">      v6 = base64Encode(v5);</span><br><span class="line">      v7 = base64Encode(v6);</span><br><span class="line">      v8 = base64Encode(v7);</span><br><span class="line">      v9 = base64Encode(v8);</span><br><span class="line">      v10 = base64Encode(v9);</span><br><span class="line">      v11 = base64Encode(v10);</span><br><span class="line">      <span class="keyword">if</span> ( !flagCmp(v11, fakeFlag) )</span><br><span class="line">      <span class="comment">/*</span></span><br><span class="line"><span class="comment">      fakeFlag = "Vm0wd2VHUXhTWGhpUm1SWVYwZDRWVll3Wkc5WFJsbDNXa1pPVlUxV2NIcFhhMk0xVmpKS1NHVkdXbFpOYmtKVVZtcEtTMUl5VGtsaVJtUk9ZV3hhZVZadGVHdFRNVTVYVW01T2FGSnRVbGhhVjNoaFZWWmtWMXBFVWxSTmJFcElWbTAxVDJGV1NuTlhia0pXWWxob1dGUnJXbXRXTVZaeVdrWm9hVlpyV1hwV1IzaGhXVmRHVjFOdVVsWmlhMHBZV1ZSR1lWZEdVbFZTYlhSWFRWWndNRlZ0TVc5VWJGcFZWbXR3VjJKSFVYZFdha1pXWlZaT2NtRkhhRk5pVjJoWVYxZDBhMVV3TlhOalJscFlZbGhTY1ZsclduZGxiR1J5VmxSR1ZXSlZjRWhaTUZKaFZqSktWVkZZYUZkV1JWcFlWV3BHYTFkWFRrZFRiV3hvVFVoQ1dsWXhaRFJpTWtsM1RVaG9hbEpYYUhOVmJUVkRZekZhY1ZKcmRGTk5Wa3A2VjJ0U1ExWlhTbFpqUldoYVRVWndkbFpxUmtwbGJVWklZVVprYUdFeGNHOVhXSEJIWkRGS2RGSnJhR2hTYXpWdlZGVm9RMlJzV25STldHUlZUVlpXTlZadE5VOVdiVXBJVld4c1dtSllUWGhXTUZwell6RmFkRkpzVWxOaVNFSktWa1phVTFFeFduUlRhMlJxVWxad1YxWnRlRXRXTVZaSFVsUnNVVlZVTURrPQ=="</span></span><br><span class="line"><span class="comment">      */</span></span><br><span class="line">      {</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">"You found me!!!"</span>);</span><br><span class="line">        <span class="built_in">puts</span>(<span class="string">"bye bye~"</span>);</span><br><span class="line">      }</span><br><span class="line">      result = <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">      result = <span class="number">4294967293LL</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">    result = <span class="number">0xFFFFFFFFL</span>L;</span><br><span class="line">  }</span><br><span class="line">LABEL_13:</span><br><span class="line">  <span class="keyword">if</span> ( __readfsqword(<span class="number">0x28u</span>) != v18 )</span><br><span class="line">    StackErrorexit();</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>对 fakeFlag 进行十次 Base64 解码会得到我们所说的网址。但不是我们想要的 flag。</p><p>然而，在 fakeFlag 的下方，还有一串没有被使用的常量：</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></pre></td><td class="code"><pre><span class="line"><span class="symbol">.data:</span>00000000006CC0A0     <span class="comment">; char byte_6CC0A0[3]</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0A0     byte_6CC0A0     <span class="built_in">db</span> <span class="number">40h</span>                  <span class="comment">; DATA XREF: sub_400D35+95↑r</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0A0                                             <span class="comment">; sub_400D35+C1↑r</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0A1                     <span class="built_in">db</span>  <span class="number">35h</span> <span class="comment">; 5</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0A2                     <span class="built_in">db</span>  <span class="number">20h</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0A3     byte_6CC0A3     <span class="built_in">db</span> <span class="number">56h</span>                  <span class="comment">; DATA XREF: sub_400D35+A6↑r</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0A4                     <span class="built_in">db</span>  <span class="number">5Dh</span> <span class="comment">; ]</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0A5                     <span class="built_in">db</span>  <span class="number">18h</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0A6                     <span class="built_in">db</span>  <span class="number">22h</span> <span class="comment">; "</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0A7                     <span class="built_in">db</span>  <span class="number">45h</span> <span class="comment">; E</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0A8                     <span class="built_in">db</span>  <span class="number">17h</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0A9                     <span class="built_in">db</span>  <span class="number">2Fh</span> <span class="comment">; /</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0AA                     <span class="built_in">db</span>  <span class="number">24h</span> <span class="comment">; $</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0AB                     <span class="built_in">db</span>  <span class="number">6Eh</span> <span class="comment">; n</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0AC                     <span class="built_in">db</span>  <span class="number">62h</span> <span class="comment">; b</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0AD                     <span class="built_in">db</span>  <span class="number">3Ch</span> <span class="comment">; &lt;</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0AE                     <span class="built_in">db</span>  <span class="number">27h</span> <span class="comment">; '</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0AF                     <span class="built_in">db</span>  <span class="number">54h</span> <span class="comment">; T</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0B0                     <span class="built_in">db</span>  <span class="number">48h</span> <span class="comment">; H</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0B1                     <span class="built_in">db</span>  <span class="number">6Ch</span> <span class="comment">; l</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0B2                     <span class="built_in">db</span>  <span class="number">24h</span> <span class="comment">; $</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0B3                     <span class="built_in">db</span>  <span class="number">6Eh</span> <span class="comment">; n</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0B4                     <span class="built_in">db</span>  <span class="number">72h</span> <span class="comment">; r</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0B5                     <span class="built_in">db</span>  <span class="number">3Ch</span> <span class="comment">; &lt;</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0B6                     <span class="built_in">db</span>  <span class="number">32h</span> <span class="comment">; 2</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0B7                     <span class="built_in">db</span>  <span class="number">45h</span> <span class="comment">; E</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0B8                     <span class="built_in">db</span>  <span class="number">5Bh</span> <span class="comment">; [</span></span><br><span class="line"><span class="symbol">.data:</span>00000000006CC0B9                     <span class="built_in">db</span>    <span class="number">0</span></span><br></pre></td></tr></tbody></table></figure><p>通过查询 <code>byte_6CC0A0</code> 的交叉引用，我们发现它被函数 <code>sub_400D35()</code> 使用了。分析该函数会发现 <code>byte_6CC0A3</code> 其实也属于 <code>byte_6CC0A0</code>，于是进行修复，得到最终的函数：</p><figure class="highlight c"><figcaption><span>sub_400D35()</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></pre></td><td class="code"><pre><span class="line"><span class="type">unsigned</span> __int64 __fastcall <span class="title function_">sub_400D35</span><span class="params">(__int64 a1, __int64 a2)</span></span><br><span class="line">{</span><br><span class="line">  <span class="type">unsigned</span> __int64 result; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v3; <span class="comment">// [rsp+Ch] [rbp-24h]</span></span><br><span class="line">  <span class="type">int</span> i; <span class="comment">// [rsp+10h] [rbp-20h]</span></span><br><span class="line">  <span class="type">int</span> j; <span class="comment">// [rsp+14h] [rbp-1Ch]</span></span><br><span class="line">  <span class="type">unsigned</span> <span class="type">int</span> v6; <span class="comment">// [rsp+24h] [rbp-Ch]</span></span><br><span class="line">  <span class="type">unsigned</span> __int64 v7; <span class="comment">// [rsp+28h] [rbp-8h]</span></span><br><span class="line"></span><br><span class="line">  v7 = __readfsqword(<span class="number">0x28u</span>);</span><br><span class="line">  v3 = sub_43FD20(<span class="number">0</span>) - qword_6CEE38;</span><br><span class="line">  <span class="keyword">for</span> ( i = <span class="number">0</span>; i &lt;= <span class="number">1233</span>; ++i )</span><br><span class="line">  {</span><br><span class="line">    sub_40F790(v3);</span><br><span class="line">    sub_40FE60();</span><br><span class="line">    sub_40FE60();</span><br><span class="line">    v3 = sub_40FE60() ^ <span class="number">0x98765432</span>;</span><br><span class="line">  }</span><br><span class="line">  v6 = v3;</span><br><span class="line">  <span class="keyword">if</span> ( (v3 ^ realFlag[<span class="number">0</span>]) == <span class="string">'f'</span> &amp;&amp; (HIBYTE(v6) ^ realFlag[<span class="number">3</span>]) == <span class="string">'g'</span> )</span><br><span class="line">  {</span><br><span class="line">    <span class="keyword">for</span> ( j = <span class="number">0</span>; j &lt;= <span class="number">24</span>; ++j )</span><br><span class="line">      sub_410E90(realFlag[j] ^ *(&amp;v6 + j % <span class="number">4</span>));</span><br><span class="line">  }</span><br><span class="line">  result = __readfsqword(<span class="number">0x28u</span>) ^ v7;</span><br><span class="line">  <span class="keyword">if</span> ( result )</span><br><span class="line">    StackErrorexit();</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>循环 1 生成随机值 <code>v3</code>，然后赋值给 <code>v6</code>。接下来是一个判断，<code>v3</code>（取低位的 1 字节）和 <code>realFlag</code> 的第一个字符进行异或后等于 <code>f</code> 且 <code>v6</code> 取高位的 1 字节和 <code>realFlag</code> 的第四个字符进行异或后得到 <code>g</code>，则进入第 2 个循环，将 <code>realFlag</code> 和 <code>v6</code> 异或得到 <code>flag</code>。</p><p>因此我们需要得到符合条件的 <code>v6</code>。根据进入循环 2 的条件，我们可以将 <code>flag</code> 和 <code>realFlag</code> 的前四个元素进行异或，得到正确的 <code>v6</code>，然后用 <code>v6</code> 和 <code>realFlag</code> 异或得到 flag。</p><figure class="highlight py"><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">cipher = [<span class="number">0x40</span>, <span class="number">0x35</span>, <span class="number">0x20</span>, <span class="number">0x56</span>, <span class="number">0x5D</span>, <span class="number">0x18</span>, <span class="number">0x22</span>, <span class="number">0x45</span>, <span class="number">0x17</span>, <span class="number">0x2F</span>, <span class="number">0x24</span>, <span class="number">0x6E</span>, <span class="number">0x62</span>, <span class="number">0x3C</span>, <span class="number">0x27</span>, <span class="number">0x54</span>, <span class="number">0x48</span>, <span class="number">0x6C</span>, <span class="number">0x24</span>, <span class="number">0x6E</span>, <span class="number">0x72</span>, <span class="number">0x3C</span>, <span class="number">0x32</span>, <span class="number">0x45</span>, <span class="number">0x5B</span>]</span><br><span class="line">key = [<span class="number">0x40</span>^<span class="built_in">ord</span>(<span class="string">'f'</span>),<span class="number">0x35</span>^<span class="built_in">ord</span>(<span class="string">'l'</span>),<span class="number">0x20</span>^<span class="built_in">ord</span>(<span class="string">'a'</span>),<span class="number">0x56</span>^<span class="built_in">ord</span>(<span class="string">'g'</span>)]</span><br><span class="line">flag = <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="built_in">len</span>(cipher)):</span><br><span class="line">    flag += <span class="built_in">chr</span>(cipher[i]^(key[i%<span class="number">4</span>]))</span><br><span class="line"><span class="built_in">print</span>(flag)</span><br><span class="line"><span class="comment"># flag{Act1ve_Defen5e_Test}</span></span><br></pre></td></tr></tbody></table></figure><p>题做完了，不过我们还想看一下出题人是怎么把这个函数埋入程序执行流程中的。</p><p>查询 <code>sub_400D35()</code> 的交叉引用，会发现这个函数是存放于 <code>.fini_array</code> 中的。在程序启动流程中，<code>main</code> 函数返回之后便会执行 <code>__libc_csu_fini()</code> 函数，静态编译下该函数会按降序取出 <code>.fini_array</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>_fini_array</code> 是一个特殊的 ELF 符号数组，用于存储在程序或共享对象的终止（清理）阶段将要执行的终止函数的地址。运行时的链接器 / 加载器会在程序或共享对象终止时依次调用这些函数，以完成清理工作。<code>_fini_array</code> 是 ELF 文件中的一部分，属于特殊的节 (section) 之一。这些特殊节在程序执行过程中具有特定的目的和执行顺序。</p></div></div><p>在 C 程序中，可以通过 <code>__attribute__((destructor))</code> 指定一个函数在程序退出时执行，这些函数的地址会被放入 <code>.fini_array</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><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></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">void</span> <span class="title function_">cleanup</span><span class="params">()</span> __<span class="title function_">attribute__</span><span class="params">((destructor))</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">void</span> <span class="title function_">cleanup</span><span class="params">()</span> {</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Program is exiting. Cleaning up resources...\n"</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> {</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Hello, World!\n"</span>);</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>这个题目属于 “可执行代码段中没有被显式 <code>CALL</code> 的函数”，是准确反汇编的主要障碍之一。<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> 很显然，大量选手（包括我哈）都缺乏应对这类题的经验。在我<s>耻辱下播</s>查阅 WP 时，有相当数量的作者说自己没有想到这一点，只能参考别人的 WP。</p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p><a href="https://static.usenix.org/publications/library/proceedings/usenix03/tech/full_papers/prasad/prasad_html/node5.html">Disassembly Challenges</a> <a href="#fnref1" class="footnote-backref">↩︎</a></p></li></ol></section>]]>
    </content>
    <id>https://watermelonabc.top/p/5322af08/</id>
    <link href="https://watermelonabc.top/p/5322af08/" rel="alternate"/>
    <published>2025-07-27T03:06:07.000Z</published>
    <summary>CTF是一场游戏，设计者们想达成的便是让游玩者不自觉地进入错误的道路</summary>
    <title>出题人的 “恶意”</title>
    <updated>2026-05-11T08:32:33.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="CPP" scheme="https://watermelonabc.top/tags/CPP/"/>
    <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">Base Video</div></div><div class="callout-content"><p><a href="https://www.youtube.com/watch?v=nAbCKa0FzjQ">C++Now 2018 - Matt Godbolt “What Else Has My Compiler Done For Me Lately”</a></p></div></div><h2 id="backstory"><a class="markdownIt-Anchor" href="#backstory"></a> Backstory</h2><p>考虑一下不同代码写法会不会影响性能？例如：</p><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>写法 A</p><div class="tag-plugin colorful note" color="blue" child="codeblock"><div class="body"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> <span class="title">sum</span><span class="params">(<span class="type">const</span> std::vector&lt;<span class="type">int</span>&gt; &amp;v)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">  <span class="type">int</span> result = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">for</span>(<span class="type">size_t</span> i = <span class="number">0</span>; i &lt; v.<span class="built_in">size</span>(); ++i)</span><br><span class="line">  {</span><br><span class="line">    result += v[i];</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></div></div>    </div>    <div class="cell" style="">    <p>写法 B</p><div class="tag-plugin colorful note" color="green" child="codeblock"><div class="body"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> <span class="title">sum</span><span class="params">(<span class="type">const</span> std::vector&lt;<span class="type">int</span>&gt; &amp;v)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">  <span class="type">int</span> result = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">for</span>(<span class="type">int</span> x : v)</span><br><span class="line">  {</span><br><span class="line">    result += x;</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure></div></div>    </div>    </div><p>这两种写法在功能上等效。但如果想真正确认哪一种在性能上取胜，则需要使用基准测试 (benchmark)。在这里，写法 B 的性能更好。</p><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">Warning</div></div><div class="callout-content"><p>不要只看汇编结果。我们看不完那么多汇编指令，而且这还是经过编译器优化修改过的产物。如果需要比较，请一并做好基准测试。</p></div></div><h2 id="x86_64-assembly-101"><a class="markdownIt-Anchor" href="#x86_64-assembly-101"></a> x86_64 Assembly 101</h2><h3 id="寄存器"><a class="markdownIt-Anchor" href="#寄存器"></a> 寄存器</h3><p>x86_64 架构下的寄存器有：</p><ul><li><code>rax</code>, <code>rbx</code>, <code>rcx</code>, <code>rdx</code>, <code>rsp</code>, <code>rbp</code>, <code>rsi</code>, <code>rdi</code>, <code>r8</code>-<code>r15</code></li><li><code>xmm0</code>-<code>xmm15</code></li><li><code>rdi</code>, <code>rsi</code>, <code>rdx</code> 等用来存储变量</li><li><code>rax</code> 用于存储返回值</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">64 位的数存进了 32 位的 <code>eax</code>？</div></div><div class="callout-content"><p>在 x86_64 架构中，<code>rax</code> 的长度是 64 位，<code>eax</code> 的长度是 32 位。当数据写入 <code>eax</code> 中时，实际上是将 <code>rax</code> 的高位的 32 个位清 0，仅在低位的 32 个位写入数据。这是一个寄存器相关的技巧。</p></div></div><h3 id="指令格式"><a class="markdownIt-Anchor" href="#指令格式"></a> 指令格式</h3><p>我们使用 Intel 语法格式：</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">op</span><br><span class="line">op dest</span><br><span class="line">op dest, src</span><br><span class="line">op dest, src1, src2</span><br></pre></td></tr></tbody></table></figure><p>这里的 <code>op</code> 指代任意汇编指令，比如 <code>mov</code>, <code>call</code>。<code>dest</code> 和 <code>src</code> 是寄存器或者内存指针，使用 “基址 + 偏移” 表示，即 <code>base + [reg1] + [reg2 * (1, 2, 4 or 8)]</code></p><h3 id="汇编指令与伪-c-代码的对照"><a class="markdownIt-Anchor" href="#汇编指令与伪-c-代码的对照"></a> 汇编指令与伪 C 代码的对照</h3><div class="tag-plugin grid" style="grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));"><div class="cell" style="">    <p>汇编</p><div class="tag-plugin colorful note" color="blue" child="codeblock"><div class="body"><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">eax</span>, <span class="built_in">DWORD</span> <span class="built_in">PTR</span> [<span class="built_in">r14</span>]</span><br><span class="line"><span class="keyword">add</span> <span class="built_in">rax</span>, <span class="built_in">rdi</span></span><br><span class="line"><span class="keyword">add</span> <span class="built_in">eax</span>, <span class="built_in">DWORD</span> <span class="built_in">PTR</span> [<span class="built_in">r14</span>+<span class="number">4</span>]</span><br><span class="line"><span class="keyword">sub</span> <span class="built_in">eax</span>, <span class="built_in">DWORD</span> <span class="built_in">PTR</span> [<span class="built_in">r14</span>+<span class="number">4</span>*<span class="built_in">rbx</span>]</span><br><span class="line"><span class="keyword">lea</span> <span class="built_in">rax</span>, [<span class="built_in">r14</span>+<span class="number">4</span>*<span class="built_in">rbx</span>]</span><br><span class="line"><span class="keyword">xor</span> <span class="built_in">edx</span>, <span class="built_in">edx</span></span><br></pre></td></tr></tbody></table></figure></div></div>    </div>    <div class="cell" style="">    <p>伪 C 代码</p><div class="tag-plugin colorful note" color="green" child="codeblock"><div class="body"><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></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> eax = *r14 <span class="comment">// int *r14;</span></span><br><span class="line">rax += rdi;</span><br><span class="line">eax += r14[<span class="number">1</span>];</span><br><span class="line">eax -= r14[rbx];</span><br><span class="line"><span class="type">int</span> *rax = &amp;r14[rbx];</span><br><span class="line">edx = <span class="number">0</span>;</span><br></pre></td></tr></tbody></table></figure></div></div>    </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">如何清 0 寄存器？</div></div><div class="callout-content"><p>有人会将 <code>edx = 0</code> 肉编译为 <code>mov edx, 0</code>，但这里却是用 <code>xor edx, edx</code>。有两个原因：1）<code>mov</code> 中使用的 0 必须以 4 字节存储，体积要大得多；2）指令集已经明白 <code>xor</code> 有清 0 的作用，因此进行对应优化 —— 换句话说，<code>xor</code> 更偏向 “重置”。</p></div></div><h2 id="compiler-explorer"><a class="markdownIt-Anchor" href="#compiler-explorer"></a> Compiler Explorer</h2><p>最初的 Compiler Explorer 是一个本地 shell 脚本，主要功能部分长这样：</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">g++ /tmp/test.cc -O2 -c -S -o --masm=intel \</span><br><span class="line">  | c++filt \</span><br><span class="line">  | grep -vE <span class="string">'\s+\.'</span></span><br></pre></td></tr></tbody></table></figure><p>然后用 Unix 工具 <code>watch</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">sum(<span class="keyword">std</span>::vector&lt;<span class="keyword">int</span>, <span class="keyword">std</span>::allocator&lt;<span class="keyword">int</span>&gt; &gt; const&amp;):</span><br><span class="line"><span class="symbol">.LFB786:</span></span><br><span class="line">  <span class="keyword">mov</span> <span class="built_in">rcx</span>, <span class="built_in">QWORD</span> <span class="built_in">PTR</span> [<span class="built_in">rdi</span>]</span><br><span class="line">  <span class="keyword">mov</span> <span class="built_in">rax</span>, <span class="built_in">QWORD</span> <span class="built_in">PTR</span> <span class="number">8</span>[<span class="built_in">rdi</span>]</span><br><span class="line">  <span class="keyword">sub</span> <span class="built_in">rax</span>, <span class="built_in">rcx</span></span><br><span class="line">  <span class="keyword">shr</span> <span class="built_in">rax</span>, <span class="number">2</span></span><br><span class="line">  <span class="keyword">mov</span> <span class="built_in">rsi</span>, <span class="built_in">rax</span></span><br><span class="line">  <span class="comment">; ...</span></span><br></pre></td></tr></tbody></table></figure><p>后面部署到线上，有了 GUI，可以在 <a href="https://godbolt.org">Compiler Explorer</a> 上探索。</p><p>通过<a href="https://godbolt.org/z/sq4Y33zqv">示例</a>，我们可以清晰地看到写法 A 和写法 B 的汇编区别：写法 B 的汇编明显更短。</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>本文的示例使用 x86-64 gcc 15.1 -O2 编译这些函数，而原作者使用 x86-64 gcc 8.1 编译，得到的结果会有差异。</p></div></div><p>通过引入 <code>numeric</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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="type">int</span> <span class="title">sum</span><span class="params">(<span class="type">const</span> std::vector&lt;<span class="type">int</span>&gt; &amp;v)</span></span></span><br><span class="line"><span class="function"></span>{</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">accumulate</span>(<span class="built_in">begin</span>(v), <span class="built_in">end</span>(v), <span class="number">0</span>);</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>写法 C 的汇编几乎和 B 相同，只有两个指令的差异 —— 不过是位置的变化罢了。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/207d2659/</id>
    <link href="https://watermelonabc.top/p/207d2659/" rel="alternate"/>
    <published>2025-07-19T09:04:30.000Z</published>
    <summary>探秘 C/C++ 编译器如何工作。一个讲座的 Reaction</summary>
    <title>编译器为我做了什么</title>
    <updated>2026-05-11T08:32:33.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[<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>CASPP 的 LAB 放在 <a href="https://csapp.cs.cmu.edu/3e/labs.html">Lab Assignments</a> 上，在 “Self-Study Handout” 出下载对应 LAB 的资源。</p><p>课程 Lab 说明：“二进制炸弹” 是一个提供给学生的可执行文件。运行时，它会提示用户输入 6 个不同的字符串。如果这些字符串中有任何一个不正确，炸弹就会 “爆炸” 并打印错误信息。学生必须通过反汇编和逆向自己的炸弹来确定这 6 个字符串应该是什么。这个实验让学生理解汇编语言，并强迫他们学习如何使用调试器（GDB）。这是一个你可以自己尝试的 <strong>Linux/x86-64</strong> 二进制炸弹。</p><p>我们选择的是 “自学” 模块，没有远程服务端检查和扣分机制，可以随意调试。但是，CMU 的同学就会有这些机制，输错了就扣分，所以需要小心调试。</p></div></div><p>解压 tar 包，得到三个文件 <code>bomb</code>、<code>bomb.c</code> 和一个 <code>README</code>，<code>README</code> 只说了这是一个 <code>x86-64</code> 程序。</p><h2 id="bombc-解读"><a class="markdownIt-Anchor" href="#bombc-解读"></a> <code>bomb.c</code> 解读</h2><p><code>bomb.c</code> 应该就是 <code>bomb</code> 的主代码了。</p><p>代码引入了两个自定义库 <code>support.h</code> 和 <code>phases.h</code>，也就是说我们想要的字符串必须从程序中得到。</p><p>然后是命令行参数要求，总结如下：</p><ol><li><code>bomb</code>：标准的按行输入</li><li><code>bomb &lt;file&gt;</code>：先从 <code>&lt;file&gt;</code> 中读取输入，结束后再转到标准输入</li><li>不可提供更多命令行参数，否则打印用法</li></ol><p>然后就是打印提示信息并要求输入了。整个代码解读完毕，现在转向程序。</p><h2 id="bomb-逆向-gdb"><a class="markdownIt-Anchor" href="#bomb-逆向-gdb"></a> <code>bomb</code> 逆向 - GDB</h2><p>在 Linux 上使用包管理器安装 GDB，使用 <code>gdb bomb</code> 开始调试</p><p>基本操作：</p><h2 id="bomb-逆向-ida"><a class="markdownIt-Anchor" href="#bomb-逆向-ida"></a> <code>bomb</code> 逆向 - IDA</h2><p>这个 Lab 是需要在 Linux 环境下运行的，不过我们在 Windows 上，所以先用 IDA 分析一下。这里可以用 <code>bomb.c</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><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></pre></td><td class="code"><pre><span class="line"><span class="type">int</span> __fastcall <span class="title function_">main</span><span class="params">(<span class="type">int</span> argc, <span class="type">const</span> <span class="type">char</span> **argv)</span></span><br><span class="line">{</span><br><span class="line">  <span class="type">const</span> <span class="type">char</span> *line; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">const</span> <span class="type">char</span> *v3; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">const</span> <span class="type">char</span> *v4; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">const</span> <span class="type">char</span> *v5; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">const</span> <span class="type">char</span> *v6; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">const</span> <span class="type">char</span> *v7; <span class="comment">// rax</span></span><br><span class="line"></span><br><span class="line">  <span class="keyword">if</span> ( argc == <span class="number">1</span> )</span><br><span class="line">  {</span><br><span class="line">    infile = (FILE *)<span class="built_in">stdin</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> ( argc != <span class="number">2</span> )</span><br><span class="line">    {</span><br><span class="line">      __printf_chk(<span class="number">1</span>, <span class="string">"Usage: %s [&lt;input_file&gt;]\n"</span>, *argv);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">8</span>);</span><br><span class="line">    }</span><br><span class="line">    infile = fopen(argv[<span class="number">1</span>], <span class="string">"r"</span>);</span><br><span class="line">    <span class="keyword">if</span> ( !infile )</span><br><span class="line">    {</span><br><span class="line">      __printf_chk(<span class="number">1</span>, <span class="string">"%s: Error: Couldn't open %s\n"</span>, *argv, argv[<span class="number">1</span>]);</span><br><span class="line">      <span class="built_in">exit</span>(<span class="number">8</span>);</span><br><span class="line">    }</span><br><span class="line">  }</span><br><span class="line">  initialize_bomb();</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"Welcome to my fiendish little bomb. You have 6 phases with"</span>);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"which to blow yourself up. Have a nice day!"</span>);</span><br><span class="line">  line = read_line();</span><br><span class="line">  phase_1(line);</span><br><span class="line">  phase_defused();</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"Phase 1 defused. How about the next one?"</span>);</span><br><span class="line">  v3 = read_line();</span><br><span class="line">  phase_2(v3);</span><br><span class="line">  phase_defused();</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"That's number 2.  Keep going!"</span>);</span><br><span class="line">  v4 = read_line();</span><br><span class="line">  phase_3(v4);</span><br><span class="line">  phase_defused();</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"Halfway there!"</span>);</span><br><span class="line">  v5 = read_line();</span><br><span class="line">  phase_4(v5);</span><br><span class="line">  phase_defused();</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"So you got that one.  Try this one."</span>);</span><br><span class="line">  v6 = read_line();</span><br><span class="line">  phase_5((__int64)v6);</span><br><span class="line">  phase_defused();</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"Good work!  On to the next..."</span>);</span><br><span class="line">  v7 = read_line();</span><br><span class="line">  phase_6(v7);</span><br><span class="line">  phase_defused();</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>先来看 Phase1，点进 <code>phase_1(line)</code>，即可得到内容：</p><figure class="highlight c"><table><tbody><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">result = strings_not_equal(line, <span class="string">"Border relations with Canada have never been better."</span>);</span><br></pre></td></tr></tbody></table></figure><p>Phase1 就是 <code>Border relations with Canada have never been better.</code>。</p><p>接下来是 Phase2。有了 Phase1 的经验，我们点开 <code>phase_2(v5)</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><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">__int64 __fastcall <span class="title function_">phase_2</span><span class="params">(__int64 a1)</span></span><br><span class="line">{</span><br><span class="line">  __int64 result; <span class="comment">// rax</span></span><br><span class="line">  <span class="type">char</span> *v2; <span class="comment">// rbx</span></span><br><span class="line">  <span class="type">int</span> v3; <span class="comment">// [rsp+0h] [rbp-38h] BYREF</span></span><br><span class="line">  <span class="type">char</span> v4; <span class="comment">// [rsp+4h] [rbp-34h] BYREF</span></span><br><span class="line">  <span class="type">char</span> v5; <span class="comment">// [rsp+18h] [rbp-20h] BYREF</span></span><br><span class="line"></span><br><span class="line">  read_six_numbers(a1, &amp;v3);</span><br><span class="line">  <span class="keyword">if</span> ( v3 != <span class="number">1</span> )</span><br><span class="line">    explode_bomb();</span><br><span class="line">  v2 = &amp;v4;</span><br><span class="line">  <span class="keyword">do</span></span><br><span class="line">  {</span><br><span class="line">    result = (<span class="type">unsigned</span> <span class="type">int</span>)(<span class="number">2</span> * *((_DWORD *)v2 - <span class="number">1</span>));</span><br><span class="line">    <span class="keyword">if</span> ( *(_DWORD *)v2 != (_DWORD)result )</span><br><span class="line">      explode_bomb();</span><br><span class="line">    v2 += <span class="number">4</span>;</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">while</span> ( v2 != &amp;v5 );</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>先看第一个读取函数 <code>read_six_numbers(a1, &amp;v3)</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><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">__int64 __fastcall <span class="title function_">read_six_numbers</span><span class="params">(__int64 a1, __int64 a2)</span></span><br><span class="line">{</span><br><span class="line">  __int64 n5; <span class="comment">// rax</span></span><br><span class="line"></span><br><span class="line">  n5 = __isoc99_sscanf(a1, <span class="string">"%d %d %d %d %d %d"</span>, a2, a2 + <span class="number">4</span>, a2 + <span class="number">1</span>, a2 + <span class="number">12</span>, a2 + <span class="number">2</span>, a2 + <span class="number">20</span>);</span><br><span class="line">  <span class="keyword">if</span> ( (<span class="type">int</span>)n5 &lt;= <span class="number">5</span> )</span><br><span class="line">    explode_bomb();</span><br><span class="line">  <span class="keyword">return</span> n5;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>核心就是 <code>__isoc99_sscanf</code>。查询函数定义<sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup> 可知，这里是从我们输入的 Phase2 中读取格式化的 “<code>%d %d %d %d %d %d</code>” 并写入 <code>v3[i]</code>。</p><p>我们可以在这里修复一下函数定义，修复后的 <code>phase_2(v5)</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><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="type">int</span> __fastcall <span class="title function_">phase_2</span><span class="params">(<span class="type">const</span> <span class="type">char</span> *a1)</span></span><br><span class="line">{</span><br><span class="line">  <span class="type">int</span> result; <span class="comment">// eax</span></span><br><span class="line">  <span class="type">int</span> *v2; <span class="comment">// rbx</span></span><br><span class="line">  <span class="type">int</span> v3[<span class="number">6</span>]; <span class="comment">// [rsp+0h] [rbp-38h] BYREF</span></span><br><span class="line">  <span class="type">int</span> v4; <span class="comment">// [rsp+18h] [rbp-20h] BYREF</span></span><br><span class="line"></span><br><span class="line">  read_six_numbers(a1, v3);</span><br><span class="line">  <span class="keyword">if</span> ( v3[<span class="number">0</span>] != <span class="number">1</span> )</span><br><span class="line">    explode_bomb();</span><br><span class="line">  v2 = &amp;v3[<span class="number">1</span>];</span><br><span class="line">  <span class="keyword">do</span></span><br><span class="line">  {</span><br><span class="line">    result = <span class="number">2</span> * *(v2 - <span class="number">1</span>);</span><br><span class="line">    <span class="keyword">if</span> ( *v2 != result )</span><br><span class="line">      explode_bomb();</span><br><span class="line">    ++v2;</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">while</span> ( v2 != &amp;v4 );</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>可以知道，<code>v3[0]</code> ，即第一个输入值必然是 <code>1</code>。<code>v2</code> 对应第二个输入值的地址。</p><p>然后进入一个 <code>do-while</code> 循环，循环条件是 <code>v2</code> 不等于 <code>v4</code> 的<strong>地址</strong>。</p><p>循环体的逻辑是计算 <code>2 * v2[i-1]</code> 的值，然后和 <code>v2[i]</code> 进行比较。如果不相等，就引爆炸弹。然后移动到下一个元素。</p><p><code>v4</code> 和我们的输入无关且分配内存时接在 <code>v3</code> 之后，基于内存连续性，我们认为数组 <code>v3</code> 结束于地址 <code>v4</code>。</p><hr class="footnotes-sep"><section class="footnotes"><ol class="footnotes-list"><li id="fn1" class="footnote-item"><p><a href="https://www.runoob.com/cprogramming/c-function-sscanf.html">C 库函数 int sscanf</a> <a href="#fnref1" class="footnote-backref">↩︎</a></p></li></ol></section>]]>
    </content>
    <id>https://watermelonabc.top/p/c2ca3e1d/</id>
    <link href="https://watermelonabc.top/p/c2ca3e1d/" rel="alternate"/>
    <published>2025-07-17T06:00:37.000Z</published>
    <summary>CSAPP（深入了解计算机系统）的 Bomb Lab 笔记</summary>
    <title>CSAPP Lab2 Note</title>
    <updated>2026-05-11T08:32:33.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>哈希函数（Hash Function，意译为 “散列函数”）是一种从任何一种数据中创建小的数字 “指纹” 的方法。散列函数把消息或数据计算成摘要 (Digest)，使得数据量变小，将数据的格式固定下来。该函数将数据打乱混合，重新创建一个叫做哈希值（Hash value，又叫散列值）的指纹。</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">为什么叫 “Hash”？</div></div><div class="callout-content"><p>麦当劳售卖薯饼 (<strong>Hash</strong> Brown) 早餐，即将一整个马铃薯削成丝状，再将丝状马铃薯重新油炸成一整个薯饼。由于本质上是将原先的一个整体打散再重新组合且过程不可逆，正好符合该类算法的设计思路，于是称该类算法为哈希 (Hash) 算法。</p></div></div><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">哈希算法如何保护密码？</div></div><div class="callout-content"><p>用户注册时，密码先在前端进行哈希，哈希值传回后端数据库存储。用户登录时，输入的密码在前端进行哈希，然后传回后端进行比较。</p></div></div><h2 id="哈希算法的基本性质"><a class="markdownIt-Anchor" href="#哈希算法的基本性质"></a> 哈希算法的基本性质</h2><p>出于密码学目的，哈希函数通常需要具备以下特性：</p><ul><li><p><strong>确定性</strong>输出：给定输入 A（如 “I love cats”），每次哈希 A 都会得到相同的输出。</p></li><li><p>扩散性：输入的微小变化会导致输出的巨大变化。例如，“I love cats” 和 “I love kats” 的哈希值完全不同，无法相互识别。</p></li><li><p>不可预测性：哈希结果应该是完全不可预测的；在生成的哈希值中不应存在可识别的模式。</p></li><li><p><strong>不可逆</strong>性：无法通过给定的哈希值重构有效输入，因此唯一验证输入是否对应哈希值的方法是穷举法（暴力破解！）。</p></li><li><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>如果两个散列值相同，两个输入值<strong>并非必定是相同</strong>的。当两个散列值相同，但两个输入值不同时，这种情况就称为<strong>散列碰撞</strong> (Collision)，这通常是两个不同长度的输入值，刻意计算出相同的输出值。<br>不抗碰撞的哈希函数会完全破坏算法。<br>理论上，一个良好的哈希函数应该是不可碰撞的，但是 MD5、SHA-1 等早期哈希算法已经被证明可碰撞，因此这些算法已经不再推荐用于加密，而是用于验证文件完整性等非加密用途。</p></div></div></li></ul><p>大多数哈希算法的输出具有<strong>固定长度</strong>。由于所有输入本质上都是信息比特流，我们实际上是将任意长度的比特序列转换为看似随机的固定长度比特序列。</p><p>有时，为了增强哈希算法的抗碰撞性，我们会给明文加上 “盐值”🧂。盐值会设置成一个随机的字符串，然后和明文进行拼接。由于加盐后的明文非常长，因此几乎不可能被碰撞。下面的 CTF 示例就有加盐的 MD5。</p><p>下面介绍几种常见的哈希算法。</p><h2 id="md5"><a class="markdownIt-Anchor" href="#md5"></a> MD5</h2><p>MD5 信息摘要算法 (MD5 Message-Digest Algorithm) 是 MD 系列算法的最常见版本。算法会生成一个 128 位的哈希值（长度为 32 的十六进制值）</p><p>用伪代码表示为：</p><figure class="highlight plaintext"><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></pre></td><td class="code"><pre><span class="line">// : All variables are unsigned 32 bit and wrap modulo 2^32 when calculating</span><br><span class="line">var int s[64], K[64]</span><br><span class="line">var int i</span><br><span class="line"></span><br><span class="line">// s specifies the per-round shift amounts</span><br><span class="line">s[ 0..15] := { 7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22,  7, 12, 17, 22 }</span><br><span class="line">s[16..31] := { 5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20,  5,  9, 14, 20 }</span><br><span class="line">s[32..47] := { 4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23,  4, 11, 16, 23 }</span><br><span class="line">s[48..63] := { 6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21,  6, 10, 15, 21 }</span><br><span class="line"></span><br><span class="line">// Use binary integer part of the sines of integers (Radians) as constants:</span><br><span class="line">for i from 0 to 63 do</span><br><span class="line">    K[i] := floor(232 × abs(sin(i + 1)))</span><br><span class="line">end for</span><br><span class="line">// (Or just use the following precomputed table):</span><br><span class="line">K[ 0.. 3] := { 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee }</span><br><span class="line">K[ 4.. 7] := { 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501 }</span><br><span class="line">K[ 8..11] := { 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be }</span><br><span class="line">K[12..15] := { 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821 }</span><br><span class="line">K[16..19] := { 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa }</span><br><span class="line">K[20..23] := { 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8 }</span><br><span class="line">K[24..27] := { 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed }</span><br><span class="line">K[28..31] := { 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a }</span><br><span class="line">K[32..35] := { 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c }</span><br><span class="line">K[36..39] := { 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70 }</span><br><span class="line">K[40..43] := { 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05 }</span><br><span class="line">K[44..47] := { 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665 }</span><br><span class="line">K[48..51] := { 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039 }</span><br><span class="line">K[52..55] := { 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1 }</span><br><span class="line">K[56..59] := { 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1 }</span><br><span class="line">K[60..63] := { 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391 }</span><br><span class="line"></span><br><span class="line">// Initialize variables:</span><br><span class="line">var int a0 := 0x67452301   // A</span><br><span class="line">var int b0 := 0xefcdab89   // B</span><br><span class="line">var int c0 := 0x98badcfe   // C</span><br><span class="line">var int d0 := 0x10325476   // D</span><br><span class="line"></span><br><span class="line">// Pre-processing: adding a single 1 bit</span><br><span class="line">append "1" bit to message&lt;</span><br><span class="line"> // Notice: the input bytes are considered as bit strings,</span><br><span class="line"> //  where the first bit is the most significant bit of the byte.[52]</span><br><span class="line"></span><br><span class="line">// Pre-processing: padding with zeros</span><br><span class="line">append "0" bit until message length in bits ≡ 448 (mod 512)</span><br><span class="line"></span><br><span class="line">// Notice: the two padding steps above are implemented in a simpler way</span><br><span class="line">  //  in implementations that only work with complete bytes: append 0x80</span><br><span class="line">  //  and pad with 0x00 bytes so that the message length in bytes ≡ 56 (mod 64).</span><br><span class="line"></span><br><span class="line">append original length in bits mod 264 to message</span><br><span class="line"></span><br><span class="line">// Process the message in successive 512-bit chunks:</span><br><span class="line">for each 512-bit chunk of padded message do</span><br><span class="line">    break chunk into sixteen 32-bit words M[j], 0 ≤ j ≤ 15</span><br><span class="line">    // Initialize hash value for this chunk:</span><br><span class="line">    var int A := a0</span><br><span class="line">    var int B := b0</span><br><span class="line">    var int C := c0</span><br><span class="line">    var int D := d0</span><br><span class="line">    // Main loop:</span><br><span class="line">    for i from 0 to 63 do</span><br><span class="line">        var int F, g</span><br><span class="line">        if 0 ≤ i ≤ 15 then</span><br><span class="line">            F := (B and C) or ((not B) and D)</span><br><span class="line">            g := i</span><br><span class="line">        else if 16 ≤ i ≤ 31 then</span><br><span class="line">            F := (D and B) or ((not D) and C)</span><br><span class="line">            g := (5×i + 1) mod 16</span><br><span class="line">        else if 32 ≤ i ≤ 47 then</span><br><span class="line">            F := B xor C xor D</span><br><span class="line">            g := (3×i + 5) mod 16</span><br><span class="line">        else if 48 ≤ i ≤ 63 then</span><br><span class="line">            F := C xor (B or (not D))</span><br><span class="line">            g := (7×i) mod 16</span><br><span class="line">        // Be wary of the below definitions of a,b,c,d</span><br><span class="line">        F := F + A + K[i] + M[g]  // M[g] must be a 32-bit block</span><br><span class="line">        A := D</span><br><span class="line">        D := C</span><br><span class="line">        C := B</span><br><span class="line">        B := B + leftrotate(F, s[i])</span><br><span class="line">    end for</span><br><span class="line">    // Add this chunk's hash to result so far:</span><br><span class="line">    a0 := a0 + A</span><br><span class="line">    b0 := b0 + B</span><br><span class="line">    c0 := c0 + C</span><br><span class="line">    d0 := d0 + D</span><br><span class="line">end for</span><br><span class="line"></span><br><span class="line">var char digest[16] := a0 append b0 append c0 append d0 // (Output is in little-endian)</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>不需要手写 MD5 算法过程。主流的加密库早已支持 MD5 加密。</p></div></div><p>MD5 算法于 1993 年发现 “伪碰撞”，1996 年发现部分碰撞。2004 年，中国的王小云教授宣布发现了 MD5 的完整碰撞，该算法被证明不具有抗碰撞性。</p><p>目前破解 MD5 算法的方法就是<strong>查字典</strong>，比如 <a href="https://www.cmd5.com/">CMD5</a>。</p><p>虽然 MD5 不再建议用于加密用途，但由于它比 SHA 系列更方便计算，因此仍有很多人将 MD5 用于非加密用途。</p><h2 id="sha-1"><a class="markdownIt-Anchor" href="#sha-1"></a> SHA-1</h2><p>Coming s∞n</p><h2 id="破解方法"><a class="markdownIt-Anchor" href="#破解方法"></a> 破解方法</h2><p>由于 Hash 几乎无法逆向，因此我们一般使用<strong>穷举</strong>（爆破）方法解决 Hash 函数。</p><p>首先，一些比较简单的 Hash 可以从已有数据库中查询到原文。这是最简单且快速的方法了，如果一个查不到可以试试其他网站，本地也有像 Hashcat 这样的工具。</p><p>但对于 CTF 而言，出题者多半不会让你如此无脑得逞。原文可能较长，或者含有特殊字符，基本没有已有工具会破解到这些字符串，这时就需要自己写爆破脚本了。</p><p>如果自己写破解脚本，需要通过逆向知道原文的构成规律 —— 个人计算机大概率是无法承受完全穷举的工作量的，所以我们需要有目的、有限制地爆破 Hash。下面举几个例子：</p><h3 id="l3hctf-2025-temporalparadox"><a class="markdownIt-Anchor" href="#l3hctf-2025-temporalparadox"></a> L3HCTF 2025 - TemporalParadox</h3><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>flag 形式为 <code>L3HCTF{sha1(query string)}</code></p></div></div><p>本题需要得到 “正确的查询字符串 (query string)”</p><p>题目是有一个简单的花指令的，去除一下，得到：</p><figure class="highlight c"><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></pre></td><td class="code"><pre><span class="line">INT64 <span class="title function_">main</span><span class="params">(undefined8 param_1,undefined8 param_2,allocator *param_3,undefined8 param_4)</span></span><br><span class="line"></span><br><span class="line">{</span><br><span class="line">  INT64 uVar2;</span><br><span class="line">  <span class="type">char</span> *pcVar1;</span><br><span class="line">  <span class="type">int</span> *piVar2;</span><br><span class="line">  ostream *poVar3;</span><br><span class="line">  INT64 uVar1;</span><br><span class="line">  <span class="built_in">string</span> *unaff_RBP;</span><br><span class="line"></span><br><span class="line">  FUN_140001d1e();</span><br><span class="line">  FUN_14000a510((undefined4 *)(unaff_RBP + <span class="number">0x20</span>));</span><br><span class="line">  uVar2 = FUN_140001493((<span class="type">__time64_t</span> *)<span class="number">0x0</span>);</span><br><span class="line">  *(INT64 *)(unaff_RBP + <span class="number">200</span>) = uVar2;</span><br><span class="line">  <span class="keyword">if</span> ((<span class="number">0x686d4080</span> &lt; *(longlong *)(unaff_RBP + <span class="number">200</span>)) &amp;&amp; (*(longlong *)(unaff_RBP + <span class="number">200</span>) &lt; <span class="number">1752052052</span>)</span><br><span class="line">     ) {</span><br><span class="line">    FUN_140001963(unaff_RBP + <span class="number">-0x60</span>);</span><br><span class="line">    *(<span class="built_in">string</span> **)(unaff_RBP + <span class="number">0xc0</span>) = unaff_RBP + <span class="number">0xb6</span>;</span><br><span class="line">    pcVar1 = (<span class="type">char</span> *)<span class="built_in">std</span>::__cxx11::<span class="built_in">string</span>::c_str();</span><br><span class="line">    piVar2 = md5Encode((<span class="type">int</span> *)(unaff_RBP + <span class="number">0x20</span>),pcVar1,param_3,param_4);</span><br><span class="line">    param_3 = (allocator *)(unaff_RBP + <span class="number">0xb6</span>);</span><br><span class="line">    FUN_14000a820((_Alloc_hider *)(unaff_RBP + <span class="number">-0x40</span>),(<span class="type">char</span> *)piVar2,param_3);</span><br><span class="line">    FUN_14000a6e0();</span><br><span class="line">    poVar3 = <span class="built_in">std</span>::operator&lt;&lt;((ostream *)PTR_PTR_cout_14000c9e0,<span class="string">"query: "</span>);</span><br><span class="line">    poVar3 = <span class="built_in">std</span>::operator&lt;&lt;(poVar3,unaff_RBP + <span class="number">-0x60</span>);</span><br><span class="line">    <span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar3,(_func_ostream_ptr_ostream_ptr *)&amp;DAT_140002018);</span><br><span class="line">    poVar3 = <span class="built_in">std</span>::operator&lt;&lt;((ostream *)PTR_PTR_cout_14000c9e0,unaff_RBP + <span class="number">-0x40</span>);</span><br><span class="line">    <span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar3,(_func_ostream_ptr_ostream_ptr *)&amp;DAT_140002018);</span><br><span class="line">    <span class="built_in">std</span>::__cxx11::<span class="built_in">string</span>::~<span class="built_in">string</span>(unaff_RBP + <span class="number">-0x40</span>);</span><br><span class="line">    <span class="built_in">std</span>::__cxx11::<span class="built_in">string</span>::~<span class="built_in">string</span>(unaff_RBP + <span class="number">-0x60</span>);</span><br><span class="line">  }</span><br><span class="line">  <span class="built_in">std</span>::__cxx11::<span class="built_in">string</span>::<span class="built_in">string</span>(unaff_RBP);</span><br><span class="line">  poVar3 = <span class="built_in">std</span>::operator&lt;&lt;((ostream *)PTR_PTR_cout_14000c9e0,</span><br><span class="line">                           <span class="string">"Please input the right query string I used:"</span>);</span><br><span class="line">  <span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar3,(_func_ostream_ptr_ostream_ptr *)&amp;DAT_140002018);</span><br><span class="line">  <span class="built_in">std</span>::operator&gt;&gt;((istream *)PTR_PTR_cin_14000c9d0,unaff_RBP);</span><br><span class="line">  *(<span class="built_in">string</span> **)(unaff_RBP + <span class="number">0xb8</span>) = unaff_RBP + <span class="number">0xb7</span>;</span><br><span class="line">  pcVar1 = (<span class="type">char</span> *)<span class="built_in">std</span>::__cxx11::<span class="built_in">string</span>::c_str();</span><br><span class="line">  piVar2 = md5Encode((<span class="type">int</span> *)(unaff_RBP + <span class="number">0x20</span>),pcVar1,param_3,param_4);</span><br><span class="line">  FUN_14000a820((_Alloc_hider *)(unaff_RBP + <span class="number">-0x20</span>),(<span class="type">char</span> *)piVar2,(allocator *)(unaff_RBP + <span class="number">0xb7</span>));</span><br><span class="line">  FUN_14000a6e0();</span><br><span class="line">  uVar1 = md5Validate(unaff_RBP + <span class="number">-0x20</span>,<span class="string">"8a2fc1e9e2830c37f8a7f51572a640aa"</span>);</span><br><span class="line">  <span class="keyword">if</span> ((<span class="type">char</span>)uVar1 == <span class="number">0</span>) {</span><br><span class="line">    poVar3 = <span class="built_in">std</span>::operator&lt;&lt;((ostream *)PTR_PTR_cout_14000c9e0,<span class="string">"Wrong!"</span>);</span><br><span class="line">    <span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar3,(_func_ostream_ptr_ostream_ptr *)&amp;DAT_140002018);</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">else</span> {</span><br><span class="line">    poVar3 = <span class="built_in">std</span>::operator&lt;&lt;((ostream *)PTR_PTR_cout_14000c9e0,<span class="string">"Congratulations!"</span>);</span><br><span class="line">    <span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar3,(_func_ostream_ptr_ostream_ptr *)&amp;DAT_140002018);</span><br><span class="line">  }</span><br><span class="line">  <span class="built_in">std</span>::__cxx11::<span class="built_in">string</span>::~<span class="built_in">string</span>(unaff_RBP + <span class="number">-0x20</span>);</span><br><span class="line">  <span class="built_in">std</span>::__cxx11::<span class="built_in">string</span>::~<span class="built_in">string</span>(unaff_RBP);</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>（顺便提一下，这是我用 Ghidra 反编译的，IDA 的反编译看得我眼花缭乱 X - X）</p><p>这个字符串的 MD5 是 <code>8a2fc1e9e2830c37f8a7f51572a640aa</code>，这个 MD5 应该是没有已知数据库有记录的，因此需要我们自己爆破。</p><p>这个比赛在 2025/7/12 进行。当时我们发现直接运行程序，不会输出 <code>query: ...</code>，这个 <code>(0x686d4080 &lt; *(longlong *)(unaff_RBP + 200)) &amp;&amp; (*(longlong *)(unaff_RBP + 200) &lt; 1752052052)</code> 条件在控制。</p><p>向上查看发现 <code>unaff_RBP + 200</code> 实际上是从 <code>FUN_140001493</code> 中的 <code>_time64</code> 得到的 UNIX 时间戳。转换发现条件是本机 UTC 时间为 2025/7/9 00:00:00 - 2025/7/9 09:07:32 时，执行函数体并输出该时刻的查询字符串。此时断网并调整本机时间。</p><p>现在我们想知道 <code>query</code> 是如何生成的，阅读后知道输出的 <code>unaff_RBP + -0x60</code> 来自 <code>FUN_140001963</code></p><figure class="highlight c"><figcaption><span>FUN_140001963</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></pre></td><td class="code"><pre><span class="line">undefined8 <span class="title function_">FUN_140001963</span><span class="params">(undefined8 param_1)</span></span><br><span class="line"></span><br><span class="line">{</span><br><span class="line">  uint uVar1;</span><br><span class="line">  ostream *poVar2;</span><br><span class="line">  <span class="type">double</span> dVar3;</span><br><span class="line">  <span class="type">double</span> dVar4;</span><br><span class="line">  <span class="type">double</span> dVar5;</span><br><span class="line">  <span class="type">double</span> dVar6;</span><br><span class="line">  <span class="built_in">stringstream</span> local_218 [<span class="number">16</span>];</span><br><span class="line">  ostream aoStack_208 [<span class="number">384</span>];</span><br><span class="line">  <span class="built_in">string</span> salt [<span class="number">44</span>];</span><br><span class="line">  uint r;</span><br><span class="line">  longlong t;</span><br><span class="line">  <span class="type">int</span> local_4c;</span><br><span class="line">  uint y;</span><br><span class="line">  uint x;</span><br><span class="line">  uint b;</span><br><span class="line">  uint a;</span><br><span class="line"></span><br><span class="line">  FUN_140001518(salt);</span><br><span class="line">  t = FUN_140001493((<span class="type">__time64_t</span> *)<span class="number">0x0</span>);</span><br><span class="line">  FUN_1400014b5((<span class="type">int</span>)t);</span><br><span class="line">  a = <span class="number">0</span>;</span><br><span class="line">  b = <span class="number">0</span>;</span><br><span class="line">  x = <span class="number">0</span>;</span><br><span class="line">  y = <span class="number">0</span>;</span><br><span class="line">  local_4c = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">while</span> (uVar1 = FUN_1400014d5(), local_4c &lt; (<span class="type">int</span>)uVar1) {</span><br><span class="line">    a = FUN_1400014d5();</span><br><span class="line">    b = FUN_1400014d5();</span><br><span class="line">    x = FUN_1400014d5();</span><br><span class="line">    y = FUN_1400014d5();</span><br><span class="line">    local_4c = local_4c + <span class="number">1</span>;</span><br><span class="line">  }</span><br><span class="line">  r = FUN_1400014d5();</span><br><span class="line">  <span class="built_in">std</span>::__cxx11::<span class="built_in">stringstream</span>::<span class="built_in">stringstream</span>(local_218);</span><br><span class="line">                    <span class="comment">/* 00000061h */</span></span><br><span class="line">  dVar5 = (<span class="type">double</span>)DAT_14000b0e0;</span><br><span class="line">  dVar3 = (<span class="type">double</span>)FUN_1400033a0((<span class="type">double</span>)(<span class="type">int</span>)(x | a),DAT_14000c1d0);</span><br><span class="line">                    <span class="comment">/* 0000000Bh */</span></span><br><span class="line">  dVar6 = (<span class="type">double</span>)DAT_14000b0e4;</span><br><span class="line">  dVar4 = (<span class="type">double</span>)FUN_1400033a0((<span class="type">double</span>)(<span class="type">int</span>)(y | b),DAT_14000c1d0);</span><br><span class="line">  <span class="keyword">if</span> (dVar5 * dVar3 == dVar4 * dVar6) {</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(aoStack_208,<span class="string">"salt="</span>);</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(poVar2,salt);</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(poVar2,<span class="string">"&amp;t="</span>);</span><br><span class="line">    poVar2 = (ostream *)<span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar2,t);</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(poVar2,<span class="string">"&amp;r="</span>);</span><br><span class="line">    poVar2 = (ostream *)<span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar2,r);</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(poVar2,<span class="string">"&amp;cipher="</span>);</span><br><span class="line">    uVar1 = FUN_14000184d(r,(uint)t);</span><br><span class="line">    <span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar2,uVar1 &amp; <span class="number">0xffff</span>);</span><br><span class="line">  }</span><br><span class="line">  <span class="keyword">else</span> {</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(aoStack_208,<span class="string">"salt="</span>);</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(poVar2,salt);</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(poVar2,<span class="string">"&amp;t="</span>);</span><br><span class="line">    poVar2 = (ostream *)<span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar2,t);</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(poVar2,<span class="string">"&amp;r="</span>);</span><br><span class="line">    poVar2 = (ostream *)<span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar2,r);</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(poVar2,<span class="string">"&amp;a="</span>);</span><br><span class="line">    poVar2 = (ostream *)<span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar2,a);</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(poVar2,<span class="string">"&amp;b="</span>);</span><br><span class="line">    poVar2 = (ostream *)<span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar2,b);</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(poVar2,<span class="string">"&amp;x="</span>);</span><br><span class="line">    poVar2 = (ostream *)<span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar2,x);</span><br><span class="line">    poVar2 = <span class="built_in">std</span>::operator&lt;&lt;(poVar2,<span class="string">"&amp;y="</span>);</span><br><span class="line">    <span class="built_in">std</span>::ostream::operator&lt;&lt;(poVar2,y);</span><br><span class="line">  }</span><br><span class="line">  <span class="built_in">std</span>::__cxx11::<span class="built_in">stringstream</span>::str();</span><br><span class="line">  <span class="built_in">std</span>::__cxx11::<span class="built_in">stringstream</span>::~<span class="built_in">stringstream</span>(local_218);</span><br><span class="line">  <span class="built_in">std</span>::__cxx11::<span class="built_in">string</span>::~<span class="built_in">string</span>(salt);</span><br><span class="line">  <span class="keyword">return</span> param_1;</span><br><span class="line">}</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></pre></td><td class="code"><pre><span class="line">query: salt=tlkyeueq7fej8vtzitt26yl24kswrgm5&amp;t=1751994230&amp;r=938796188&amp;a=1227348758&amp;b=2062353588&amp;x=353278121&amp;y=90222372</span><br><span class="line"></span><br><span class="line">query: salt=tlkyeueq7fej8vtzitt26yl24kswrgm5&amp;t=1751994263&amp;r=1788731889&amp;a=1248035063&amp;b=1976747241&amp;x=78756750&amp;y=1271164846</span><br></pre></td></tr></tbody></table></figure><p>多次运行后，发现 <code>salt</code> 值不变，于是我们需要生成 <code>r</code>、<code>a</code>、<code>b</code>、<code>x</code> 和 <code>y</code>。</p><p>这五个值均由 <code>FUN_1400014d5</code> 生成：</p><figure class="highlight c"><figcaption><span>FUN_1400014d5</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></pre></td><td class="code"><pre><span class="line">uint <span class="title function_">FUN_1400014d5</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line"></span><br><span class="line">{</span><br><span class="line">  uint uVar1;</span><br><span class="line"></span><br><span class="line">  uVar1 = time_you_get ^ time_you_get &lt;&lt; <span class="number">13</span>;</span><br><span class="line">  uVar1 = uVar1 ^ uVar1 &gt;&gt; <span class="number">17</span>;</span><br><span class="line">  time_you_get = uVar1 ^ uVar1 &lt;&lt; <span class="number">5</span>;</span><br><span class="line">  <span class="keyword">return</span> time_you_get &amp; <span class="number">0x7fffffff</span>;</span><br><span class="line">}</span><br></pre></td></tr></tbody></table></figure><p>生成后按格式拼接，计算 MD5 值并比较。完整脚本：</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></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;cstdio&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;openssl/md5.h&gt;</span> <span class="comment">// 需要安装 OpenSSL 库</span></span></span><br><span class="line"></span><br><span class="line">using namespace <span class="built_in">std</span>;</span><br><span class="line"></span><br><span class="line"><span class="type">unsigned</span> <span class="type">int</span> <span class="title function_">encodeYourTime</span><span class="params">(<span class="type">int</span> *time)</span></span><br><span class="line">{</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">int</span> temp;</span><br><span class="line">    temp = (*time) ^ (*time) &lt;&lt; <span class="number">13</span>;</span><br><span class="line">    temp = temp ^ temp &gt;&gt; <span class="number">17</span>;</span><br><span class="line">    (*time) = temp ^ temp &lt;&lt; <span class="number">5</span>;</span><br><span class="line">    <span class="keyword">return</span> (*time) &amp; <span class="number">0x7fffffff</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="built_in">string</span> <span class="title function_">calculateMD5</span><span class="params">(<span class="type">const</span> <span class="built_in">string</span> &amp;input)</span></span><br><span class="line">{</span><br><span class="line">    <span class="type">unsigned</span> <span class="type">char</span> digest[MD5_DIGEST_LENGTH];</span><br><span class="line">    MD5((<span class="type">unsigned</span> <span class="type">char</span> *)input.c_str(), input.length(), digest);</span><br><span class="line"></span><br><span class="line">    <span class="type">char</span> mdString[<span class="number">33</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">16</span>; i++)</span><br><span class="line">        <span class="built_in">sprintf</span>(&amp;mdString[i * <span class="number">2</span>], <span class="string">"%02x"</span>, (<span class="type">unsigned</span> <span class="type">int</span>)digest[i]);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">string</span>(mdString);</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></span><br><span class="line">{</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">1751990400</span>; i &lt;= <span class="number">1752052051</span>; i++)</span><br><span class="line">    {</span><br><span class="line">        <span class="type">unsigned</span> <span class="type">int</span> r = <span class="number">0</span>;</span><br><span class="line">        <span class="type">unsigned</span> <span class="type">int</span> a = <span class="number">0</span>;</span><br><span class="line">        <span class="type">unsigned</span> <span class="type">int</span> b = <span class="number">0</span>;</span><br><span class="line">        <span class="type">unsigned</span> <span class="type">int</span> x = <span class="number">0</span>;</span><br><span class="line">        <span class="type">unsigned</span> <span class="type">int</span> y = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">        <span class="type">int</span> time = (<span class="type">int</span>)i;</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> j = <span class="number">0</span>; j &lt; (<span class="type">int</span>)encodeYourTime(&amp;time); j++)</span><br><span class="line">        {</span><br><span class="line">            a = encodeYourTime(&amp;time);</span><br><span class="line">            b = encodeYourTime(&amp;time);</span><br><span class="line">            x = encodeYourTime(&amp;time);</span><br><span class="line">            y = encodeYourTime(&amp;time);</span><br><span class="line">        }</span><br><span class="line">        r = encodeYourTime(&amp;time);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 构建数据字符串</span></span><br><span class="line">        <span class="type">char</span> buffer[<span class="number">256</span>];</span><br><span class="line">        <span class="built_in">snprintf</span>(buffer, <span class="keyword">sizeof</span>(buffer),</span><br><span class="line">                 <span class="string">"salt=tlkyeueq7fej8vtzitt26yl24kswrgm5&amp;t=%u&amp;r=%u&amp;a=%u&amp;b=%u&amp;x=%u&amp;y=%u"</span>,</span><br><span class="line">                 i, r, a, b, x, y);</span><br><span class="line">        <span class="built_in">string</span> data = buffer;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 计算MD5</span></span><br><span class="line">        <span class="built_in">string</span> md5Hash = calculateMD5(data);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 输出结果</span></span><br><span class="line">        <span class="built_in">cout</span> &lt;&lt; <span class="string">"Generated data: "</span> &lt;&lt; data &lt;&lt; <span class="string">"\n"</span>;</span><br><span class="line">        <span class="built_in">cout</span> &lt;&lt; <span class="string">"MD5 Hash: "</span> &lt;&lt; md5Hash &lt;&lt; <span class="string">"\n"</span>;</span><br><span class="line">        <span class="keyword">if</span>(md5Hash == <span class="string">"8a2fc1e9e2830c37f8a7f51572a640aa"</span>)</span><br><span class="line">        {</span><br><span class="line">            <span class="built_in">cout</span> &lt;&lt; <span class="string">"Find match MD5!"</span> &lt;&lt; <span class="string">"\n"</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">return</span> <span class="number">0</span>;</span><br><span class="line">}</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></pre></td><td class="code"><pre><span class="line">Generated data: salt=tlkyeueq7fej8vtzitt26yl24kswrgm5&amp;t=1751994277&amp;r=101356418&amp;a=1388848462&amp;b=441975230&amp;x=1469980073&amp;y=290308156</span><br><span class="line">MD5 Hash: 8a2fc1e9e2830c37f8a7f51572a640aa</span><br><span class="line">Find match MD5!</span><br></pre></td></tr></tbody></table></figure><p>再计算 <code>Generated data</code> 的 SHA1 值即得到 flag。</p>]]>
    </content>
    <id>https://watermelonabc.top/p/4ec635b1/</id>
    <link href="https://watermelonabc.top/p/4ec635b1/" rel="alternate"/>
    <published>2025-07-14T02:05:13.000Z</published>
    <summary>哈希米哈希米~哈！</summary>
    <title>Hash 系列算法</title>
    <updated>2026-05-11T08:32:33.000Z</updated>
  </entry>
</feed>
