<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>rss</id>
    <title>Korbin's blog</title>
    <updated>2026-05-08T00:37:58.783Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://www.vhcffh.com"/>
    <subtitle>一个简单的个人网站，用于记录个人笔记、工具、项目等</subtitle>
    <icon>https://www.vhcffh.com/favicon.ico</icon>
    <entry>
        <title type="html"><![CDATA[STM32 Flash 读写与存储架构详解]]></title>
        <id>/blog/2026/STM32-flash-ram-cache</id>
        <link href="https://www.vhcffh.com/blog/2026/STM32-flash-ram-cache"/>
        <updated>2026-04-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[深入记录STM32F407存储外设的地址映射、ART加速器原理及Flash读写注意事项]]></summary>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="stm32-flash-读写与存储架构详解"><span>STM32 Flash 读写与存储架构详解</span><a href="#stm32-flash-读写与存储架构详解" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>在进行 STM32 嵌入式开发时，理解存储架构（Flash、SRAM、CCM RAM）及其访问特性是性能优化的基础。本文以 STM32F407 为例，总结其存储特性。</p>
<h2 class="rp-toc-include" id="地址空间映射"><a href="#地址空间映射" class="rp-header-anchor rp-link" aria-hidden="true">#</a>地址空间映射</h2>
<p>STM32F407 拥有 4GB 的线性地址空间，其内部存储器的分配如下表所示：</p>















































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">类型</th><th style="text-align:left">起始地址</th><th style="text-align:left">总线连接</th><th style="text-align:left">空间大小</th><th style="text-align:left">特点</th></tr></thead><tbody><tr><td style="text-align:left"><strong>Flash</strong></td><td style="text-align:left"><code>0x08000000</code></td><td style="text-align:left">I-Bus / D-Bus</td><td style="text-align:left">Up to 1 MB</td><td style="text-align:left">非易失性存储，存放程序代码和常量数据。</td></tr><tr><td style="text-align:left"><strong>SRAM1</strong></td><td style="text-align:left"><code>0x20000000</code></td><td style="text-align:left">System Bus</td><td style="text-align:left">112 KB</td><td style="text-align:left">主系统 RAM，支持 DMA 访问。</td></tr><tr><td style="text-align:left"><strong>SRAM2</strong></td><td style="text-align:left"><code>0x2001C000</code></td><td style="text-align:left">System Bus</td><td style="text-align:left">16 KB</td><td style="text-align:left">辅助 RAM，常用于特定外设缓存。</td></tr><tr><td style="text-align:left"><strong>CCM RAM</strong></td><td style="text-align:left"><code>0x10000000</code></td><td style="text-align:left">D-Bus</td><td style="text-align:left">64 KB</td><td style="text-align:left"><strong>核心耦合存储器</strong>。速度最快，但<strong>不支持 DMA</strong>。</td></tr><tr><td style="text-align:left"><strong>Backup SRAM</strong></td><td style="text-align:left"><code>0x40024000</code></td><td style="text-align:left">AHB Bus</td><td style="text-align:left">4 KB</td><td style="text-align:left">低功耗备份 RAM，Vbat 供电时数据不丢失。</td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="flash-等待周期与-art-加速器"><a href="#flash-等待周期与-art-加速器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Flash 等待周期与 ART 加速器</h2>
<p>STM32F407 的主频最高可达 168MHz，而内部 Flash 的访问频率通常较低（约 30MHz）。为了匹配 CPU 的高速处理能力，意法半导体引入了 <strong>ART 加速器 (Adaptive Real-Time Accelerator)</strong>。</p>
<h3 class="rp-toc-include" id="1-等待周期-wait-states"><a href="#1-等待周期-wait-states" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1. 等待周期 (Wait States)</h3>
<p>在不同的工作频率下，必须配置正确的等待周期（Latency）：</p>

























<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">HCLK 频率 (Vdd=3.3V)</th><th style="text-align:left">等待周期 (WS)</th></tr></thead><tbody><tr><td style="text-align:left">0 &lt; HCLK ≤ 30 MHz</td><td style="text-align:left">0 WS</td></tr><tr><td style="text-align:left">30 &lt; HCLK ≤ 60 MHz</td><td style="text-align:left">1 WS</td></tr><tr><td style="text-align:left">60 &lt; HCLK ≤ 90 MHz</td><td style="text-align:left">2 WS</td></tr><tr><td style="text-align:left">150 &lt; HCLK ≤ 168 MHz</td><td style="text-align:left"><strong>5 WS</strong></td></tr></tbody></table></div>
<h3 class="rp-toc-include" id="2-art-加速器原理"><a href="#2-art-加速器原理" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2. ART 加速器原理</h3>
<p>ART 加速器包含：</p>
<ul>
<li><strong>128位预取队列</strong>：每次从 Flash 读取 128 位数据（4 条指令）。</li>
<li><strong>指令缓存 (I-Cache)</strong>：64 行 128 位缓存。</li>
<li><strong>数据缓存 (D-Cache)</strong>：8 行 128 位缓存。</li>
</ul>
<p><strong>启用建议</strong>：在初始化系统时，务必开启加速器。</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-foreground)">FLASH</span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-foreground)">ACR </span><span style="color:var(--shiki-token-keyword)">|=</span><span style="color:var(--shiki-foreground)"> FLASH_ACR_ICEN </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> FLASH_ACR_DCEN </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> FLASH_ACR_PRFTEN </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> FLASH_ACR_LATENCY_5WS;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="ccm-ram被忽视的性能利器"><a href="#ccm-ram被忽视的性能利器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CCM RAM：被忽视的性能利器</h2>
<p><strong>CCM (Core Coupled Memory)</strong> 直接连接到 CPU 的 D-Bus，访问延迟极低，非常适合存放：</p>
<ul>
<li>任务栈 (Stack)</li>
<li>频繁调用的全局变量</li>
<li>关键算法代码 (需从 Flash 拷贝至此运行)</li>
</ul>
<p><strong>注意陷阱</strong>：CCM RAM <strong>不经过总线矩阵</strong>，因此 <strong>DMA 控制器无法直接访问 CCM RAM</strong>。如果你将 DMA 缓冲区设置在 CCM 中，DMA 传输会直接失败。</p>
<h2 class="rp-toc-include" id="flash-读写注意事项"><a href="#flash-读写注意事项" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Flash 读写注意事项</h2>
<h3 class="rp-toc-include" id="1-扇区结构-sector-layout"><a href="#1-扇区结构-sector-layout" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1. 扇区结构 (Sector Layout)</h3>
<p>STM32F407 的 Flash 扇区大小不均匀（非对齐）：</p>
<ul>
<li><strong>Sector 0-3</strong>: 16 KB</li>
<li><strong>Sector 4</strong>: 64 KB</li>
<li><strong>Sector 5-11</strong>: 128 KB</li>
</ul>
<p>这种设计导致在将 Flash 当作 EEPROM 使用时，如果需要擦除 Sector 11，必须一次性擦除 128KB 数据，极其耗时且影响寿命。</p>
<div class="rp-callout rp-callout--warning"><div class="rp-callout__title">Warning</div><div class="rp-callout__content"><p>
如果有变量存储 CCM RAM ，在进行 Flash 擦除/写入时，必须禁用 ART 数据缓存才能正常写入，否则写入时会返回<code>FLASH_ERROR_PROGRAM</code>错误。因为 CCM RAM 和写 Flash 都是通过D-Bus进行访问，而开启数据缓存时，硬件会周期性访问 CCM RAM 进行缓存同步，导致写 Flash 时 D-Bus 总线占用，写入失败。</p></div></div>
<h3 class="rp-toc-include" id="2-写入规则"><a href="#2-写入规则" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2. 写入规则</h3>
<ul>
<li><strong>先擦后写</strong>：Flash 只能将位从 <code>1</code> 变为 <code>0</code>。写入前必须执行扇区擦除。</li>
<li><strong>对齐要求</strong>：F4 系列通常支持 byte (8-bit), half-word (16-bit), word (32-bit), double word (64-bit) 写入，取决于供电电压。</li>
</ul>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://www.st.com.cn/resource/en/reference_manual/rm0090-stm32f405415-stm32f407417-stm32f427437-and-stm32f429439-advanced-armbased-32bit-mcus-stmicroelectronics.pdf" target="_blank" rel="noopener noreferrer" class="rp-link">STM32F4xx Reference Manual (RM0090)</a></li>
<li><a href="https://developer.arm.com/documentation/dui0553/a/the-cortex-m4-processor/memory-model/memory-regions--types-and-attributes" target="_blank" rel="noopener noreferrer" class="rp-link">Cortex-M4 Memory Map Guide</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[ollama 使用记录]]></title>
        <id>/blog/2026/ollama-config</id>
        <link href="https://www.vhcffh.com/blog/2026/ollama-config"/>
        <updated>2026-04-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[记录ollama服务配置及问题排查方法。]]></summary>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="ollama-使用记录"><span>ollama 使用记录</span><a href="#ollama-使用记录" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><ol>
<li>修改监听IP</li>
</ol>
<p>wsl2环境下，ollama安装后默认监听<code>127.0.0.1</code>，在docker运行的容器通过<code>http://host.docker.internal:11434</code>也无法访问，修改成监听<code>0.0.0.0</code>便可以访问了。</p>
<p>通过在服务配置中的增加环境变量<code>OLLAMA_HOST</code>进行修改（修改后需要重启服务）:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>...</span></span>
<span class="line"><span>[Unit]</span></span>
<span class="line"><span>Description=Ollama Service</span></span>
<span class="line"><span>After=network-online.target</span></span>
<span class="line"><span></span></span>
<span class="line"><span>[Service]</span></span>
<span class="line"><span>ExecStart=/usr/local/bin/ollama serve</span></span>
<span class="line"><span>User=ollama</span></span>
<span class="line"><span>Group=ollama</span></span>
<span class="line"><span>Restart=always</span></span>
<span class="line"><span>RestartSec=3</span></span>
<span class="line"><span>Environment=&quot;OLLAMA_HOST=0.0.0.0:11434&quot;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>...</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ol start="2">
<li>日志查看</li>
</ol>
<p>通过<code>journalctl -u ollama -f</code>可查看日志信息，环境变量中增加<code>OLLAMA_DEBUG=1</code>会输出更详细的日志信息，</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://docs.ollama.com/" target="_blank" rel="noopener noreferrer" class="rp-link">https://docs.ollama.com/</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C++11 新特性总结]]></title>
        <id>/blog/2026/C++11-new-feature</id>
        <link href="https://www.vhcffh.com/blog/2026/C++11-new-feature"/>
        <updated>2026-04-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[总结C++11带来的新特性：nullptr、auto、decltype、lambda、array、forward_list、tuple、move、bind]]></summary>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="c11-新特性总结"><span>C++11 新特性总结</span><a href="#c11-新特性总结" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>C++11 是 C++ 程序设计语言标准的一个重要版本，于 2011 年由 ISO 正式发布，取代了原有的 C++98/03 标准。C++11 在核心语法、STL 标准模板库等方面增加了众多新功能，例如新增 <code>nullptr</code>、<code>auto</code>、<code>decltype</code> 关键字，引入 Lambda 表达式、<code>std::array</code>、<code>std::forward_list</code>、<code>std::tuple</code> 等容器，以及右值引用与移动语义等。下面将对这些新特性逐一总结。</p>
<h2 class="rp-toc-include" id="nullptr"><a href="#nullptr" class="rp-header-anchor rp-link" aria-hidden="true">#</a>nullptr</h2>
<p><code>nullptr</code> 出现的目的是为了替代 <code>NULL</code>。</p>
<p>在某种意义上来说，传统 C++ 会把 <code>NULL</code>、0 视为同一种东西，这取决于编译器如何定义 <code>NULL</code>，有些编译器会将 <code>NULL</code> 定义为 <code>((void\*)0)</code>，有些则会直接将其定义为 0。</p>
<p>C++ 不允许直接将 <code>void *</code> 隐式转换到其他类型，但如果 NULL 被定义为 <code>((void*)0)</code>，那么当编译 <code>char *ch = NULL;</code> 时，NULL 只好被定义为 0。</p>
<p>而这依然会产生问题，将导致了 C++ 中重载特性会发生混乱，考虑：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> foo</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> foo</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>对于这两个函数来说，如果 NULL 被定义为了 0，那么 <code>foo(NULL);</code> 这个语句将会去调用 <code>foo(int)</code>，从而导致行为违反直觉。</p>
<p>为了解决这个问题，C++11 引入了 nullptr 关键字，专门用来区分空指针、0。</p>
<p>nullptr 的类型为 <code>nullptr_t</code>，能够隐式的转换为任何指针或成员指针的类型，也能和他们进行相等或者不等的比较。</p>
<p><strong>当需要使用 NULL 时候，养成直接使用 nullptr的习惯。</strong></p>
<h2 class="rp-toc-include" id="类型推导"><a href="#类型推导" class="rp-header-anchor rp-link" aria-hidden="true">#</a>类型推导</h2>
<p>C++11 引入了 auto 和 decltype 这两个关键字实现了类型推导，让编译器来操心变量的类型。</p>
<h3 class="rp-toc-include" id="auto关键字"><a href="#auto关键字" class="rp-header-anchor rp-link" aria-hidden="true">#</a>auto关键字</h3>
<p>auto 在很早以前就已经进入了 C++，但是他始终作为一个存储类型的指示符存在，与 register 并存。在传统 C++ 中，如果一个变量没有声明为 register 变量，将自动被视为一个 auto 变量。而随着 register 被弃用，对 auto 的语义变更也就非常自然了：可以让编译器自动分析初始值来判断变量所属的类型。当然，使用 auto 必须确定初始值。</p>
<p>使用 auto 进行类型推导的一个最为常见而且显著的例子就是迭代器。在以前我们需要这样来书写一个迭代器：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)">(vector&lt;</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">&gt;</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">const_iterator itr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> vec</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">cbegin</span><span style="color:var(--shiki-foreground)">(); itr </span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-token-constant)"> vec</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">cend</span><span style="color:var(--shiki-foreground)">(); </span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">itr)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>而有了 auto 之后可以：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-comment)">// 由于 cbegin() 将返回 vector&lt;int&gt;::const_iterator</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 所以 itr 也应该是 vector&lt;int&gt;::const_iterator 类型</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> itr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> vec</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">cbegin</span><span style="color:var(--shiki-foreground)">(); itr </span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-token-constant)"> vec</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">cend</span><span style="color:var(--shiki-foreground)">(); </span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">itr) {</span><span style="color:var(--shiki-token-comment)"> /* ... */</span><span style="color:var(--shiki-foreground)"> }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>一些其他的常见用法：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">             // i 被推导为 int</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> arr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-keyword)"> auto</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-comment)"> // arr 被推导为 int *</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> make_shared</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-function)">string</span><span style="color:var(--shiki-foreground)">&gt;(</span><span style="color:var(--shiki-token-string-expression)">&quot;hello world&quot;</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)"> // a 被推导为 shared_ptr&lt;string&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-callout rp-callout--note"><div class="rp-callout__title">Note</div><div class="rp-callout__content"><p>
注意：auto 不能用于函数传参，因此下面的做法是无法通过编译的（考虑重载的问题，我们应该使用模板）。此外，auto 也不能用于推导数组类型。</p></div></div>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> add</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> auto</span><span style="color:var(--shiki-foreground)"> y);</span><span style="color:var(--shiki-token-comment)"> // 错误：auto 不能用于函数参数</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iostream&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    auto</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-token-constant)"> arr</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    auto</span><span style="color:var(--shiki-foreground)"> auto_arr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> arr;</span><span style="color:var(--shiki-token-comment)">      // 合法，auto_arr 被推导为 int*</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    auto</span><span style="color:var(--shiki-token-constant)"> auto_arr2</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> arr;</span><span style="color:var(--shiki-token-comment)"> // 错误：auto 不能用于数组声明</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="decltype关键字"><a href="#decltype关键字" class="rp-header-anchor rp-link" aria-hidden="true">#</a>decltype关键字</h3>
<p>decltype 关键字用于在编译时推导表达式的类型，而不会实际计算表达式的值。它的用法和 <code>sizeof</code> 很相似：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">decltype</span><span style="color:var(--shiki-foreground)">(表达式)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>例如：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> y </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">decltype</span><span style="color:var(--shiki-foreground)">(x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y) z;</span><span style="color:var(--shiki-token-comment)"> // z 的类型被推导为 int</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>变量 x 和 y 的类型都为 int，让编译器通过推断括号里的表达式来判断 z 的类型。我们很容易得出 z 的类型也为 int。</p>
<h3 class="rp-toc-include" id="拖尾返回类型auto-与-decltype-配合"><a href="#拖尾返回类型auto-与-decltype-配合" class="rp-header-anchor rp-link" aria-hidden="true">#</a>拖尾返回类型、auto 与 decltype 配合</h3>
<p>你可能会思考，auto 能不能用于推导函数的返回类型。考虑这样一个例子加法函数的例子，在传统 C++ 中我们必须这么写（T 和 U 可能是不同类型）：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">typename</span><span style="color:var(--shiki-token-function)"> R</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> typename</span><span style="color:var(--shiki-token-function)"> T</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> typename</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">R</span><span style="color:var(--shiki-token-function)"> add</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">T</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-foreground)"> y) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>这样的代码其实变得很丑陋，因为程序员在使用这个模板函数的时候，必须明确指出返回类型。但事实上我们并不知道 add() 这个函数会做什么样的操作，获得一个什么样的返回类型。</p>
<p>在 C++11 中这个问题得到解决。虽然你可能马上回反应出来使用 decltype 推导 x+y 的类型，写出这样的代码：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">decltype</span><span style="color:var(--shiki-foreground)">(x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y) </span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-foreground)">(T x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> U y);</span><span style="color:var(--shiki-token-comment)"> // 错误：x 和 y 尚未定义</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>但事实上这样的写法并不能通过编译。这是因为在编译器读到 decltype(x+y) 时，x 和 y 尚未被定义。为了解决这个问题，C++11 还引入了一个叫做<strong>拖尾返回类型</strong>（trailing return type），利用 auto 关键字将返回类型后置：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">typename</span><span style="color:var(--shiki-token-function)"> T</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> typename</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-token-function)"> add</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">T</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-foreground)"> y)</span><span style="color:var(--shiki-token-punctuation)"> -&gt;</span><span style="color:var(--shiki-token-function)"> decltype</span><span style="color:var(--shiki-foreground)">(x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>从 C++14 开始是可以直接让普通函数具备返回值推导，因此下面的写法变得合法：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">typename</span><span style="color:var(--shiki-token-function)"> T</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> typename</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-token-function)"> add</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">T</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-foreground)"> y) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="区间迭代---基于范围的-for-循环"><a href="#区间迭代---基于范围的-for-循环" class="rp-header-anchor rp-link" aria-hidden="true">#</a>区间迭代 - 基于范围的 for 循环</h2>
<p>C++11 引入了基于范围的迭代写法，我们拥有了能够写出像 Python 一样简洁的循环语句。
最常用的 std::vector 遍历将从原来的样子：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">vector</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">&gt; </span><span style="color:var(--shiki-token-function)">arr</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 100</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)">(std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector&lt;</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">&gt;</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">iterator i </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> arr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">(); i </span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-token-constant)"> arr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">(); </span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">i) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>变得非常的简单：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)"> arr) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="初始化列表"><a href="#初始化列表" class="rp-header-anchor rp-link" aria-hidden="true">#</a>初始化列表</h2>
<p>在传统 C++ 中，不同的对象有着不同的初始化方法，例如普通数组、POD （plain old data，没有构造、析构和虚函数的类或结构体）类型都可以使用 {} 进行初始化，也就是我们所说的初始化列表。而对于类对象的初始化，要么需要通过拷贝构造函数、要么就需要使用 () 进行。这些不同方法都针对各自对象。在传统C++中可以使用初始化列表如下：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-comment)">// 普通数组</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-constant)"> i_arr</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> { </span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-foreground)"> };</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// POD类型：结构体</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">struct</span><span style="color:var(--shiki-token-function)"> A</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> x;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    struct</span><span style="color:var(--shiki-token-function)"> B</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> i;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> j;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    } b;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">} a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> { </span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> { </span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-foreground)"> } };</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 拷贝初始化（copy-initialization）</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> Foo</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    Foo</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">) {}</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    Foo</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-function)"> Foo</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">} foo </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 123</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">  // 需要拷贝构造函数</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 直接初始化：使用 () 进行</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> j</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">Foo</span><span style="color:var(--shiki-token-function)"> bar</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">123</span><span style="color:var(--shiki-foreground)">);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>为了统一初始化方式，并且让初始化行为具有确定的效果，C++11 中提出了列表初始化（List-initialization）的概念。</p>
<p>C++11 首先把初始化列表的概念绑定到了类型上，并将其称之为 <code>initializer_list</code>，允许构造函数或其他函数像参数一样使用初始化列表，这就为类对象的初始化与普通数组和 POD 的初始化方法提供了统一的桥梁。可以拿个类模板 <code>initializer_list</code> 作为构造函数的参数，则初始化列表就智能用于构造该函数。值得注意的是列表中的元素必须是同一种类型或者可以转化为同一种类型。</p>
<p>【实例】通过初始化列表初始化对象。</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> Foo</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">public</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    Foo</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">) {}</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">private</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    Foo</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-function)"> Foo</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 调用Foo(int)构造函数初始化（c++98编译通过 c++11编译通过）</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    Foo </span><span style="color:var(--shiki-token-function)">a1</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">123</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 报错：Foo的拷贝构造函数声明为私有的，该语句属于拷贝初始化，语义上需要拷贝构造函数参与，因此私有拷贝构造会导致编译错误（即使实际可能被优化掉）</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    Foo a2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 123</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 列表初始化（c++98编译失败 c++11编译通过）</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    Foo a3 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> { </span><span style="color:var(--shiki-token-constant)">123</span><span style="color:var(--shiki-foreground)"> };</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 列表初始化（c++98编译失败 c++11编译通过）</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    Foo a4 { </span><span style="color:var(--shiki-token-constant)">123</span><span style="color:var(--shiki-foreground)"> };</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 列表初始化（C++98 编译通过，C++11 编译通过）</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> a5 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> { </span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)"> };</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 列表初始化（C++98 编译失败，C++11 编译通过）</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> a6 { </span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)"> };</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>在上例中，a3、a4 使用了新的初始化方式来初始化对象，效果如同 a1 的直接初始化。a5、a6 则是基本数据类型的列表初始化方式。可以看到，它们的形式都是统一的。</p>
<p>这里需要注意的是，a3 虽然使用了等于号，但它仍然是列表初始化，语义上需要拷贝构造函数。但在实际编译器（如 g++）中，由于 copy elision 优化，可能不会报错。</p>
<p>a4 和 a6 的写法，是 C++98/03 所不具备的。在 C++11 中，可以直接在变量名后面跟上初始化列表，来进行对象的初始化。</p>
<p>同时列表初始化方法也适用于用new操作等圆括号进行初始化的地方，如下：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int*</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> { </span><span style="color:var(--shiki-token-constant)">123</span><span style="color:var(--shiki-foreground)"> };</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">double</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> double</span><span style="color:var(--shiki-foreground)"> { </span><span style="color:var(--shiki-token-constant)">12.12</span><span style="color:var(--shiki-foreground)"> };</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int*</span><span style="color:var(--shiki-foreground)"> arr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">] { </span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-foreground)"> };</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>让人惊奇的是在 C++11 中可以使用列表初始化方法对堆中分配的内存的数组进行初始化，而在 C++98/03 中是不能这样做的。</p>
<h2 class="rp-toc-include" id="模板增强"><a href="#模板增强" class="rp-header-anchor rp-link" aria-hidden="true">#</a>模板增强</h2>
<h3 class="rp-toc-include" id="外部模板"><a href="#外部模板" class="rp-header-anchor rp-link" aria-hidden="true">#</a>外部模板</h3>
<p>传统 C++ 中，模板只有在使用时才会被编译器实例化。只要在每个编译单元（文件）中编译的代码中遇到了被完整定义的模板，都会实例化。这就产生了重复实例化而导致的编译时间的增加。并且，我们<strong>没有办法通知编译器不要触发模板实例化</strong>。</p>
<p>C++11 引入了外部模板，扩充了原来的强制编译器在特定位置实例化模板的语法，使得<strong>能够显式的告诉编译器何时进行模板的实例化</strong>：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-token-function)"> std</span><span style="color:var(--shiki-foreground)">::</span><span style="color:var(--shiki-token-function)">vector</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">bool</span><span style="color:var(--shiki-foreground)">&gt;;</span><span style="color:var(--shiki-token-comment)">            // 强行实例化</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">extern</span><span style="color:var(--shiki-token-keyword)"> template</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-token-function)"> std</span><span style="color:var(--shiki-foreground)">::</span><span style="color:var(--shiki-token-function)">vector</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">double</span><span style="color:var(--shiki-foreground)">&gt;;</span><span style="color:var(--shiki-token-comment)">  // 不在该编译文件中实例化模板</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="尖括号-"><a href="#尖括号-" class="rp-header-anchor rp-link" aria-hidden="true">#</a>尖括号 “&gt;”</h3>
<p>在传统 C++ 的编译器中，&gt;&gt; 一律被当做右移运算符来进行处理。但实际上我们很容易就写出了嵌套模板的代码：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;&gt;</span><span style="color:var(--shiki-foreground)"> wow;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>这在传统C++编译器下是不能够被编译的，而 C++11 开始，连续的右尖括号将变得合法，并且能够顺利通过编译。</p>
<h3 class="rp-toc-include" id="类型别名模板"><a href="#类型别名模板" class="rp-header-anchor rp-link" aria-hidden="true">#</a>类型别名模板</h3>
<p>在传统 C++ 中，typedef 可以为类型定义一个新的名称，但是却没有办法为模板定义一个新的名称。因为，模板不是类型。例如：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">typename</span><span style="color:var(--shiki-token-function)"> T</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> typename</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-token-function)"> value</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> SuckType</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">public</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    T a;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    U b;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    SuckType</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">        :</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-foreground)">(value)</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">        ,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-foreground)">(value) {}</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">typename</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-foreground)">&gt; </span><span style="color:var(--shiki-token-keyword)">typedef</span><span style="color:var(--shiki-foreground)"> SuckType</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> U</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> NewType;</span><span style="color:var(--shiki-token-comment)">   // 不合法</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>C++11 使用 using 引入了下面这种形式的写法，并且同时支持对传统 typedef 相同的功效：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-foreground)"> &lt;</span><span style="color:var(--shiki-token-keyword)">typename</span><span style="color:var(--shiki-token-function)"> T</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">using</span><span style="color:var(--shiki-token-function)"> NewType</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-function)"> SuckType</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> T</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">&gt;;</span><span style="color:var(--shiki-token-comment)">    // 合法</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="默认模板参数"><a href="#默认模板参数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>默认模板参数</h3>
<p>我们可能定义了一个加法函数：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">typename</span><span style="color:var(--shiki-token-function)"> T</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> typename</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-token-function)"> add</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">T</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-foreground)"> y)</span><span style="color:var(--shiki-token-punctuation)"> -&gt;</span><span style="color:var(--shiki-token-function)"> decltype</span><span style="color:var(--shiki-foreground)">(x</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">y) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">y</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>但在使用时发现，要使用 add，就必须每次都指定其模板参数的类型。
在 C++11 中提供了一种便利，可以指定模板的默认参数：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">typename</span><span style="color:var(--shiki-token-function)"> T</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-foreground)"> int</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> typename</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-foreground)"> int&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-token-function)"> add</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">T</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> U</span><span style="color:var(--shiki-foreground)"> y)</span><span style="color:var(--shiki-token-punctuation)"> -&gt;</span><span style="color:var(--shiki-token-function)"> decltype</span><span style="color:var(--shiki-foreground)">(x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="构造函数"><a href="#构造函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>构造函数</h2>
<h3 class="rp-toc-include" id="委托构造"><a href="#委托构造" class="rp-header-anchor rp-link" aria-hidden="true">#</a>委托构造</h3>
<p>C++11 引入了委托构造的概念，这使得构造函数可以在同一个类中一个构造函数调用另一个构造函数，从而达到简化代码的目的：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> Base</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">public</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> value1;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> value2;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    Base</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        value1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    Base</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> value) </span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-function)"> Base</span><span style="color:var(--shiki-foreground)">() {</span><span style="color:var(--shiki-token-comment)">  // 委托 Base() 构造函数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        value2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="继承构造"><a href="#继承构造" class="rp-header-anchor rp-link" aria-hidden="true">#</a>继承构造</h3>
<p>在继承体系中，如果派生类想要使用基类的构造函数，需要在构造函数中显式声明。
假若基类拥有为数众多的不同版本的构造函数，这样，在派生类中得写很多对应的“透传”构造函数。如下：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">struct</span><span style="color:var(--shiki-token-function)"> A</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  A</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i) {}</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  A</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">double</span><span style="color:var(--shiki-foreground)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i) {}</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  A</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">float</span><span style="color:var(--shiki-foreground)"> f</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-keyword)"> char*</span><span style="color:var(--shiki-foreground)"> c) {}</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">  // ...等等系列的构造函数版本</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">struct</span><span style="color:var(--shiki-token-function)"> B</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-function)">A</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  B</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i)</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-function)">A</span><span style="color:var(--shiki-foreground)">(i) {}</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  B</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">double</span><span style="color:var(--shiki-foreground)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i)</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-function)">A</span><span style="color:var(--shiki-foreground)">(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">i) {}</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  B</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">float</span><span style="color:var(--shiki-foreground)"> f</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-keyword)"> char*</span><span style="color:var(--shiki-foreground)"> c)</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-function)">A</span><span style="color:var(--shiki-foreground)">(f</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">i</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">c) {}</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">  // ......等等好多个和基类构造函数对应的构造函数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>C++11的继承构造：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">struct</span><span style="color:var(--shiki-token-function)"> A</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  A</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i) {}</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  A</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">double</span><span style="color:var(--shiki-foreground)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i){}</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  A</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">float</span><span style="color:var(--shiki-foreground)"> f</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-keyword)"> char*</span><span style="color:var(--shiki-foreground)"> c){}</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">  // ...等等系列的构造函数版本</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">struct</span><span style="color:var(--shiki-token-function)"> B</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-function)">A</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  using</span><span style="color:var(--shiki-foreground)"> A</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">A;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">  // 关于基类各构造函数的继承一句话搞定</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">  // ......</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>如果一个继承构造函数不被相关的代码使用，编译器不会为之产生真正的函数代码，这样比透传基类各种构造函数更加节省目标代码空间。</p>
<h2 class="rp-toc-include" id="lambda表达式"><a href="#lambda表达式" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Lambda表达式</h2>
<p>C++11 新标准新增的一项重要功能就是 lambda 表达式，所谓 Lambda 表达式实际上就是提供了一个类似匿名函数的特性，而匿名函数则是在需要一个函数，但是又不想费力去命名一个函数的情况下去使用的。</p>
<p>Lambda 的组成结构与函数很相似，它拥有一个返回类型，一个形参列表，一个函数体。Lambda 也可以定义在函数内部。它的组成结构如下：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-foreground)">[capture list] (</span><span style="color:var(--shiki-token-function)">parameter</span><span style="color:var(--shiki-foreground)"> list) option -&gt; </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-token-keyword)"> type</span><span style="color:var(--shiki-foreground)"> { function body}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ul>
<li>capture list 表示捕获列表，也就是 lambda 所在函数中的局部变量的列表，如果没有，则这个列表为空。
<ul>
<li>
<p>[] 不捕获任何变量。</p>
</li>
<li>
<p>[&amp;] 捕获外部作用域中所有变量，并作为引用在函数体中使用（按引用捕获）。</p>
</li>
<li>
<p>[=] 捕获外部作用域中所有变量，并作为副本在函数体中使用(按值捕获)。注意值捕获的前提是变量可以拷贝，且被捕获的变量在 lambda 表达式被创建时拷贝，而非调用时才拷贝。如果希望 lambda 表达式在调用时能即时访问外部变量，我们应当使用引用方式捕获。</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a; };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-function)"> f</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> endl;</span><span style="color:var(--shiki-token-comment)"> // 输出0</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">a] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a; };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-function)"> f</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出1</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>[=,&amp;foo] 按值捕获外部作用域中所有变量，并按引用捕获 foo 变量。</p>
</li>
<li>
<p>[bar] 按值捕获 bar 变量，同时不捕获其他变量。</p>
</li>
<li>
<p>[this] 捕获当前类中的 this 指针，让 lambda 表达式拥有和当前类成员函数同样的访问权限。如果已经使用了 &amp; 或者 =，就默认添加此选项。捕获 this 的目的是可以在 lamda 中使用当前类的成员函数和成员变量。</p>
</li>
</ul>
</li>
</ul>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> A</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)"> public</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     int</span><span style="color:var(--shiki-foreground)"> i_ </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     void</span><span style="color:var(--shiki-token-function)"> func</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> y){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         auto</span><span style="color:var(--shiki-foreground)"> x1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> i_; };</span><span style="color:var(--shiki-token-comment)">                   // error,没有捕获外部变量</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         auto</span><span style="color:var(--shiki-foreground)"> x2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> i_ </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y; };</span><span style="color:var(--shiki-token-comment)">          // OK</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         auto</span><span style="color:var(--shiki-foreground)"> x3 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> i_ </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y; };</span><span style="color:var(--shiki-token-comment)">        // OK</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         auto</span><span style="color:var(--shiki-foreground)"> x4 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-foreground)">] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> i_; };</span><span style="color:var(--shiki-token-comment)">               // OK</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         auto</span><span style="color:var(--shiki-foreground)"> x5 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-foreground)">] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> i_ </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y; };</span><span style="color:var(--shiki-token-comment)">       // error,没有捕获x,y</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         auto</span><span style="color:var(--shiki-foreground)"> x6 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> y] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> i_ </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y; };</span><span style="color:var(--shiki-token-comment)">     // OK</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         auto</span><span style="color:var(--shiki-foreground)"> x7 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-foreground)">] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> i_</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">; };</span><span style="color:var(--shiki-token-comment)">             // OK</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	}</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)"> ,</span><span style="color:var(--shiki-foreground)"> b</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a; };</span><span style="color:var(--shiki-token-comment)">                         // error,没有捕获外部变量</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)"> };</span><span style="color:var(--shiki-token-comment)">                      // OK</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f3 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a; };</span><span style="color:var(--shiki-token-comment)">                        // OK</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f4 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">] {</span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">; };</span><span style="color:var(--shiki-token-comment)">                       // error,a是以复制方式捕获的，无法修改</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f5 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [a] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">b; };</span><span style="color:var(--shiki-token-comment)">                      // error,没有捕获变量b</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f6 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-foreground)">b] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> (b</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">); };</span><span style="color:var(--shiki-token-comment)">                // OK</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f7 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-foreground)">b] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> (b</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">); };</span><span style="color:var(--shiki-token-comment)">                // OK</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ul>
<li>Parameter list 为形参列表。（选填）</li>
<li>option 是函数选项；可以填 mutable,exception,attribute。（选填）
<ul>
<li>mutable说明lambda表达式体内的代码可以修改被捕获的变量，并且可以访问被捕获的对象的non-const方法。</li>
<li>exception说明lambda表达式是否抛出异常以及何种异常。</li>
<li>attribute用来声明属性。</li>
<li>return type 表示该 lambda 的返回类型。（选填）</li>
</ul>
</li>
<li>Function body 是函数体，这些和函数表示是一样的。</li>
</ul>
<p>需要注意的是，如果有返回类型，lambda 必须使用尾置返回来确定类型。另外，lambda 必须包括捕获列表和函数体。另外的几个可以省略。例如：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> fun </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [] {</span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;};</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-function)"> fun</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> endl;</span><span style="color:var(--shiki-token-comment)"> // 输出：1</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a; };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-function)"> f</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> endl;</span><span style="color:var(--shiki-token-comment)"> // 输出0</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">a] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a; };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-function)"> f</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出1</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>我们定义了一个名为 fun 的 lambda 表达式。它只有捕获列表和函数体。这个 lambda 表达式返回值为 1 之后。我们调用这个 lambda，会输出 1。</p>
<p>虽然按值捕获的变量值均复制一份存储在lambda表达式变量中，修改他们也并不会真正影响到外部，但我们却仍然无法修改它们。如果希望去修改按值捕获的外部变量，需要显示指明 lambda 表达式为 mutable。被 mutable 修饰的 lambda 表达式就算没有参数也要写明参数列表。</p>
<p>原因：lambda 表达式可以说是就地定义仿函数闭包的“语法糖”。它的捕获列表捕获住的任何外部变量，最终会变为闭包类型的成员变量。按照 C++ 标准，lambda 表达式的operator() 默认是 const 的，一个 const 成员函数是无法修改成员变量的值的。而 mutable 的作用，就在于取消 operator() 的 const。</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">] { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">; };</span><span style="color:var(--shiki-token-comment)">                // error</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> f2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">] () </span><span style="color:var(--shiki-token-keyword)">mutable</span><span style="color:var(--shiki-foreground)"> { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">; };</span><span style="color:var(--shiki-token-comment)">       // OK</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>lambda表达式的大致原理：每当你定义一个 lambda 表达式后，编译器会自动生成一个匿名类（这个类重载了()运算符），我们称为闭包类型（closure type）。那么在运行时，这个 lambda 表达式就会返回一个匿名的闭包实例，是一个右值。所以，我们上面的 lambda 表达式的结果就是一个个闭包。对于复制传值捕捉方式，类中会相应添加对应类型的非静态数据成员。在运行时，会用复制的值初始化这些成员变量，从而生成闭包。对于引用捕获方式，无论是否标记 mutable，都可以在 lambda 表达式中修改捕获的值。至于闭包类中是否有对应成员，C++ 标准中给出的答案是：不清楚的，与具体实现有关。</p>
<p>lambda 表达式是不能被赋值的：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [] { cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;A&quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> endl; };</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [] { cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;B&quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> endl; };</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> b;</span><span style="color:var(--shiki-token-comment)">   // 非法，lambda无法赋值</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a;</span><span style="color:var(--shiki-token-comment)">   // 合法，生成一个副本</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>闭包类型禁用了赋值操作符，但是没有禁用复制构造函数，所以你仍然可以用一个 lambda 表达式去初始化另外一个 lambda 表达式而产生副本。</p>
<p>在多种捕获方式中，最好不要使用 [=] 和 [&amp;] 默认捕获所有变量。</p>
<p>默认引用捕获所有变量，你有很大可能会出现悬挂引用（Dangling references），因为引用捕获不会延长引用的变量的生命周期：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">function</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">)&gt; </span><span style="color:var(--shiki-token-function)">add_x</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> x)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">](</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a) { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> a; };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>上面函数返回了一个 lambda 表达式，参数 x 仅是一个临时变量，函数 <code>add_x</code> 调用后就被销毁了，但是返回的 lambda 表达式却引用了该变量，当调用这个表达式时，引用的是一个垃圾值，会产生没有意义的结果。上面这种情况，使用默认传值方式可以避免悬挂引用问题。</p>
<p>lambda 表达式可以赋值给对应类型的函数指针。但是使用函数指针并不是那么方便。所以 STL 定义在 &lt; functional &gt; 头文件提供了一个多态的函数对象封装 std::function，其类似于函数指针。它可以绑定任何类函数对象，只要参数与返回类型相同。如下面的返回一个 bool 且接收两个 int 的函数包装器：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">function</span><span style="color:var(--shiki-token-keyword)">&lt;bool</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> wrapper </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [](</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> y) { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)"> y; };</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>lambda 表达式一个更重要的应用是其可以用于函数的参数，通过这种方式可以实现回调函数。</p>
<p>最常用的是在 STL 算法中，比如你要统计一个数组中满足特定条件的元素数量，通过 lambda 表达式给出条件，传递给 <code>count_if</code> 函数：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> value </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;</span><span style="color:var(--shiki-foreground)"> v {</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> count </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">count_if</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">v</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> v</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> [value](</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> x) { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> value; });</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>就可以返回 vector 中值大于 3 的元素数量。</p>
<p>当需要遍历容器并对每个元素进行操作时：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;</span><span style="color:var(--shiki-foreground)"> v </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> { </span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-foreground)"> };</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> even_count </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">for_each</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">v</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> v</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">even_count](</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> val){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">!</span><span style="color:var(--shiki-foreground)">(val </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">)){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        ++</span><span style="color:var(--shiki-foreground)"> even_count;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">});</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;The number of even is &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> even_count </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>大部分 STL 算法，可以非常灵活地搭配 lambda 表达式来实现想要的效果。</p>
<h2 class="rp-toc-include" id="新增容器"><a href="#新增容器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>新增容器</h2>
<h3 class="rp-toc-include" id="stdarray"><a href="#stdarray" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::array</code></h3>
<p>std::array 保存在栈内存中，相比堆内存中的 std::vector，我们能够灵活的访问这里面的元素，从而获得更高的性能。</p>
<p>std::array 会在编译时创建一个固定大小的数组，std::array 不能够被隐式的转换成指针，使用 std::array只需指定其类型和大小即可：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">array</span><span style="color:var(--shiki-token-keyword)">&lt;int</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> arr</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> len </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">array</span><span style="color:var(--shiki-token-keyword)">&lt;int</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> len</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> arr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-foreground)">};</span><span style="color:var(--shiki-token-comment)"> // 非法, 数组大小参数必须是常量表达式1234</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>当我们开始用上了 std::array 时，难免会遇到要将其兼容 C 风格的接口，这里有三种做法：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> foo</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">p</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> len) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">array</span><span style="color:var(--shiki-token-keyword)">&lt;int</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> arr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// C 风格接口传参</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// foo(arr, arr.size());           // 非法, 无法隐式转换</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">foo</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">arr</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> arr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">size</span><span style="color:var(--shiki-foreground)">());</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">foo</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">arr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">data</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> arr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">size</span><span style="color:var(--shiki-foreground)">());</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 使用 `std::sort`</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">sort</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">arr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> arr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">());</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="stdforward_list"><a href="#stdforward_list" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::forward_list</code></h3>
<p><code>std::forward_list</code> 是一个列表容器，使用方法和 <code>std::list</code> 基本类似。
和 <code>std::list</code> 的双向链表的实现不同，<code>std::forward_list</code> 使用单向链表进行实现，提供了 O(1) 复杂度的元素插入，不支持快速随机访问（这也是链表的特点），也是标准库容器中唯一一个不提供 <code>size()</code> 方法的容器。当不需要双向迭代时，具有比 <code>std::list</code>更高的空间利用率。</p>
<h3 class="rp-toc-include" id="无序容器"><a href="#无序容器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>无序容器</h3>
<p>C++11 引入了两组无序容器： <code>std::unordered_set/std::unordered_multiset</code> 和 <code>std::unordered_map/std::unordered_multimap</code>。
无序容器中的元素是不进行排序的，内部通过 Hash 表实现，插入和搜索元素的平均复杂度为 O(1)。</p>
<h3 class="rp-toc-include" id="元组-stdtuple"><a href="#元组-stdtuple" class="rp-header-anchor rp-link" aria-hidden="true">#</a>元组 std::tuple</h3>
<p>元组的使用有三个核心的函数：</p>
<ul>
<li><code>std::make_tuple</code>: 构造元组</li>
<li><code>std::get</code>: 获得元组某个位置的值</li>
<li><code>std::tie</code>: 元组拆包</li>
</ul>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;tuple&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iostream&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-token-function)"> get_student</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> id)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 返回类型被推断为 std::tuple&lt;double, char, std::string&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> (id </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">make_tuple</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">3.8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;A&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;张三&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> (id </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">make_tuple</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">2.9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;C&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;李四&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> (id </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">make_tuple</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1.7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;D&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;王五&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">make_tuple</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">0.0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;D&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;null&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 如果只写 0 会出现推断错误, 编译失败</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    auto</span><span style="color:var(--shiki-foreground)"> student </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> get_student</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;ID: 0, &quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    &lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;GPA: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">get</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">&gt;(student) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;, &quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    &lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;成绩: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">get</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">&gt;(student) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;, &quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    &lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;姓名: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">get</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">&gt;(student) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &#x27;\n&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    double</span><span style="color:var(--shiki-foreground)"> gpa;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    char</span><span style="color:var(--shiki-foreground)"> grade;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">string name;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 元组进行拆包</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">tie</span><span style="color:var(--shiki-foreground)">(gpa</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> grade</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> name) </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> get_student</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;ID: 1, &quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    &lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;GPA: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> gpa </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;, &quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    &lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;成绩: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> grade </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;, &quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    &lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;姓名: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> name </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &#x27;\n&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>合并两个元组，可以通过 <code>std::tuple_cat</code> 来实现。</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> new_tuple </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">tuple_cat</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">get_student</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">move</span><span style="color:var(--shiki-foreground)">(t));</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="正则表达式"><a href="#正则表达式" class="rp-header-anchor rp-link" aria-hidden="true">#</a>正则表达式</h2>
<p>C++11 提供了正则表达式库，用于操作 std::string 对象，对模式 std::regex (本质是 <code>std::basic_regex</code>)进行初始化，通过 <code>std::regex_match</code> 进行匹配，从而产生 std::smatch （本质是 <code>std::match_results</code> 对象）。</p>
<p>我们通过一个简单的例子来简单介绍这个库的使用。考虑下面的正则表达式：</p>
<p>[a-z]+.txt: 在这个正则表达式中, [a-z] 表示匹配一个小写字母, + 可以使前面的表达式匹配多次，因此 [a-z]+ 能够匹配一个及以上小写字母组成的字符串。在正则表达式中一个 . 表示匹配任意字符，而 . 转义后则表示匹配字符 . ，最后的 txt 表示严格匹配 txt 这三个字母。因此这个正则表达式的所要匹配的内容就是文件名为纯小写字母的文本文件。</p>
<p><code>std::regex_match</code>用于匹配字符串和正则表达式，有很多不同的重载形式。最简单的一个形式就是传入std::string以及一个std::regex进行匹配，当匹配成功时，会返回 true，否则返回 false。例如：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iostream&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;string&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;regex&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">string fnames[] </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-string-expression)">&quot;foo.txt&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;bar.txt&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;test&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;a0.txt&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;AAA.txt&quot;</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 在 C++ 中 `\` 会被作为字符串内的转义符，为使 `\.` 作为正则表达式传递进去生效，需要对 `\` 进行二次转义，从而有 `\\.`</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">regex </span><span style="color:var(--shiki-token-function)">txt_regex</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;[a-z]+\\.txt&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-keyword)"> auto</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-foreground)">fname</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)"> fnames)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> fname </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">regex_match</span><span style="color:var(--shiki-foreground)">(fname</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> txt_regex) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>另一种常用的形式就是依次传入std::string/std::smatch/std::regex三个参数，其中 std::smatch 的本质其实是 <code>std::match_results</code>，在标准库中， std::smatch 被定义为了 <code>std::match_results</code>，也就是一个子串迭代器类型的 <code>match_results</code>。使用 std::smatch 可以方便的对匹配的结果进行获取，例如：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">regex</span><span style="color:var(--shiki-token-function)"> base_regex</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;([a-z]+)\\.txt&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">smatch base_match;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-keyword)"> auto</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-foreground)">fname</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)"> fnames) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> (std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">regex_match</span><span style="color:var(--shiki-foreground)">(fname</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> base_match</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> base_regex)) {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        // sub_match 的第一个元素匹配整个字符串</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        // sub_match 的第二个元素匹配了第一个括号表达式</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">base_match</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">size</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">string base </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> base_match</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">str</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;sub-match[0]: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-token-constant)"> base_match</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">str</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> fname </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot; sub-match[1]: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> base </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>以上两个代码段的输出结果为：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>foo.txt: 1</span></span>
<span class="line"><span>bar.txt: 1</span></span>
<span class="line"><span>test: 0</span></span>
<span class="line"><span>a0.txt: 0</span></span>
<span class="line"><span>AAA.txt: 0</span></span>
<span class="line"><span></span></span>
<span class="line"><span>sub-match[0]: foo.txt</span></span>
<span class="line"><span>foo.txt sub-match[1]: foo</span></span>
<span class="line"><span>sub-match[0]: bar.txt</span></span>
<span class="line"><span>bar.txt sub-match[1]: bar</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="语言级线程支持"><a href="#语言级线程支持" class="rp-header-anchor rp-link" aria-hidden="true">#</a>语言级线程支持</h2>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">thread</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">mutex</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">unique_lock</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">future</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">packaged_task</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">condition_variable</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>代码编译需要使用 -pthread 选项。</p>
<h2 class="rp-toc-include" id="右值引用和move语义"><a href="#右值引用和move语义" class="rp-header-anchor rp-link" aria-hidden="true">#</a>右值引用和move语义</h2>
<p>c++11 引入了右值引用和移动语义，为了避免无谓的复制，提高程序性能。</p>
<h3 class="rp-toc-include" id="左值右值"><a href="#左值右值" class="rp-header-anchor rp-link" aria-hidden="true">#</a>左值、右值</h3>
<p>C++ 中所有的值都必然属于左值、右值二者之一。左值是指表达式结束后依然存在的持久化对象，右值是指表达式结束时就不再存在的临时对象。所有的具名变量或者对象都是左值，而右值不具名。很难得到左值和右值的真正定义，但是有一个可以区分左值和右值的便捷方法：看能不能对表达式取地址，如果能，则为左值，否则为右值。</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // a是左值， 5是右值</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> b;</span><span style="color:var(--shiki-token-comment)"> // a、b 都是左值，只不过将 b 可以当做右值使用</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="左值引用右值引用"><a href="#左值引用右值引用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>左值引用、右值引用</h3>
<p>C++98 的引用很常见了，就是给变量取了个别名，在 C++11 中，因为增加了右值引用(rvalue reference)的概念，所以 C++98 中的引用都称为了左值引用(lvalue reference)。</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-comment)">// C++98</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int&amp;</span><span style="color:var(--shiki-foreground)"> refA </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a;</span><span style="color:var(--shiki-token-comment)"> // refA 是 a 的别名，修改 refA 就是修改 a</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">               // a 是左值，&amp;refA 是左值引用</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int&amp;</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 编译错误！1 是右值，不能使用左值引用</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>C++11 中的右值引用使用 <code>&amp;&amp;</code> 表示：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int&amp;&amp;</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">       // 合法，将不具名(匿名)变量取了个别名</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int&amp;&amp;</span><span style="color:var(--shiki-foreground)"> c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> b;</span><span style="color:var(--shiki-token-comment)">       // 编译错误！不能将一个左值绑定到一个右值引用</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> A</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  public</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> a;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">A</span><span style="color:var(--shiki-token-function)"> getTemp</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-function)"> A</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">A </span><span style="color:var(--shiki-token-keyword)">&amp;&amp;</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> getTemp</span><span style="color:var(--shiki-foreground)">();</span><span style="color:var(--shiki-token-comment)">   //getTemp()的返回值是右值（临时变量）</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>getTemp()返回的右值本来在表达式语句结束后，其生命也就该终结了（因为是临时变量），而通过右值引用，该右值又重获新生，其生命期将与右值引用类型变量a的生命期一样，只要a还活着，该右值临时变量将会一直存活下去。实际上就是给那个临时变量取了个名字。</p>
<div class="rp-callout rp-callout--note"><div class="rp-callout__title">Note</div><div class="rp-callout__content"><p>
注意：这里a的类型是右值引用类型(int &amp;&amp;)，但是如果从左值和右值的角度区分它，它实际上是个左值。因为可以对它取地址，而且它还有名字，是一个已经命名的右值。</p></div></div>
<p>所以，左值引用只能绑定左值，右值引用只能绑定右值，如果绑定的不对，编译就会失败。但是，常量左值引用却是个奇葩，它可以算是一个“万能”的引用类型，它可以绑定非常量左值、常量左值、右值，而且在绑定右值的时候，常量左值引用还可以像右值引用一样将右值的生命期延长，缺点是，只能读不能改。</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 常量左值引用绑定 右值， 不会报错</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> A</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  public</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> a;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">A</span><span style="color:var(--shiki-token-function)"> getTemp</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-function)"> A</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-foreground)"> A </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> getTemp</span><span style="color:var(--shiki-foreground)">();</span><span style="color:var(--shiki-token-comment)">   // 不会报错 而 A&amp; a 会报错</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="加入右值引用的目的"><a href="#加入右值引用的目的" class="rp-header-anchor rp-link" aria-hidden="true">#</a>加入右值引用的目的</h3>
<p>个人认为右值引用的目的主要是为了是减少内存拷贝，优化性能。比如下面的代码：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-function)">String</span><span style="color:var(--shiki-token-function)"> Fun</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    String str </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)"> &quot;hello world&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> str;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>str 为临时对象，然后调用 String 的拷贝构造函数，将临时对象的值赋值给 String，这种拷贝是完全没有必要的，如果堆内存很大，那么这个拷贝构造的代价会很大，带来了额外的性能损耗。</p>
<p>为了避免临时对象的拷贝构造，我们可以使用移动语义来实现：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-function)">MyString</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> operator</span><span style="color:var(--shiki-foreground)">=(</span><span style="color:var(--shiki-token-function)">MyString</span><span style="color:var(--shiki-token-keyword)">&amp;&amp;</span><span style="color:var(--shiki-foreground)"> other)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;MyString&amp; operator=(const MyString&amp;&amp; other)&quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> endl;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-foreground)">other)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        m_nLen </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">m_nLen;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        m_pData </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">m_pData;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">m_pData </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>我们没有深度拷贝堆内存中的数据，而是仅仅复制了指针，并把源对象 other 的指针置空。事实上，我们“偷取”了属于源对象 other 的内存数据。由于源对象 other 是一个右值，不会再被使用，因此客户并不会觉察到源对象被改变了。在这里，我们并没有真正的复制，所以我们把这个构造函数叫做“转移构造函数”（move constructor），他的工作就是把资源从一个对象转移到另一个对象，而不是复制他们，这样就能避免内存拷贝带来的额外性能消耗。</p>
<h2 class="rp-toc-include" id="stdbind-函数"><a href="#stdbind-函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>std::bind 函数</h2>
<p>C++11 引入了新的标准库函数 bind，std::bind 函数定义在头文件 functional 中，是一个函数模板，它就像一个函数适配器，接受一个可调用对象（callable object），生成一个新的可调用对象来“适应”原对象的参数列表。</p>
<p>std::bind 将可调用对象与其参数一起进行绑定，绑定后的结果可以使用 std::function 保存。std::bind 主要有以下两个作用：</p>
<p>将可调用对象和其参数绑定成一个仿函数；
只绑定部分参数，减少可调用对象传入的参数。
std::bind 函数有两种函数原型，定义如下：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-foreground)"> &lt;</span><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-foreground)">... </span><span style="color:var(--shiki-token-function)">Args</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">/* unspecified */</span><span style="color:var(--shiki-token-function)"> bind</span><span style="color:var(--shiki-foreground)"> (Fn</span><span style="color:var(--shiki-token-keyword)">&amp;&amp;</span><span style="color:var(--shiki-foreground)"> f</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> Args</span><span style="color:var(--shiki-token-keyword)">&amp;&amp;</span><span style="color:var(--shiki-foreground)">... args);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-foreground)"> &lt;</span><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> Ret</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-token-function)"> F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-foreground)">... </span><span style="color:var(--shiki-token-function)">Args</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">/* unspecified */</span><span style="color:var(--shiki-token-function)"> bind</span><span style="color:var(--shiki-foreground)"> (Fn</span><span style="color:var(--shiki-token-keyword)">&amp;&amp;</span><span style="color:var(--shiki-foreground)"> f</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> Args</span><span style="color:var(--shiki-token-keyword)">&amp;&amp;</span><span style="color:var(--shiki-foreground)">... args);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>参数说明：</p>
<ul>
<li>f：一个可调用对象（可以是函数对象、函数指针、函数引用、成员函数指针、数据成员指针），它的参数将被绑定到 args 上。</li>
<li>args：绑定参数列表，参数会被值或占位符（std::placeholders）替换，其长度必须与 f 接收的参数个数一致。</li>
</ul>
<h3 class="rp-toc-include" id="stdbind绑定普通函数"><a href="#stdbind绑定普通函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>std::bind绑定普通函数</h3>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">double</span><span style="color:var(--shiki-token-function)"> my_divide</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">double</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> double</span><span style="color:var(--shiki-foreground)"> y) {</span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">y;}</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">auto</span><span style="color:var(--shiki-foreground)"> fn_half </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bind</span><span style="color:var(--shiki-foreground)"> (my_divide</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">_1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-function)"> fn_half</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &#x27;\n&#x27;</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">                        // 5</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ul>
<li>bind 的第一个参数是函数名，普通函数做实参时，会隐式转换成函数指针。因此<code>std::bind (my_divide,_1,2)</code>等价于<code>std::bind (&amp;my_divide,_1,2)</code>；</li>
<li><code>_1</code>表示占位符，位于 <code>&lt;functional&gt;</code> 中：<code>std::placeholders::_1</code>;</li>
</ul>
<h3 class="rp-toc-include" id="stdbind绑定一个成员函数"><a href="#stdbind绑定一个成员函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>std::bind绑定一个成员函数</h3>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">struct</span><span style="color:var(--shiki-token-function)"> Foo</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    void</span><span style="color:var(--shiki-token-function)"> print_sum</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> n1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> n2)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> n1</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">n2 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &#x27;\n&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    Foo foo;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    auto</span><span style="color:var(--shiki-foreground)"> f </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bind</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">Foo</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">print_sum</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-foreground)">foo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 95</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">placeholders</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">_1);</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    f</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)"> // 100</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>bind 绑定类成员函数时，第一个参数表示对象的成员函数的指针，第二个参数表示对象的地址。
必须显示的指定 <code>&amp;Foo::print_sum</code>，因为编译器不会将对象的成员函数隐式转换成函数指针，所以必须在 <code>Foo::print_sum</code> 前添加 &amp;；
使用对象成员函数的指针时，必须要知道该指针属于哪个对象，因此第二个参数为对象的地址 &amp;foo；</p>
<h2 class="rp-toc-include" id="std--function-类模板"><a href="#std--function-类模板" class="rp-header-anchor rp-link" aria-hidden="true">#</a>std :: function 类模板</h2>
<p>类模板 std :: function 是一个通用的多态函数包装器。 std :: function 的实例可以存储，复制和调用任何可调用的目标 ：包括函数，lambda 表达式，绑定表达式或其他函数对象，以及指向成员函数和指向数据成员的指针。当 std::function 对象未包裹任何实际的可调用元素，调用该 std::function 对象将抛出 <code>std::bad_function_call</code> 异常。</p>
<p>原型如下：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">template</span><span style="color:var(--shiki-foreground)">&lt; </span><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> R</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-foreground)">... </span><span style="color:var(--shiki-token-function)">Args</span><span style="color:var(--shiki-foreground)"> &gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> function</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-function)">R</span><span style="color:var(--shiki-foreground)">(Args...)&gt;;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>例如：<code>std::function&lt;int(int,int)&gt; func</code>;则 function 类的实例 func 可以指向返回值为 int 型，有两个形参都为 int 型的函数。</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;functional&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iostream&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> f</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> b)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> b;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">function</span><span style="color:var(--shiki-token-keyword)">&lt;int</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> func </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> f;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-function)"> func</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 3</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>我们再来先来看看以前 C 和 C++98 的用法：</p>
<div class="rp-codeblock language-c++"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c++"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iostream&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// C 风格函数</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> c_func</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> b)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> b;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 函数对象</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">struct</span><span style="color:var(--shiki-token-function)"> functor</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">public</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-token-keyword)"> operator</span><span style="color:var(--shiki-foreground)">() (</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> b)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> b;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    typedef</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> (*Func)(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    Func func </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> c_func;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-function)"> func</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 3</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    functor ft;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-function)"> ft</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 3</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>从上面我们可以看出，使用 C++11 的 function 类调用函数方便多了。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Linux自动挂载硬盘并共享]]></title>
        <id>/blog/2026/linux-mount-smb</id>
        <link href="https://www.vhcffh.com/blog/2026/linux-mount-smb"/>
        <updated>2026-02-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[记录Linux下自动挂载硬盘，并通过smb共享到局域网的方法。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="linux自动挂载硬盘并共享"><a href="#linux自动挂载硬盘并共享" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Linux自动挂载硬盘并共享<!-- --> </h1>
<p>记录linux下自动挂载硬盘，并通过smb共享到网络中。</p>
<h2 class="rp-toc-include" id="自动挂载"><a href="#自动挂载" class="rp-header-anchor rp-link" aria-hidden="true">#</a>自动挂载</h2>
<ol>
<li>
<p><code>blkid</code>查看 <code>UUID</code></p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">korbin@pi:~</span><span style="color:var(--shiki-foreground)"> $ </span><span style="color:var(--shiki-token-string)">blkid</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">/dev/mmcblk0p1:</span><span style="color:var(--shiki-token-string)"> LABEL_FATBOOT=</span><span style="color:var(--shiki-token-string-expression)">&quot;bootfs&quot;</span><span style="color:var(--shiki-token-string)"> LABEL=</span><span style="color:var(--shiki-token-string-expression)">&quot;bootfs&quot;</span><span style="color:var(--shiki-token-string)"> UUID=</span><span style="color:var(--shiki-token-string-expression)">&quot;F587-071F&quot;</span><span style="color:var(--shiki-token-string)"> BLOCK_SIZE=</span><span style="color:var(--shiki-token-string-expression)">&quot;512&quot;</span><span style="color:var(--shiki-token-string)"> TYPE=</span><span style="color:var(--shiki-token-string-expression)">&quot;vfat&quot;</span><span style="color:var(--shiki-token-string)"> PARTUUID=</span><span style="color:var(--shiki-token-string-expression)">&quot;7d559f21-01&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">/dev/mmcblk0p2:</span><span style="color:var(--shiki-token-string)"> LABEL=</span><span style="color:var(--shiki-token-string-expression)">&quot;rootfs&quot;</span><span style="color:var(--shiki-token-string)"> UUID=</span><span style="color:var(--shiki-token-string-expression)">&quot;d6944274-f2f7-4644-96a4-213c3b367f5c&quot;</span><span style="color:var(--shiki-token-string)"> BLOCK_SIZE=</span><span style="color:var(--shiki-token-string-expression)">&quot;4096&quot;</span><span style="color:var(--shiki-token-string)"> TYPE=</span><span style="color:var(--shiki-token-string-expression)">&quot;ext4&quot;</span><span style="color:var(--shiki-token-string)"> PARTUUID=</span><span style="color:var(--shiki-token-string-expression)">&quot;7d559f21-02&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">/dev/loop0:</span><span style="color:var(--shiki-token-string)"> TYPE=</span><span style="color:var(--shiki-token-string-expression)">&quot;swap&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">/dev/sda1:</span><span style="color:var(--shiki-token-string)"> UUID=</span><span style="color:var(--shiki-token-string-expression)">&quot;5a9e8d37-1d53-45d1-b724-2695d70477f0&quot;</span><span style="color:var(--shiki-token-string)"> BLOCK_SIZE=</span><span style="color:var(--shiki-token-string-expression)">&quot;4096&quot;</span><span style="color:var(--shiki-token-string)"> TYPE=</span><span style="color:var(--shiki-token-string-expression)">&quot;ext4&quot;</span><span style="color:var(--shiki-token-string)"> PARTUUID=</span><span style="color:var(--shiki-token-string-expression)">&quot;075b7ae2-de80-4a87-8c01-f028b9ad8cf0&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">/dev/zram0:</span><span style="color:var(--shiki-token-string)"> LABEL=</span><span style="color:var(--shiki-token-string-expression)">&quot;zram0&quot;</span><span style="color:var(--shiki-token-string)"> UUID=</span><span style="color:var(--shiki-token-string-expression)">&quot;a7f80131-092f-412c-ae98-dec1724993ed&quot;</span><span style="color:var(--shiki-token-string)"> TYPE=</span><span style="color:var(--shiki-token-string-expression)">&quot;swap&quot;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>修改 <code>/etc/fstab</code>实现启动自动挂载</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> mkdir</span><span style="color:var(--shiki-token-string)"> /mnt/disk1</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> echo</span><span style="color:var(--shiki-token-string-expression)"> &quot;UUID=5a9e8d37-1d53-45d1-b724-2695d70477f0  /mnt/disk1  ext4  defaults  0  0&quot;</span><span style="color:var(--shiki-token-keyword)"> &gt;&gt;</span><span style="color:var(--shiki-token-string)"> /etc/fstab</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
</ol>
<h2 class="rp-toc-include" id="smb共享"><a href="#smb共享" class="rp-header-anchor rp-link" aria-hidden="true">#</a>smb共享</h2>
<ol>
<li>安装 <code>samba</code>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> apt</span><span style="color:var(--shiki-token-string)"> install</span><span style="color:var(--shiki-token-string)"> samba</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>配置 <code>smb</code>共享
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-foreground)">[disk1]</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   comment</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-string)"> Public</span><span style="color:var(--shiki-token-string)"> Shared</span><span style="color:var(--shiki-token-string)"> Data</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   available</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-string)"> yes</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   valid</span><span style="color:var(--shiki-token-string)"> users</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-string)"> frey</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   path</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-string)"> /mnt/disk1</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   browseable</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-string)"> yes</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   writeable</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-string)"> yes</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   guest</span><span style="color:var(--shiki-token-string)"> ok</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-string)"> no</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   create</span><span style="color:var(--shiki-token-string)"> mask</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-constant)"> 0664</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   directory</span><span style="color:var(--shiki-token-string)"> mask</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-constant)"> 0755</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   force</span><span style="color:var(--shiki-token-string)"> user</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-string)"> frey</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>重启 <code>smb</code>服务
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> systemctl</span><span style="color:var(--shiki-token-string)"> restart</span><span style="color:var(--shiki-token-string)"> smb.service</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C语言可变参数应用]]></title>
        <id>/blog/2025/c-variable-args</id>
        <link href="https://www.vhcffh.com/blog/2025/c-variable-args"/>
        <updated>2025-12-24T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="c语言可变参数应用"><span>C语言可变参数应用</span><a href="#c语言可变参数应用" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p><code>va_list</code>是 C 语言专门用来解决可变参数问题的工具，于 C99 标准引入， <code>va_list</code> 类型允许函数接受可变数量的参数，这在编写需要处理不定数量参数的函数时非常有用。<code>va_list</code> 类型是在 <code>stdarg.h</code> 头文件中定义的，它允许函数处理可变数量的参数。下面我们将详细介绍 <code>va_list</code> 的用法以及实际应用示例。</p>
<h2 class="rp-toc-include" id="va_list的用法"><a href="#va_list的用法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>va_list的用法</h2>
<p><code>va_list</code> 是一个指向参数列表的指针，它允许函数处理不定数量的参数。<code>va_list</code> 类型通常与 <code>va_start</code>、<code>va_arg</code> 和 <code>va_end</code>一起使用。</p>
<ul>
<li><code>va_list</code>：初始化 <code>va_list</code>类型的变量，使其指向参数列表的起始位置。</li>
<li><code>va_arg</code>：获取参数列表中的下一个参数，并将指针移动到下一个参数。</li>
<li><code>va_end</code>：清理 <code>va_list</code> 类型的变量。</li>
</ul>
<h2 class="rp-toc-include" id="应用举例"><a href="#应用举例" class="rp-header-anchor rp-link" aria-hidden="true">#</a>应用举例</h2>
<h3 class="rp-toc-include" id="计算总和"><a href="#计算总和" class="rp-header-anchor rp-link" aria-hidden="true">#</a>计算总和</h3>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;stdarg.h&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;stdio.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> sum</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> count</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> ...)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)">     sum </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    va_list ap;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    va_start</span><span style="color:var(--shiki-foreground)">(ap</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> count);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    while</span><span style="color:var(--shiki-foreground)"> (count</span><span style="color:var(--shiki-token-keyword)">--</span><span style="color:var(--shiki-foreground)">) sum </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-function)"> va_arg</span><span style="color:var(--shiki-foreground)">(ap</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    va_end</span><span style="color:var(--shiki-foreground)">(ap);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> sum;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    printf</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;sum(5,1,2,3,4,5):</span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> sum</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">));</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    printf</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;sum(3,10,20,30):</span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> sum</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-foreground)">));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>在上面的例子中， <code>sum</code> 函数通过固定参数 <code>count</code> 指定后续可变参数的数量，使用 <code>va_start</code> 初始化参数列表，在循环中用 <code>va_arg</code> 依次按 <code>int</code> 类型取出每个参数并累加计算结果。类似可以用于计算最大值、最小值、平均数等。编译输出结果如下：</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">❯</span><span style="color:var(--shiki-token-string)"> gcc</span><span style="color:var(--shiki-token-string)"> main.c</span><span style="color:var(--shiki-token-punctuation)"> &amp;&amp;</span><span style="color:var(--shiki-token-function)"> ./a.out</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sum(5,1,2,3,4,5</span><span style="color:var(--shiki-foreground)">):15</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sum(3,10,20,30</span><span style="color:var(--shiki-foreground)">):60</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="日志格式化"><a href="#日志格式化" class="rp-header-anchor rp-link" aria-hidden="true">#</a>日志格式化</h3>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> log_debug</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">format</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> ...)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    char</span><span style="color:var(--shiki-token-constant)">    buf</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    va_list ap;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    va_start</span><span style="color:var(--shiki-foreground)">(ap</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> format);</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    vsprintf</span><span style="color:var(--shiki-foreground)">(buf</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> format</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> ap);</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    va_end</span><span style="color:var(--shiki-foreground)">(ap);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    extern</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> uart_write</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">buf</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> len);</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    uart_write</span><span style="color:var(--shiki-foreground)">(buf</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> strlen</span><span style="color:var(--shiki-foreground)">(buf));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> number </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    log_debug</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-constant)"> %c</span><span style="color:var(--shiki-token-constant)"> %d</span><span style="color:var(--shiki-token-constant)"> %02X</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;test&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &#x27;C&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> number</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> number);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>上面的例子，配合 <code>vsprintf</code>，在单片机开发中，可以方便的进行日志输出打印。</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://cppreference.cn/w/c/header/stdarg" target="_blank" rel="noopener noreferrer" class="rp-link">标准库头文件 stdarg.h - cppreference.cn - C++参考手册</a></li>
<li><a href="https://bachzart.github.io/2025/08/26/%E6%9C%89%E5%85%B3-va-list-%E7%9A%84%E4%B8%80%E4%BA%9B%E7%AC%94%E8%AE%B0/" target="_blank" rel="noopener noreferrer" class="rp-link">有关 va_list 的一些笔记 | bachzart&#x27;s Blog</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Nginx日志统计技巧]]></title>
        <id>/blog/2025/nginx-log-statistics</id>
        <link href="https://www.vhcffh.com/blog/2025/nginx-log-statistics"/>
        <updated>2025-12-18T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="nginx日志统计技巧"><span>Nginx日志统计技巧</span><a href="#nginx日志统计技巧" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>记录如何通过命令行对Nginx日志进行简单分析，日志格式为：</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">log_format</span><span style="color:var(--shiki-token-string)">  main</span><span style="color:var(--shiki-token-string-expression)">  &#x27;$remote_addr - $remote_user [$time_local] &quot;$request&quot; &#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                      &#x27;$status $body_bytes_sent &quot;$http_referer&quot; &#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                      &#x27;&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ol>
<li>
<p>统计所有请求的总数（PV）</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">awk</span><span style="color:var(--shiki-token-string-expression)"> &#x27;{print $1}&#x27;</span><span style="color:var(--shiki-token-string)"> /var/log/nginx/access.log</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> wc</span><span style="color:var(--shiki-token-string)"> -l</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>统计独立IP的访问数量（UV）</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">awk</span><span style="color:var(--shiki-token-string-expression)"> &#x27;{print $1}&#x27;</span><span style="color:var(--shiki-token-string)"> /var/log/nginx/access.log</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sort</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> uniq</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> wc</span><span style="color:var(--shiki-token-string)"> -l</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>按IP访问次数排序，显示前100个</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">awk</span><span style="color:var(--shiki-token-string-expression)"> &#x27;{print $1}&#x27;</span><span style="color:var(--shiki-token-string)"> /var/log/nginx/access.log</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sort</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> uniq</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sort</span><span style="color:var(--shiki-token-string)"> -rn</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> head</span><span style="color:var(--shiki-token-string)"> -n</span><span style="color:var(--shiki-token-constant)"> 100</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>查看访问最频繁的页面（前50名）</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">awk</span><span style="color:var(--shiki-token-string-expression)"> &#x27;{print $7}&#x27;</span><span style="color:var(--shiki-token-string)"> /var/log/nginx/access.log</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sort</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> uniq</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sort</span><span style="color:var(--shiki-token-string)"> -rn</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> head</span><span style="color:var(--shiki-token-string)"> -n</span><span style="color:var(--shiki-token-constant)"> 50</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>排除静态资源（如JS、CSS）后，查看最频繁页面</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">grep</span><span style="color:var(--shiki-token-string)"> -vE</span><span style="color:var(--shiki-token-string-expression)"> &#x27;.js|.css|.ico&#x27;</span><span style="color:var(--shiki-token-string)"> /var/log/nginx/access.log</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> awk</span><span style="color:var(--shiki-token-string-expression)"> &#x27;{print $7}&#x27;</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sort</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> uniq</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sort</span><span style="color:var(--shiki-token-string)"> -rn</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> head</span><span style="color:var(--shiki-token-string)"> -n</span><span style="color:var(--shiki-token-constant)"> 50</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>统计每秒请求数，显示Top 100时间点</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">awk</span><span style="color:var(--shiki-token-string-expression)"> &#x27;{print $4}&#x27;</span><span style="color:var(--shiki-token-string)"> /var/log/nginx/access.log</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> cut</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-string)"> 14-21</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sort</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> uniq</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sort</span><span style="color:var(--shiki-token-string)"> -rn</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> head</span><span style="color:var(--shiki-token-string)"> -n</span><span style="color:var(--shiki-token-constant)"> 100</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>列出传输时间超过3秒的页面（前20条）</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">awk</span><span style="color:var(--shiki-token-string-expression)"> &#x27;($NF &gt; 3){print $7}&#x27;</span><span style="color:var(--shiki-token-string)"> /var/log/nginx/access.log</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sort</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> uniq</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sort</span><span style="color:var(--shiki-token-string)"> -rn</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> head</span><span style="color:var(--shiki-token-string)"> -20</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[FreeRTOS 内存管理方案]]></title>
        <id>/blog/2025/freertos-memory-management</id>
        <link href="https://www.vhcffh.com/blog/2025/freertos-memory-management"/>
        <updated>2025-12-17T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="freertos-内存管理方案"><span>FreeRTOS 内存管理方案</span><a href="#freertos-内存管理方案" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>FreeRTOS 将内存管理与内核分离，通过统一的 <code>pvPortMalloc()</code> 和 <code>vPortFree()</code> 接口实现多种可选的堆管理算法（heap_1 ~ heap_5），以适配不同嵌入式场景。</p>
<p><strong>核心原则</strong>：</p>
<ul>
<li><strong>动态分配</strong>：运行时按需申请/释放内存，灵活但需控制碎片化与实时性。</li>
<li><strong>静态分配</strong>：编译期固定内存，可靠但利用率低。</li>
<li><strong>线程安全</strong>：FreeRTOS 内存 API 会在分配/释放时挂起调度器，避免并发冲突。</li>
</ul>
<p><strong>五种内存管理实现</strong>（位于 <em>Source/Portable/MemMang</em>，工程中只能选择一个）：</p>
<ol>
<li><strong>heap_1</strong> 仅支持分配，不支持释放，执行时间固定，无碎片。 适合启动时<strong>一次性创建对象且不删除</strong>的系统。</li>
<li><strong>heap_2</strong> 支持释放，但不合并相邻空闲块，易产生碎片。 适合分配/释放<strong>大小固定的对象</strong>。</li>
<li><strong>heap_3</strong> 封装 malloc/free，保证线程安全。 <strong>依赖编译器堆设置</strong>，非确定性，可能增大代码体积。</li>
<li><strong>heap_4</strong> 最常用，支持释放并合并相邻空闲块，减少碎片。 适合<strong>随机大小分配/释放</strong>的应用。</li>
<li><strong>heap_5</strong> 基于 heap_4，支持<strong>多个不连续内存区域</strong>（如片内 RAM + 外部 SDRAM）。 需先调用 <code>vPortDefineHeapRegions()</code> 初始化区域。</li>
</ol>
<p><strong>典型使用示例</strong>（heap_4）：</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &quot;FreeRTOS.h&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &quot;task.h&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;stdio.h&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">ptr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> mem_test</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">   size_t</span><span style="color:var(--shiki-foreground)"> free_before </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> xPortGetFreeHeapSize()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;申请前剩余内存: </span><span style="color:var(--shiki-token-constant)">%u</span><span style="color:var(--shiki-token-string-expression)"> 字节\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> free_before)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">   ptr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> pvPortMalloc(</span><span style="color:var(--shiki-token-constant)">1024</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">   if</span><span style="color:var(--shiki-foreground)"> (ptr) {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">       printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;申请成功, 地址: </span><span style="color:var(--shiki-token-constant)">%p</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> ptr)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">       sprintf((</span><span style="color:var(--shiki-token-keyword)">char*</span><span style="color:var(--shiki-token-function)">)ptr</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;Tick=</span><span style="color:var(--shiki-token-constant)">%u</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> xTaskGetTickCount())</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">   }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">   size_t</span><span style="color:var(--shiki-foreground)"> free_after </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> xPortGetFreeHeapSize()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;申请后剩余内存: </span><span style="color:var(--shiki-token-constant)">%u</span><span style="color:var(--shiki-token-string-expression)"> 字节\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> free_after)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   vPortFree(ptr)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">   printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;释放后剩余内存: </span><span style="color:var(--shiki-token-constant)">%u</span><span style="color:var(--shiki-token-string-expression)"> 字节\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> xPortGetFreeHeapSize())</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><strong>要点</strong>：</p>
<ul>
<li>使用 <code>xPortGetFreeHeapSize()</code> 监控剩余堆空间。</li>
<li>对 heap_5，需先定义内存区域数组并调用 <code>vPortDefineHeapRegions()</code>。</li>
<li>对实时性要求高的系统，建议选用 <strong>heap_1</strong> 或静态分配，避免碎片化和不确定延迟。</li>
</ul><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Linux终端命令行技巧]]></title>
        <id>/blog/2025/linux-terminal-tips</id>
        <link href="https://www.vhcffh.com/blog/2025/linux-terminal-tips"/>
        <updated>2025-12-08T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="linux终端命令行技巧"><span>Linux终端命令行技巧</span><a href="#linux终端命令行技巧" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>总结一下在Linux终端中进行命令输入、编辑的一些技巧</p>













































































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>命令</th><th>说明</th></tr></thead><tbody><tr><td><code>Tab</code></td><td>自动补全</td></tr><tr><td><code>Up/Ctrl+p</code></td><td>上一条命令</td></tr><tr><td><code>Down/Ctrl+n</code></td><td>下一条命令</td></tr><tr><td><code>Left/Ctrl+b</code></td><td>光标左移（后退）</td></tr><tr><td><code>Right/Ctrl+f</code></td><td>光标右移（前进）</td></tr><tr><td><code>Ctrl+r</code></td><td>按字符串寻找历史命令</td></tr><tr><td><code>Ctrl+c</code></td><td>中断正在执行的程序</td></tr><tr><td><code>Ctrl+l</code></td><td>清屏</td></tr><tr><td><code>Ctrl+a/e</code></td><td>移动光标到命令行首/行尾</td></tr><tr><td><code>Ctrl+Left/Right</code></td><td>光标左移/右移一个单词</td></tr><tr><td><code>Ctrl+k</code></td><td>删除光标之后所有字符</td></tr><tr><td><code>Ctrl+u</code></td><td>清空当前键入的命令</td></tr><tr><td><code>Ctrl+w</code></td><td>删除光标前的单词</td></tr><tr><td><code>Ctrl+y</code></td><td>粘贴 <code>Ctrl+w</code> 或 <code>Ctrl+k</code> 删除的内容</td></tr><tr><td><code>Ctrl+d</code></td><td>删除当前光标所在字符 (在没有字符时会关闭终端)</td></tr><tr><td><code>Backspace/Ctrl+h</code></td><td>删除光标的前一个字符</td></tr><tr><td><code>Ctrl+x+e</code></td><td>使用编辑器编辑当前命令</td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://jaywcjlove.github.io/linux-command" target="_blank" rel="noopener noreferrer" class="rp-link">Linux命令大全搜索工具</a> <em>(jaywcjlove.github.io)</em></li>
<li><a href="https://www.linuxcool.com/" target="_blank" rel="noopener noreferrer" class="rp-link">Linux命令大全(手册)</a> <em>(linuxcool.com)</em></li>
<li><a href="https://manpages.debian.org/buster/manpages-zh/index.html" target="_blank" rel="noopener noreferrer" class="rp-link">MAN手册 - 中文</a> <em>(debian.org)</em></li>
<li><a href="https://www.cheat-sheet.cn/post/linux-command-line-cheat-sheet/" target="_blank" rel="noopener noreferrer" class="rp-link">Linux 命令行速查表</a> <em>(cheat-sheet.cn)</em></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[修复 WSL 网络配置错误 0x8007054f]]></title>
        <id>/blog/2025/wsl-network-error-0x8007054f</id>
        <link href="https://www.vhcffh.com/blog/2025/wsl-network-error-0x8007054f"/>
        <updated>2025-11-29T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="修复-wsl-网络配置错误-0x8007054f"><span>修复 WSL 网络配置错误 0x8007054f</span><a href="#修复-wsl-网络配置错误-0x8007054f" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>当 WSL 报错 <code>createinstance/createvm/configurenetworking/0x8007054f</code> 并提示无法配置网络时，通常是由于网络服务或系统配置问题导致的。以下是解决此问题的步骤。</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">wsl:</span><span style="color:var(--shiki-token-string)"> 出现了内部错误。</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">错误代码:</span><span style="color:var(--shiki-token-string)"> createinstance/createvm/configurenetworking/0x8007054f</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">wsl:</span><span style="color:var(--shiki-token-string)"> 无法配置网络</span><span style="color:var(--shiki-foreground)"> (networkingmode </span><span style="color:var(--shiki-token-string)">mirrored</span><span style="color:var(--shiki-foreground)">)，回退到 networkingmode none。</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="解决方法"><a href="#解决方法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>解决方法</h2>
<h3 class="rp-toc-include" id="重启-hns-服务"><a href="#重启-hns-服务" class="rp-header-anchor rp-link" aria-hidden="true">#</a>重启 HNS 服务</h3>
<p>在管理员模式下运行 PowerShell，重启 Host Network Service (HNS) 服务。</p>
<div class="rp-codeblock language-powershell"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="powershell"><code><span class="line"><span style="color:var(--shiki-foreground)">wsl </span><span style="color:var(--shiki-token-keyword)">--</span><span style="color:var(--shiki-foreground)">shutdown</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">net stop hns</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">net start hns</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="重置-wsl-网络配置"><a href="#重置-wsl-网络配置" class="rp-header-anchor rp-link" aria-hidden="true">#</a>重置 WSL 网络配置</h3>
<p>如果问题仍然存在，可以尝试重置网络堆栈。</p>
<div class="rp-codeblock language-powershell"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="powershell"><code><span class="line"><span style="color:var(--shiki-foreground)">netsh winsock reset</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">netsh int ip reset</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>执行后需要重启电脑。</p>
<h3 class="rp-toc-include" id="完全关闭并重启-wsl"><a href="#完全关闭并重启-wsl" class="rp-header-anchor rp-link" aria-hidden="true">#</a>完全关闭并重启 WSL</h3>
<p>关闭所有 WSL 实例并重新启动服务。</p>
<div class="rp-codeblock language-powershell"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="powershell"><code><span class="line"><span style="color:var(--shiki-foreground)">wsl </span><span style="color:var(--shiki-token-keyword)">--</span><span style="color:var(--shiki-foreground)">shutdown</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">wsl </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">d </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)">你的发行版名称</span><span style="color:var(--shiki-token-keyword)">&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="检查-hyper-v-和相关功能"><a href="#检查-hyper-v-和相关功能" class="rp-header-anchor rp-link" aria-hidden="true">#</a>检查 Hyper-V 和相关功能</h3>
<p>确保 Windows 功能中的 Hyper-V 和 Virtual Machine Platform 已启用。如果未启用，可以通过以下步骤操作：</p>
<ol>
<li>打开“控制面板” &gt; “程序” &gt; “启用或关闭 Windows 功能”。</li>
<li>勾选 Hyper-V 和 虚拟机平台，然后重启系统。</li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[MMU 和 MPU的区别]]></title>
        <id>/blog/2025/mmu-mpu-difference</id>
        <link href="https://www.vhcffh.com/blog/2025/mmu-mpu-difference"/>
        <updated>2025-11-27T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="mmu-和-mpu的区别"><span>MMU 和 MPU的区别</span><a href="#mmu-和-mpu的区别" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>MPU（Memory Protection Unit，内存保护单元）和 MMU（Memory Management Unit，内存管理单元）是现代计算机系统中用于内存管理的两种硬件设备。尽管它们在基本功能上有相似之处，但在复杂性和功能上存在显著差异。</p>
<h2 class="rp-toc-include" id="mmu-的功能和特点"><a href="#mmu-的功能和特点" class="rp-header-anchor rp-link" aria-hidden="true">#</a>MMU 的功能和特点</h2>
<p>MMU 是一种更为先进的内存管理设备，主要用于虚拟内存和内存保护操作。它能够将虚拟地址转换为物理地址，并提供缓存控制、总线仲裁和银行切换等高级功能。这些特性使得 MMU 适用于运行高端操作系统（如 Windows、Linux 和 Android）的处理器，这些处理器通常被称为应用处理器。</p>
<p>MMU 的主要功能包括：</p>
<ul>
<li>虚拟内存管理：将虚拟地址映射到物理地址。</li>
<li>内存保护：防止未经授权的内存访问。</li>
<li>缓存控制：管理缓存的使用。</li>
<li>总线仲裁：协调多个设备对总线的访问。</li>
<li>Bank切换：在不同的内存银行之间切换。</li>
</ul>
<div class="rp-callout rp-callout--tip"><div class="rp-callout__title">Tip</div><div class="rp-callout__content"><p>
<strong>Bank</strong>理解为一组独立的存储单元。在计算机系统中，为了管理或扩展内存，硬件设计者会将物理内存划分为多个独立的区域（Bank）。这些区域可以有自己的特点和访问方式。</p></div></div>
<div class="rp-callout rp-callout--tip"><div class="rp-callout__title">Tip</div><div class="rp-callout__content"><p>
<strong>Bank切换</strong>是一种用于扩展可用内存或管理内存资源的技术。当CPU的地址总线宽度有限，无法直接访问大容量内存时，或者出于低功耗等考虑，可以通过切换不同的Bank来让CPU访问到不同的内存区域。</p></div></div>
<h2 class="rp-toc-include" id="mpu-的功能和特点"><a href="#mpu-的功能和特点" class="rp-header-anchor rp-link" aria-hidden="true">#</a>MPU 的功能和特点</h2>
<p>MPU 通常是 CPU 的一部分，主要用于内存保护。与 MMU 不同，MPU 不支持虚拟内存管理和其他高级功能，因此它的复杂性和成本较低。MPU 适用于简单的系统，特别是在低功耗处理器中。</p>
<p>MPU 的主要功能包括：</p>
<ul>
<li>内存保护：防止未经授权的内存访问。</li>
<li>低复杂性和低成本：适用于不需要虚拟内存管理的简单系统。</li>
</ul>
<h2 class="rp-toc-include" id="对比"><a href="#对比" class="rp-header-anchor rp-link" aria-hidden="true">#</a>对比</h2>


















































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">关键</th><th style="text-align:left">MMU</th><th style="text-align:left">MPU</th></tr></thead><tbody><tr><td style="text-align:left">定义</td><td style="text-align:left">MMU是指内存管理单元。</td><td style="text-align:left">MPU指的是内存保护单元。</td></tr><tr><td style="text-align:left">主要操作</td><td style="text-align:left">MMU用于多个与内存相关的操作，如虚拟内存、虚拟地址到物理地址的转换和内存保护。</td><td style="text-align:left">MPU只用于内存保护。</td></tr><tr><td style="text-align:left">功能</td><td style="text-align:left">MMU也可以执行MPU的功能。</td><td style="text-align:left">MPU不能被用来执行MMU的功能。</td></tr><tr><td style="text-align:left">使用方法</td><td style="text-align:left">运行高端操作系统如Windows、Linux和Android的处理器使用MMU。这样的处理器被称为应用处理器。</td><td style="text-align:left">运行RTOS操作的处理器如ThreadX使用MPU。这样的处理器被称为基带处理器，在运行3G/4G协议的地方很有用。</td></tr><tr><td style="text-align:left">bank切换</td><td style="text-align:left">MMU能够进行Bank切换。</td><td style="text-align:left">MPU不能进行Bank切换。</td></tr><tr><td style="text-align:left">缓存控制</td><td style="text-align:left">MMU可以执行高速缓存控制操作。</td><td style="text-align:left">MPU不能执行高速缓存控制。</td></tr><tr><td style="text-align:left">先进性</td><td style="text-align:left">MMU是更先进的硬件。</td><td style="text-align:left">MPU是相对不太先进的硬件。</td></tr><tr><td style="text-align:left">开销</td><td style="text-align:left">MMU使用更多的开销。</td><td style="text-align:left">MPU使用的开销较少。</td></tr></tbody></table></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[ssh连接时出现警告]]></title>
        <id>/blog/2025/ssh-warning</id>
        <link href="https://www.vhcffh.com/blog/2025/ssh-warning"/>
        <updated>2025-11-21T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="ssh连接时出现警告"><a href="#ssh连接时出现警告" class="rp-header-anchor rp-link" aria-hidden="true">#</a>ssh连接时出现警告<!-- --> </h1>
<p>升级最新版本的ssh(10.0)后，连接服务器时会出现警告：</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">❯</span><span style="color:var(--shiki-token-string)"> ssh</span><span style="color:var(--shiki-token-string)"> test</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">**</span><span style="color:var(--shiki-foreground)"> WARNING: connection is not using a post-quantum key exchange algorithm.</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">**</span><span style="color:var(--shiki-foreground)"> This session may be vulnerable to </span><span style="color:var(--shiki-token-string-expression)">&quot;store now, decrypt later&quot;</span><span style="color:var(--shiki-foreground)"> attacks.</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">**</span><span style="color:var(--shiki-foreground)"> The server may need to be upgraded. See https://openssh.com/pq.html</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>主要原因是，ssh最新版本新增并修改了默认的加密密钥协商算法，以应对量子计算机的共计。</p>
<blockquote>
<p>OpenSSH 支持多种加密密钥协商算法 被认为对量子计算机的攻击是安全的。 我们建议所有SSH连接都使用这些算法。</p>
<p>OpenSSH 提供了后量子密钥协议（KexAlgorithms） 自 9.0 版本（2022 年 4 月）起默认使用，最初通过 sntrup761x25519-sha512 算法实现。最近，在OpenSSH 9.9中， 我们新增了第二个后量子密钥协议 mlkem768x25519-sha256，并在 OpenSSH 10.0（2025 年 4 月）中将其定为新的默认方案。</p>
</blockquote>
<h2 class="rp-toc-include" id="背景"><a href="#背景" class="rp-header-anchor rp-link" aria-hidden="true">#</a>背景</h2>
<p>量子计算机（QC）是一种能够执行计算的设备 信息编码为量子态。这样的装置可以很快解决 这些问题对现有“经典”计算机来说是难以解决的。</p>
<p>支撑多种密码算法的数学原理 这些都是量子计算机被认为能够解决的问题之一 有效解决。这意味着，足够强大的量子计算机 （即“密码学相关”量子计算机）能够破解 他们。受影响最大的是用于密钥协商和数字化的密码学 签名，这两者在SSH中都起着重要作用。</p>
<p>幸运的是，有足够强大的量子计算机能够破解密码学 还没有被发明出来。关于密码学相关时的估计 量子计算机将会到来，基于该领域的进展速度， 时间范围在5到20年之间，许多观察者预计他们会到来 2030年代中期。</p>
<p>SSH连接的全部隐私都依赖于加密密钥协议。 如果攻击者能够破坏密钥协议，那么他们就能解密 和 查看整个会话。攻击者不必在现实中进行此攻击 时间;它们可能先收集加密的SSH会话，之后再解密 一旦他们获得了量子计算机的访问权限。 这被称为“先存储，后解密”攻击（也称为 “先收获，后解密”）。</p>
<p>幸运的是，改进的“后量子”密码算法已被开发出来 这些问题依赖于不同的底层数学问题，这些问题被理解为 不能被量子计算机攻击。</p>
<p>OpenSSH 支持后量子密钥协议，以防止“立即存储， “解密后”攻击已经持续多年，从那时起它就成为默认设置 OpenSSH-9.0，于2022年发布。</p>
<h2 class="rp-toc-include" id="处理方式"><a href="#处理方式" class="rp-header-anchor rp-link" aria-hidden="true">#</a>处理方式</h2>
<ol>
<li>升级服务器ssh版本</li>
<li>或在本机的ssh_config中禁用警告</li>
</ol>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">Match</span><span style="color:var(--shiki-token-string)"> host</span><span style="color:var(--shiki-token-string)"> unsafe.example.com</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    WarnWeakCrypto</span><span style="color:var(--shiki-token-string)"> no</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C++ numeric 中的算法]]></title>
        <id>/blog/2025/cpp-numeric</id>
        <link href="https://www.vhcffh.com/blog/2025/cpp-numeric"/>
        <updated>2025-08-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[对C++标准库numeric头文件中实现的算法进行总结，包括accumulate, reduce, inner_product, transform_reduce, partial_sum, inclusive_scan, exclusive_scan, adjacent_difference, iota, gcd, lcm]]></summary>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="c-numeric-中的算法"><span>C++ numeric 中的算法</span><a href="#c-numeric-中的算法" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>C++ 标准库的 <code>&lt;numeric&gt;</code> 头文件是进行数值计算的宝库。它不仅仅包含几个简单的函数，而是提供了一整套强大、高效且灵活的算法，用于处理序列数据。这些算法能够帮助我们写出更简洁、更具表现力且性能更高的代码，尤其是在现代 C++ (C++17 及以后) 中，它们中的许多都支持并行执行。</p>
<p>本文将全面介绍 <code>&lt;numeric&gt;</code> 头文件中的核心算法，分为三大类：</p>
<ol>
<li><strong>累积与归约 (Reduction)</strong>：将一个序列合并成单个值。</li>
<li><strong>扫描与前缀和 (Scan)</strong>：计算序列的中间累积结果。</li>
<li><strong>数值生成与数学工具</strong>：用于初始化序列和基础数学计算。</li>
</ol>
<h2 class="rp-toc-include" id="累积与归约-reduction"><a href="#累积与归约-reduction" class="rp-header-anchor rp-link" aria-hidden="true">#</a>累积与归约 (Reduction)</h2>
<p>这类算法的目标是将一个序列中的所有元素通过某个二元操作（如加法、乘法）合并成一个单一的值。</p>
<h3 class="rp-toc-include" id="stdaccumulate-c98"><a href="#stdaccumulate-c98" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::accumulate</code> (C++98)</h3>
<p>这是最经典、最基础的累积算法。它严格按照从左到右的顺序进行计算。</p>
<ul>
<li><strong>功能</strong>：计算一个序列 <code>[first, last)</code> 中所有元素的总和，从一个初始值 <code>init</code> 开始。</li>
<li><strong>特点</strong>：保证严格的顺序执行，可以通过自定义操作实现求积、字符串拼接等。</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;vector&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;numeric&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;string&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iostream&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;</span><span style="color:var(--shiki-foreground)"> nums </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 计算总和</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> sum </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">accumulate</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">nums</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> nums</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)"> // 15</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 计算乘积</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> product </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">accumulate</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">nums</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> nums</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">multiplies</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">&gt;());</span><span style="color:var(--shiki-token-comment)"> // 120</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 拼接字符串</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">string</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> words </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-string-expression)">&quot;Hello&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot; &quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;World&quot;</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">string sentence </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">accumulate</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">words</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> words</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">string</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;&quot;</span><span style="color:var(--shiki-foreground)">));</span><span style="color:var(--shiki-token-comment)"> // &quot;Hello World&quot;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="stdreduce-c17"><a href="#stdreduce-c17" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::reduce</code> (C++17)</h3>
<p><code>std::reduce</code> 是 <code>std::accumulate</code> 的现代化、可并行化版本。</p>
<ul>
<li><strong>功能</strong>：与 <code>accumulate</code> 类似，但<strong>不保证计算顺序</strong>。</li>
<li><strong>核心区别</strong>：
<ol>
<li><strong>并行性</strong>：允许乱序执行，因此可以利用 <code>std::execution::par</code> 等执行策略进行并行计算，从而大幅提升性能。</li>
<li><strong>操作要求</strong>：由于乱序执行，提供的二元操作<strong>必须满足结合律和交换律</strong>（如加法、乘法），否则结果未定义。</li>
<li><strong>默认初始值</strong>：有一个不需要 <code>init</code> 参数的版本，它会使用元素类型的默认构造函数（例如 <code>int{}</code> 即 <code>0</code>）作为初始值。</li>
</ol>
</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;vector&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;numeric&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;execution&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">vector</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)">&gt; </span><span style="color:var(--shiki-token-function)">big_vec</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">&#x27;</span><span style="color:var(--shiki-token-constant)">000</span><span style="color:var(--shiki-token-punctuation)">&#x27;</span><span style="color:var(--shiki-token-constant)">000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 使用并行策略计算总和</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)"> parallel_sum </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">reduce</span><span style="color:var(--shiki-foreground)">(std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">execution</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">par</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> big_vec</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> big_vec</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-keyword)">L</span><span style="color:var(--shiki-foreground)">);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<blockquote>
<p><strong>何时选择？</strong></p>
<ul>
<li>需要保证顺序（如减法），或在 C++17 之前的代码中，使用 <code>std::accumulate</code>。</li>
<li>追求性能，且操作允许乱序（如加法），现代 C++ 代码首选 <code>std::reduce</code>。</li>
</ul>
</blockquote>
<h3 class="rp-toc-include" id="stdinner_product-c98"><a href="#stdinner_product-c98" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::inner_product</code> (C++98)</h3>
<ul>
<li><strong>功能</strong>：计算两个序列的内积（点积）。它将两个序列的对应元素相乘，然后将所有乘积累加起来。</li>
<li><strong>灵活性</strong>：可以自定义累积操作和元素配对操作。</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;</span><span style="color:var(--shiki-foreground)"> v1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;</span><span style="color:var(--shiki-foreground)"> v2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 计算内积: (1*4 + 2*5 + 3*6)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> dot_product </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">inner_product</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">v1</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> v1</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> v2</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)"> // 32</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="stdtransform_reduce-c17"><a href="#stdtransform_reduce-c17" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::transform_reduce</code> (C++17)</h3>
<p>这是最强大的归约算法，完美体现了 &quot;map-reduce&quot; 思想。</p>
<ul>
<li><strong>功能</strong>：
<ol>
<li><strong>单序列</strong>：先对每个元素应用一个转换操作（map），然后再对结果进行归约（reduce）。</li>
<li><strong>双序列</strong>：先对两个序列的对应元素应用一个二元操作（transform），然后再对结果进行归约（reduce）。</li>
</ol>
</li>
<li><strong>特点</strong>：可并行化，且将转换和归约合二为一，避免了创建中间容器。</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;</span><span style="color:var(--shiki-foreground)"> nums </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 计算平方和 (1*1 + 2*2 + 3*3 + 4*4)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> sum_of_squares </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">transform_reduce</span><span style="color:var(--shiki-foreground)">(</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    nums</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> nums</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-comment)">                                 // 初始值</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">plus</span><span style="color:var(--shiki-foreground)">&lt;&gt;()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-comment)">                     // Reduce 操作: 相加</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [](</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> x) { </span><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)"> x; }</span><span style="color:var(--shiki-token-comment)">        // Transform 操作: 平方</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)"> // 30</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="扫描与前缀和-scan"><a href="#扫描与前缀和-scan" class="rp-header-anchor rp-link" aria-hidden="true">#</a>扫描与前缀和 (Scan)</h2>
<p>扫描算法不会将序列归约为单个值，而是生成一个包含所有中间累积结果的新序列。</p>
<h3 class="rp-toc-include" id="stdpartial_sum-c98"><a href="#stdpartial_sum-c98" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::partial_sum</code> (C++98)</h3>
<ul>
<li><strong>功能</strong>：计算序列的“部分和”，即 <code>inclusive_scan</code> 的早期版本。结果中的第 <code>i</code> 个元素是原序列前 <code>i+1</code> 个元素的和。</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;</span><span style="color:var(--shiki-foreground)"> data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">vector</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">&gt; </span><span style="color:var(--shiki-token-function)">result</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">partial_sum</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">data</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> data</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> result</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">());</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// result: {1, 3, 6, 10, 15}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="stdinclusive_scan--stdexclusive_scan-c17"><a href="#stdinclusive_scan--stdexclusive_scan-c17" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::inclusive_scan</code> &amp; <code>std::exclusive_scan</code> (C++17)</h3>
<p>这两个是现代化的、可并行的扫描算法。</p>
<ul>
<li><strong><code>inclusive_scan</code></strong>：包含当前元素的扫描，行为与 <code>partial_sum</code> 相同。</li>
<li><strong><code>exclusive_scan</code></strong>：不包含当前元素的扫描，结果中的第 <code>i</code> 个元素是原序列前 <code>i</code> 个元素的和。</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;</span><span style="color:var(--shiki-foreground)"> data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">vector</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">&gt; </span><span style="color:var(--shiki-token-function)">incl_res</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> excl_res</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 包含当前项的前缀和</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">inclusive_scan</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">data</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> data</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> incl_res</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">());</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// incl_res: {1, 3, 6, 10, 15}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 不包含当前项的前缀和</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">exclusive_scan</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">data</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> data</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> excl_res</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// excl_res: {0, 1, 3, 6, 10}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="stdadjacent_difference-c98"><a href="#stdadjacent_difference-c98" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::adjacent_difference</code> (C++98)</h3>
<ul>
<li><strong>功能</strong>：可以看作是 <code>partial_sum</code> 的逆运算，计算序列中每两个相邻元素之间的差。</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;</span><span style="color:var(--shiki-foreground)"> data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">vector</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">&gt; </span><span style="color:var(--shiki-token-function)">result</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">adjacent_difference</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">data</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> data</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> result</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">());</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// result: {1, 2, 3, 4, 5} (恢复了原始序列)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="数值生成与数学工具"><a href="#数值生成与数学工具" class="rp-header-anchor rp-link" aria-hidden="true">#</a>数值生成与数学工具</h2>
<h3 class="rp-toc-include" id="stdiota-c11"><a href="#stdiota-c11" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::iota</code> (C++11)</h3>
<ul>
<li><strong>功能</strong>：用一个从指定值开始连续递增的序列来填充一个范围。非常适合快速初始化。</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">vector</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">&gt; </span><span style="color:var(--shiki-token-function)">nums</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">iota</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">nums</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> nums</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)"> // 填充 10, 11, 12, 13, 14</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="stdgcd--stdlcm-c17"><a href="#stdgcd--stdlcm-c17" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::gcd</code> &amp; <code>std::lcm</code> (C++17)</h3>
<ul>
<li><strong>功能</strong>：计算两个整数的最大公约数（Greatest Common Divisor）和最小公倍数（Least Common Multiple）。</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> common_divisor </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">gcd</span><span style="color:var(--shiki-foreground)">(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> b);</span><span style="color:var(--shiki-token-comment)">   // 6</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> common_multiple </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">lcm</span><span style="color:var(--shiki-foreground)">(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> b);</span><span style="color:var(--shiki-token-comment)"> // 36</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="总结"><a href="#总结" class="rp-header-anchor rp-link" aria-hidden="true">#</a>总结</h2>
<p><code>&lt;numeric&gt;</code> 头文件为 C++ 开发者提供了一套声明式、高效且功能强大的工具。通过使用这些算法，我们可以：</p>
<ul>
<li><strong>提高代码可读性</strong>：算法的名称（如 <code>accumulate</code>, <code>transform_reduce</code>）清晰地表达了代码的意图。</li>
<li><strong>提升代码性能</strong>：C++17 引入的并行版本算法可以充分利用现代多核 CPU 的计算能力。</li>
<li><strong>减少错误</strong>：标准库算法经过了充分的测试和优化，比手写的循环更可靠。</li>
</ul>
<p>下次当你需要对一个序列进行数值计算时，不妨先查阅一下 <code>&lt;numeric&gt;</code> 头文件，很可能已经有一个完美的算法在等着你了。</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://cppreference.cn/w/cpp/numeric" target="_blank" rel="noopener noreferrer" class="rp-link">https://cppreference.cn/w/cpp/numeric</a></li>
<li><a href="https://cplusplus.com/reference/numeric/" target="_blank" rel="noopener noreferrer" class="rp-link">https://cplusplus.com/reference/numeric/</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C++ STL 容器介绍]]></title>
        <id>/blog/2025/cpp-stl-containers-overview</id>
        <link href="https://www.vhcffh.com/blog/2025/cpp-stl-containers-overview"/>
        <updated>2025-08-13T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="c-stl-容器介绍"><span>C++ STL 容器介绍</span><a href="#c-stl-容器介绍" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>C++ 标准模板库（STL）是 C++ 语言的基石之一，它提供了一套性能卓越、经过严格测试的通用算法和数据结构。其中，容器是 STL 最核心的部分，它们是用于管理和存储对象集合的类模板。正确地选择容器，不仅能让代码更简洁、更安全，还能显著提升程序的性能。</p>
<p>本文将全面介绍 C++ 中常见的各类容器，分析它们的内部实现、优缺点以及最佳适用场景，帮助你今后在项目开发中做出明智的选择。</p>
<p>C++ 容器主要可以分为三类：<strong>顺序容器</strong>、<strong>关联容器</strong>和<strong>无序关联容器</strong>。</p>
<h2 class="rp-toc-include" id="顺序容器-sequence-containers"><a href="#顺序容器-sequence-containers" class="rp-header-anchor rp-link" aria-hidden="true">#</a>顺序容器 (Sequence Containers)</h2>
<p>顺序容器中的元素按照严格的线性顺序排列。你可以精确地控制每个元素的位置。</p>
<h3 class="rp-toc-include" id="stdvector"><a href="#stdvector" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::vector</code></h3>
<ul>
<li><strong>特点</strong>：动态数组。所有元素在内存中<strong>连续存储</strong>。</li>
<li><strong>优点</strong>：
<ul>
<li><strong>访问最快</strong>：通过索引 <code>[]</code> 或 <code>.at()</code> 进行随机访问的时间复杂度为 O(1)，并且由于内存连续，能很好地利用 CPU 缓存。</li>
<li><strong>尾部操作高效</strong>：在尾部添加/删除元素（<code>.push_back()</code>, <code>.pop_back()</code>）的平均时间复杂度为 O(1)。</li>
</ul>
</li>
<li><strong>缺点</strong>：
<ul>
<li><strong>中间插入/删除慢</strong>：在容器开头或中间插入/删除元素的时间复杂度为 O(n)，因为它需要移动之后的所有元素。</li>
<li><strong>可能触发重分配</strong>：当 <code>vector</code> 容量不足时，它会重新分配一块更大的内存，并将所有旧元素拷贝过去，这可能是一个耗时的操作。</li>
</ul>
</li>
<li><strong>适用场景</strong>：需要快速随机访问，且主要在尾部进行添加/删除操作的场景。<strong>这是最常用、最应该被首选的容器。</strong></li>
</ul>
<h3 class="rp-toc-include" id="stddeque-double-ended-queue"><a href="#stddeque-double-ended-queue" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::deque</code> (Double-Ended Queue)</h3>
<ul>
<li><strong>特点</strong>：双端队列。其内部实现并非一整块连续内存，而是由多个连续的内存块（chunks）链接而成。</li>
<li><strong>优点</strong>：
<ul>
<li><strong>两端操作高效</strong>：支持在头部和尾部快速添加/删除元素，时间复杂度均为 O(1)。</li>
<li><strong>支持随机访问</strong>：虽然其随机访问性能略逊于 <code>vector</code>（需要两次指针解引用），但时间复杂度仍为 O(1)。</li>
</ul>
</li>
<li><strong>缺点</strong>：
<ul>
<li><strong>中间插入/删除慢</strong>：与 <code>vector</code> 类似，中间操作的时间复杂度为 O(n)。</li>
<li><strong>内存不连续</strong>：缓存命中率低于 <code>vector</code>，遍历速度可能稍慢。</li>
</ul>
</li>
<li><strong>适用场景</strong>：需要频繁地在容器的两端进行插入和删除操作的场景，例如实现一个既能先进先出又能后进先出的队列。</li>
</ul>
<h3 class="rp-toc-include" id="stdlist"><a href="#stdlist" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::list</code></h3>
<ul>
<li><strong>特点</strong>：双向链表。每个元素都存储着指向前一个和后一个元素的指针。</li>
<li><strong>优点</strong>：在<strong>任何位置插入/删除元素都非常快</strong>（O(1)），前提是你已经拥有指向该位置的迭代器。</li>
<li><strong>缺点</strong>：
<ul>
<li><strong>不支持随机访问</strong>：无法通过索引（如 <code>list[i]</code>）访问元素。要访问第 n 个元素，必须从头或尾开始遍历 n 次，时间复杂度为 O(n)。</li>
<li><strong>内存开销大</strong>：每个元素都需要额外的空间来存储前后指针。</li>
</ul>
</li>
<li><strong>适用场景</strong>：需要对集合进行大量、不规律的插入和删除操作，而对随机访问没有要求的场景。</li>
</ul>
<h3 class="rp-toc-include" id="stdarray-c11"><a href="#stdarray-c11" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::array</code> (C++11)</h3>
<ul>
<li><strong>特点</strong>：固定大小的数组，是对 C 风格数组的现代封装。大小在编译时确定，不可改变。</li>
<li><strong>优点</strong>：性能与 C 风格数组完全相同，但提供了更安全、更方便的接口（如获取大小、迭代器支持、边界检查等）。</li>
<li><strong>缺点</strong>：大小固定，缺乏灵活性。</li>
<li><strong>适用场景</strong>：当你明确知道需要一个在编译期就确定大小的数组时。</li>
</ul>
<h2 class="rp-toc-include" id="关联容器-associative-containers"><a href="#关联容器-associative-containers" class="rp-header-anchor rp-link" aria-hidden="true">#</a>关联容器 (Associative Containers)</h2>
<p>关联容器根据<strong>键 (key)</strong> 来高效地排序和存储元素。它们非常适合用于快速查找。</p>
<h3 class="rp-toc-include" id="stdmap"><a href="#stdmap" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::map</code></h3>
<ul>
<li><strong>特点</strong>：存储<strong>键-值对 (key-value pairs)</strong>，其中键是唯一的。内部通常由<strong>红黑树</strong>实现，元素自动按键的升序排序。</li>
<li><strong>优点</strong>：可以根据键快速查找、插入和删除元素，平均时间复杂度为 O(log n)。</li>
<li><strong>适用场景</strong>：需要存储键值对，并且要求元素能<strong>自动排序</strong>的场景。</li>
</ul>
<h3 class="rp-toc-include" id="stdset"><a href="#stdset" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::set</code></h3>
<ul>
<li><strong>特点</strong>：只存储<strong>唯一的键</strong>。和 <code>map</code> 一样，内部也是由红黑树实现，元素自动排序。</li>
<li><strong>优点</strong>：快速查找、插入和删除（O(log n)）。常用于检查一个元素是否存在于一个集合中。</li>
<li><strong>适用场景</strong>：需要存储不重复的元素，并要求它们保持有序。</li>
</ul>
<blockquote>
<p><code>std::multimap</code> 和 <code>std::multiset</code> 分别是 <code>map</code> 和 <code>set</code> 的多键版本，它们允许存储重复的键。</p>
</blockquote>
<h2 class="rp-toc-include" id="无序关联容器-unordered-associative-containers"><a href="#无序关联容器-unordered-associative-containers" class="rp-header-anchor rp-link" aria-hidden="true">#</a>无序关联容器 (Unordered Associative Containers)</h2>
<p>这类容器在 C++11 中引入，它们也存储键或键值对，但基于<strong>哈希表 (Hash Table)</strong> 实现，不保证元素有序，换来的是更快的平均性能。</p>
<h3 class="rp-toc-include" id="stdunordered_map"><a href="#stdunordered_map" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::unordered_map</code></h3>
<ul>
<li><strong>特点</strong>：存储键-值对，键是唯一的。通过哈希函数将键映射到桶 (bucket) 中以实现快速访问。</li>
<li><strong>优点</strong>：提供了<strong>最快的平均查找、插入和删除速度</strong>，平均时间复杂度为 O(1)。</li>
<li><strong>缺点</strong>：
<ul>
<li>元素是无序的。</li>
<li>在最坏情况下（所有元素哈希到同一个桶中），性能会退化到 O(n)。</li>
<li>需要为哈希表本身和键的哈希值消耗额外内存。</li>
</ul>
</li>
<li><strong>适用场景</strong>：追求极致查找性能，且不关心元素顺序的场景。<strong>这是 <code>std::map</code> 的常用高性能替代品。</strong></li>
</ul>
<h3 class="rp-toc-include" id="stdunordered_set"><a href="#stdunordered_set" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::unordered_set</code></h3>
<ul>
<li><strong>特点</strong>：只存储唯一的键，基于哈希表实现。</li>
<li><strong>优点</strong>：最快的平均查找、插入和删除速度（O(1)）。</li>
<li><strong>适用场景</strong>：需要以最高性能判断一个元素是否存在于集合中，且不关心顺序。</li>
</ul>
<h2 class="rp-toc-include" id="总结与选择建议"><a href="#总结与选择建议" class="rp-header-anchor rp-link" aria-hidden="true">#</a>总结与选择建议</h2>
<p>为了方便选择，下表总结了各类容器的特点：</p>





















































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">需求</th><th style="text-align:left">推荐容器</th><th style="text-align:left">备选方案</th><th style="text-align:left">时间复杂度 (平均)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>快速随机访问</strong></td><td style="text-align:left"><code>std::vector</code></td><td style="text-align:left"><code>std::deque</code>, <code>std::array</code></td><td style="text-align:left">O(1)</td></tr><tr><td style="text-align:left"><strong>大量中间插入/删除</strong></td><td style="text-align:left"><code>std::list</code></td><td style="text-align:left"><code>std::forward_list</code></td><td style="text-align:left">O(1)</td></tr><tr><td style="text-align:left"><strong>快速两端插入/删除</strong></td><td style="text-align:left"><code>std::deque</code></td><td style="text-align:left"><code>std::list</code></td><td style="text-align:left">O(1)</td></tr><tr><td style="text-align:left"><strong>键值对存储 (有序)</strong></td><td style="text-align:left"><code>std::map</code></td><td style="text-align:left"><code>std::multimap</code></td><td style="text-align:left">O(log n)</td></tr><tr><td style="text-align:left"><strong>键值对存储 (最快查找)</strong></td><td style="text-align:left"><code>std::unordered_map</code></td><td style="text-align:left"><code>std::unordered_multimap</code></td><td style="text-align:left">O(1)</td></tr><tr><td style="text-align:left"><strong>存储唯一元素 (有序)</strong></td><td style="text-align:left"><code>std::set</code></td><td style="text-align:left"><code>std::multiset</code></td><td style="text-align:left">O(log n)</td></tr><tr><td style="text-align:left"><strong>存储唯一元素 (最快查找)</strong></td><td style="text-align:left"><code>std::unordered_set</code></td><td style="text-align:left"><code>std::unordered_multiset</code></td><td style="text-align:left">O(1)</td></tr></tbody></table></div>
<p><strong>通用建议</strong>：</p>
<ol>
<li>如果不确定用什么，<strong><code>std::vector</code> 通常是最好的第一选择</strong>。它的性能优秀且用途广泛。</li>
<li>如果需要按键查找，并且不要求排序，<strong><code>std::unordered_map</code> 是 <code>std::map</code> 的高性能替代品</strong>。</li>
<li>只有在需要频繁在容器中间进行插入/删除时，才考虑使用 <code>std::list</code>。</li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[深入理解FreeRTOS任务调度与上下文切换]]></title>
        <id>/blog/2025/freertos-task-scheduling</id>
        <link href="https://www.vhcffh.com/blog/2025/freertos-task-scheduling"/>
        <updated>2025-08-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文深入剖析了FreeRTOS的任务调度核心机制。内容从任务状态、调度器原理讲起，重点详细拆解了任务切换（Context Switch）的全过程，图文并茂地解释了任务堆栈（Stack）的变化，以及SP、PC、LR等关键寄存器在上下文保存与恢复中的作用，帮助读者透彻理解FreeRTOS多任务并发的底层实现。]]></summary>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="深入理解freertos任务调度与上下文切换"><span>深入理解FreeRTOS任务调度与上下文切换</span><a href="#深入理解freertos任务调度与上下文切换" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>FreeRTOS 作为一个轻量级的实时操作系统（RTOS），其核心功能之一就是任务调度。它允许多个任务“同时”运行，为嵌入式系统提供了并发处理能力。要真正理解 FreeRTOS 是如何工作的，就必须深入其任务调度和上下文切换的底层细节。</p>
<p>本文将详细解析 FreeRTOS 的任务调度过程，特别是任务切换时堆栈（Stack）和关键寄存器（SP, PC 等）的变化情况。</p>
<h2 class="rp-toc-include" id="任务状态"><a href="#任务状态" class="rp-header-anchor rp-link" aria-hidden="true">#</a>任务状态</h2>
<p>在任何时刻，一个任务都必然处于以下几种状态之一：</p>
<ul>
<li><strong>运行态 (Running)</strong>: 任务当前正在 CPU 上执行。在单核处理器上，永远只有一个任务处于运行态。</li>
<li><strong>就绪态 (Ready)</strong>: 任务已经准备好，可以运行，但因为有更高优先级的任务正在运行，所以它在等待 CPU。</li>
<li><strong>阻塞态 (Blocked)</strong>: 任务正在等待某个外部事件（例如 <code>vTaskDelay</code> 延时、等待信号量、队列数据等），在此期间它不会被调度。</li>
<li><strong>挂起态 (Suspended)</strong>: 任务被显式地“暂停”，除非被显式地恢复，否则调度器会完全忽略它。</li>
</ul>
<p>调度器的核心职责，就是在所有处于“就绪态”的任务中，选择优先级最高的那个，让它进入“运行态”。</p>
<h2 class="rp-toc-include" id="freertos-调度器原理"><a href="#freertos-调度器原理" class="rp-header-anchor rp-link" aria-hidden="true">#</a>FreeRTOS 调度器原理</h2>
<p>FreeRTOS 采用的是<strong>基于优先级</strong>的<strong>抢占式调度</strong>算法。</p>
<ul>
<li><strong>基于优先级</strong>: 每个任务都被赋予一个优先级。调度器总是确保当前运行的是所有就绪态任务中优先级最高的那个。</li>
<li><strong>抢占式</strong>: 如果一个高优先级的任务变为就绪态（例如，一个中断服务程序唤醒了它），而当前正在运行的是一个低优先级的任务，调度器会立即暂停（抢占）低优先级任务，让高优先级任务运行。</li>
</ul>
<p>这种机制的切换点被称为<strong>上下文切换 (Context Switch)</strong>。</p>
<h2 class="rp-toc-include" id="上下文切换-context-switch-详解"><a href="#上下文切换-context-switch-详解" class="rp-header-anchor rp-link" aria-hidden="true">#</a>上下文切换 (Context Switch) 详解</h2>
<p>上下文切换是 FreeRTOS 实现多任务并发的魔法核心。它指的是保存当前运行任务的 CPU 状态（上下文），然后加载即将运行任务的 CPU 状态的过程。</p>
<p><strong>任务的上下文主要包括：</strong></p>
<ol>
<li><strong>CPU 寄存器</strong>: 通用寄存器（在 ARM Cortex-M 中如 R0-R12）、程序计数器 (PC)、链接寄存器 (LR)、程序状态寄存器 (PSR) 等。</li>
<li><strong>任务堆栈指针 (SP)</strong>: 指向该任务私有堆栈的栈顶。</li>
</ol>
<p>每个任务都有一个独立的<strong>任务控制块 (Task Control Block, TCB)</strong>，它是一个数据结构，用于存储任务的所有信息，其中最重要的就是任务的堆栈指针 <code>pxTopOfStack</code>。</p>
<h3 class="rp-toc-include" id="切换过程拆解"><a href="#切换过程拆解" class="rp-header-anchor rp-link" aria-hidden="true">#</a>切换过程拆解</h3>
<p>假设当前正在运行 <code>Task_Low</code> (低优先级)，此时一个中断发生，使得 <code>Task_High</code> (高优先级) 从阻塞态变为了就绪态。当中断服务程序（ISR）完成时，调度器将被触发，执行一次上下文切换。</p>
<div></div>
<p><em>上下文切换流程图</em></p>
<h4 class="rp-toc-include" id="第-1-步保存-task_low-的上下文"><a href="#第-1-步保存-task_low-的上下文" class="rp-header-anchor rp-link" aria-hidden="true">#</a>第 1 步：保存 <code>Task_Low</code> 的上下文</h4>
<p>当中断发生时，CPU 硬件会自动将一部分核心寄存器（如 PC, PSR, LR 等）压入 <code>Task_Low</code> 的堆栈。在 FreeRTOS 的切换机制（通常在 <code>PendSV_Handler</code> 中实现）里，会继续执行以下操作：</p>
<ol>
<li><strong>软件压栈</strong>: 将 CPU 中剩余的通用寄存器（R4-R11 等，具体取决于架构）也压入 <code>Task_Low</code> 的堆栈。</li>
<li><strong>保存 SP</strong>: 将当前堆栈指针 SP 的值，保存到 <code>Task_Low</code> 的 TCB 中的 <code>pxTopOfStack</code> 成员里。</li>
</ol>
<p>至此，<code>Task_Low</code> 的所有“记忆”（即它运行到哪里，各个寄存器的值是什么）都被完整地保存在了它自己的堆栈中。</p>
<h4 class="rp-toc-include" id="第-2-步选择下一个要运行的任务"><a href="#第-2-步选择下一个要运行的任务" class="rp-header-anchor rp-link" aria-hidden="true">#</a>第 2 步：选择下一个要运行的任务</h4>
<p>调度器会查看就绪任务列表，发现 <code>Task_High</code> 是当前优先级最高的就绪任务，因此决定下一个运行它。</p>
<h4 class="rp-toc-include" id="第-3-步恢复-task_high-的上下文"><a href="#第-3-步恢复-task_high-的上下文" class="rp-header-anchor rp-link" aria-hidden="true">#</a>第 3 步：恢复 <code>Task_High</code> 的上下文</h4>
<ol>
<li><strong>加载 SP</strong>: 从 <code>Task_High</code> 的 TCB 中，读取 <code>pxTopOfStack</code> 的值，并将其加载到 CPU 的 SP 寄存器中。现在，SP 指向了 <code>Task_High</code> 的堆栈顶。</li>
<li><strong>软件弹栈</strong>: 从 <code>Task_High</code> 的堆栈中，将之前保存的 R4-R11 等通用寄存器依次弹出，恢复到 CPU 的相应寄存器中。</li>
<li><strong>硬件弹栈与返回</strong>: 当 <code>PendSV_Handler</code> 退出时，CPU 硬件会自动从 <code>Task_High</code> 的堆栈中弹出之前保存的 PC, PSR, LR 等寄存器。</li>
</ol>
<p>当 PC 寄存器被恢复后，CPU 的下一条指令就会从 <code>Task_High</code> 上次被中断的地方继续执行。至此，一次完整的上下文切换完成。</p>
<h3 class="rp-toc-include" id="堆栈与寄存器变化图解"><a href="#堆栈与寄存器变化图解" class="rp-header-anchor rp-link" aria-hidden="true">#</a>堆栈与寄存器变化图解</h3>
<p>让我们更直观地看看这个过程。</p>
<p><strong>1. 切换前:</strong></p>
<ul>
<li>CPU 的 SP 寄存器指向 <code>Task_Low</code> 的堆栈。</li>
<li>CPU 的 PC 寄存器指向 <code>Task_Low</code> 正在执行的代码。</li>
</ul>
<div></div>
<p><strong>2. 切换中 (保存 <code>Task_Low</code>):</strong></p>
<ul>
<li><code>Task_Low</code> 的所有寄存器被压入其堆栈。</li>
<li><code>Task_Low</code> 的 TCB 更新：<code>tcb_low.pxTopOfStack = SP</code>。</li>
</ul>
<div></div>
<p><strong>3. 切换中 (恢复 <code>Task_High</code>):</strong></p>
<ul>
<li>SP 更新：<code>SP = tcb_high.pxTopOfStack</code>。</li>
<li><code>Task_High</code> 的寄存器从其堆栈中弹出到 CPU。</li>
</ul>
<div></div>
<p><strong>4. 切换后:</strong></p>
<ul>
<li>CPU 的 SP 寄存器指向 <code>Task_High</code> 的堆栈。</li>
<li>CPU 的 PC 寄存器指向 <code>Task_High</code> 的代码。<code>Task_High</code> 开始运行。</li>
</ul>
<h2 class="rp-toc-include" id="关键寄存器的作用"><a href="#关键寄存器的作用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>关键寄存器的作用</h2>
<ul>
<li><strong>SP (Stack Pointer)</strong>: 任务切换的“定位器”。它的值在 TCB 和 CPU 之间来回传递，确保了每个任务都能找到自己独立的堆栈空间。</li>
<li><strong>PC (Program Counter)</strong>: 任务执行的“指令指针”。保存和恢复 PC 是实现任务断点续传的关键，使得任务看起来像是连续执行的。</li>
<li><strong>LR (Link Register)</strong>: 函数调用的“返回地址”。每个任务都有自己的调用栈，LR 必须作为上下文的一部分被保存，否则函数调用关系会错乱。</li>
<li><strong>PSR (Program Status Register)</strong>: 任务的“状态标志”。包含了条件码（零、负、进位等），控制着条件分支的执行，必须被精确恢复。</li>
</ul>
<h2 class="rp-toc-include" id="总结"><a href="#总结" class="rp-header-anchor rp-link" aria-hidden="true">#</a>总结</h2>
<p>FreeRTOS 的任务调度是一个高效且精巧的机制。它通过为每个任务维护一个独立的堆栈和 TCB，在上下文切换时，利用 <code>PendSV</code> 这个特殊设计的低优先级中断，快速地保存和恢复 CPU 寄存器，从而实现了任务之间的无缝切换。</p>
<p>理解这一底层过程，不仅能帮助我们更好地使用 FreeRTOS，还能在遇到多任务相关的疑难- 杂症时，提供更深入的调试思路。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C++位操作]]></title>
        <id>/blog/2025/cpp-bit-manipulation-comprehensive-guide</id>
        <link href="https://www.vhcffh.com/blog/2025/cpp-bit-manipulation-comprehensive-guide"/>
        <updated>2025-08-04T00:00:00.000Z</updated>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="c位操作"><span>C++位操作</span><a href="#c位操作" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>位操作是程序员的“超能力”之一。它允许我们深入到数据的最底层，直接操控二进制位，从而实现高效的算法、紧凑的数据存储和底层的硬件交互。C++ 语言提供了一套丰富且不断进化的工具集来支持位操作，从经典的位运算符到 C++20 引入的高性能函数，应有尽有。</p>
<p>本文将系统性地介绍 C++ 中所有与位操作相关的函数和工具，分为四个类别，并提供清晰的示例，帮助你彻底掌握它们。</p>
<h2 class="rp-toc-include" id="基础核心位运算符"><a href="#基础核心位运算符" class="rp-header-anchor rp-link" aria-hidden="true">#</a>基础核心：位运算符</h2>
<p>这是所有位操作的基石。它们是 C++ 内置的运算符，直接对整数类型进行操作。</p>








































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">运算符</th><th style="text-align:left">名称</th><th style="text-align:left">描述</th></tr></thead><tbody><tr><td style="text-align:left"><code>&amp;</code></td><td style="text-align:left">按位与 (AND)</td><td style="text-align:left">两个操作数对应位都为 1 时，结果位才为 1。</td></tr><tr><td style="text-align:left"><code>|</code></td><td style="text-align:left">按位或 (OR)</td><td style="text-align:left">两个操作数对应位只要有 1 个为 1，结果位就为 1。</td></tr><tr><td style="text-align:left"><code>^</code></td><td style="text-align:left">按位异或 (XOR)</td><td style="text-align:left">两个操作数对应位不同时，结果位为 1，相同时为 0。</td></tr><tr><td style="text-align:left"><code>~</code></td><td style="text-align:left">按位取反 (NOT)</td><td style="text-align:left">翻转操作数的每一位（0 变 1，1 变 0）。</td></tr><tr><td style="text-align:left"><code>&lt;&lt;</code></td><td style="text-align:left">左移</td><td style="text-align:left">将操作数的所有位向左移动指定的位数，右侧补 0。</td></tr><tr><td style="text-align:left"><code>&gt;&gt;</code></td><td style="text-align:left">右移</td><td style="text-align:left">将操作数的所有位向右移动指定的位数，左侧补位（对于无符号数补 0，对于有符号数取决于实现）。</td></tr></tbody></table></div>
<p><strong>示例</strong></p>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iostream&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;bitset&gt;</span><span style="color:var(--shiki-token-comment)"> // 用于二进制可视化</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iomanip&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    unsigned</span><span style="color:var(--shiki-token-keyword)"> char</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0b</span><span style="color:var(--shiki-token-constant)">01010101</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 85</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    unsigned</span><span style="color:var(--shiki-token-keyword)"> char</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0b</span><span style="color:var(--shiki-token-constant)">11110000</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 240</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;a = &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bitset</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">&gt;(a) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: a = 01010101</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;b = &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bitset</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">&gt;(b) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: b = 11110000</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;-------------------------&quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;a &amp; b = &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bitset</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">&gt;(a </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> b) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: a &amp; b = 01010000</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;a | b = &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bitset</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">&gt;(a </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> b) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: a | b = 11110101</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;a ^ b = &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bitset</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">&gt;(a </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> b) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: a ^ b = 10100101</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;~a    = &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bitset</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">&gt;(</span><span style="color:var(--shiki-token-keyword)">~</span><span style="color:var(--shiki-foreground)">a) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)">    // 输出: ~a    = 10101010</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;a &lt;&lt; 2= &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bitset</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">&gt;(a </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: a &lt;&lt; 2= 01010100</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;b &gt;&gt; 2= &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bitset</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">&gt;(b </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: b &gt;&gt; 2= 00111100</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="函数式编程的优雅functional-c14"><a href="#函数式编程的优雅functional-c14" class="rp-header-anchor rp-link" aria-hidden="true">#</a>函数式编程的优雅：<code>&lt;functional&gt;</code> (C++14)</h2>
<p>为了让位运算能与 STL 算法（如 <code>std::accumulate</code>）无缝协作，C++14 在 <code>&lt;functional&gt;</code> 头文件中引入了一组函数对象。</p>
<ul>
<li><code>std::bit_and&lt;T&gt;</code>: 执行按位与 (<code>&amp;</code>)。</li>
<li><code>std::bit_or&lt;T&gt;</code>: 执行按位或 (<code>|</code>)。</li>
<li><code>std::bit_xor&lt;T&gt;</code>: 执行按位异或 (<code>^</code>)。</li>
<li><code>std::bit_not&lt;T&gt;</code>: 执行按位取反 (<code>~</code>)。</li>
</ul>
<p>它们的主要优势在于作为“可调用对象”传递，使代码更具表现力。</p>
<p><strong>示例：计算向量中所有元素的异或和</strong></p>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iostream&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;vector&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;numeric&gt;</span><span style="color:var(--shiki-token-comment)">    // For std::accumulate</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;functional&gt;</span><span style="color:var(--shiki-token-comment)"> // For std::bit_xor</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">vector</span><span style="color:var(--shiki-token-keyword)">&lt;int&gt;</span><span style="color:var(--shiki-foreground)"> nums </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">};</span><span style="color:var(--shiki-token-comment)"> // 01, 10, 11, 100, 101</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 计算 ((((0^1)^2)^3)^4)^5</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> xor_sum </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">accumulate</span><span style="color:var(--shiki-foreground)">(</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        nums</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">begin</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        nums</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">end</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-comment)">                  // 初始值</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bit_xor</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">&gt;()</span><span style="color:var(--shiki-token-comment)"> // 操作函数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    );</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;XOR sum of the vector is: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> xor_sum </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: XOR sum of the vector is: 1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="现代-c的高性能工具箱bit-c20"><a href="#现代-c的高性能工具箱bit-c20" class="rp-header-anchor rp-link" aria-hidden="true">#</a>现代 C++的高性能工具箱：<code>&lt;bit&gt;</code> (C++20)</h2>
<p>C++20 带来了革命性的 <code>&lt;bit&gt;</code> 头文件，提供了一组高效的底层位操作函数，它们通常能直接映射到现代 CPU 的硬件指令，性能极高。</p>
<ul>
<li><code>std::popcount(n)</code>: 计算 <code>n</code> 中值为 1 的位的数量（&quot;population count&quot;）。</li>
<li><code>std::has_single_bit(n)</code>: 检查 <code>n</code> 是否是 2 的幂（即是否只有一个位是 1）。</li>
<li><code>std::countl_zero(n)</code> / <code>std::countr_zero(n)</code>: 分别计算从左（高位）或从右（低位）开始的连续 0 的数量。</li>
<li><code>std::bit_ceil(n)</code> / <code>std::bit_floor(n)</code>: 分别计算大于等于 <code>n</code> の最小的 2 的幂和小于等于 <code>n</code> 的最大的 2 的幂。</li>
<li><code>std::rotl(n, s)</code> / <code>std::rotr(n, s)</code>: 将 <code>n</code> 循环左移或右移 <code>s</code> 位。</li>
</ul>
<p><strong>示例</strong></p>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iostream&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;bit&gt;</span><span style="color:var(--shiki-token-comment)"> // 需要 C++20</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;bitset&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    unsigned</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> num </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 42</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 二进制: ...00101010</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Number: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> num </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Number: 42</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Popcount (number of set bits): &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">popcount</span><span style="color:var(--shiki-foreground)">(num) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Popcount (number of set bits): 3</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Is power of two? &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">boolalpha </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">has_single_bit</span><span style="color:var(--shiki-foreground)">(num) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Is power of two? false</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Ceiling to power of two: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bit_ceil</span><span style="color:var(--shiki-foreground)">(num) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Ceiling to power of two: 64</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Floor to power of two: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bit_floor</span><span style="color:var(--shiki-foreground)">(num) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Floor to power of two: 32</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 对于一个 8 位数</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    unsigned</span><span style="color:var(--shiki-token-keyword)"> char</span><span style="color:var(--shiki-foreground)"> byte </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0b</span><span style="color:var(--shiki-token-constant)">00110100</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 52</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;\nByte: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bitset</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">&gt;(byte) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Byte: 00110100</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Count leading zeros: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">countl_zero</span><span style="color:var(--shiki-foreground)">(byte) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Count leading zeros: 2</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Count trailing zeros: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">countr_zero</span><span style="color:var(--shiki-foreground)">(byte) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Count trailing zeros: 2</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Rotate left by 2: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">bitset</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">&gt;(std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">rotl</span><span style="color:var(--shiki-foreground)">(byte</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">)) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Rotate left by 2: 11010000</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="面向对象的位容器bitset"><a href="#面向对象的位容器bitset" class="rp-header-anchor rp-link" aria-hidden="true">#</a>面向对象的位容器：<code>&lt;bitset&gt;</code></h2>
<p><code>std::bitset</code> 是一个类模板，用于管理一个固定大小的位序列。它像一个 <code>bool</code> 数组，但为位操作进行了空间和性能优化，并提供了丰富的成员函数。</p>
<ul>
<li><strong>构造</strong>: 可以从整数、字符串等创建。</li>
<li><strong>访问与修改</strong>: <code>[]</code>, <code>set()</code>, <code>reset()</code>, <code>flip()</code>。</li>
<li><strong>查询</strong>: <code>count()</code>, <code>size()</code>, <code>any()</code>, <code>none()</code>, <code>all()</code>。</li>
<li><strong>转换</strong>: <code>to_string()</code>, <code>to_ulong()</code>, <code>to_ullong()</code>。</li>
</ul>
<p><strong>示例</strong></p>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iostream&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;bitset&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;string&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 创建一个 8 位的 bitset</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">bitset</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-token-function)"> flags</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;01010011&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Initial flags: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> flags </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Initial flags: 01010011</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Number of active flags: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-token-constant)"> flags</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">count</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Number of active flags: 4</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 检查特定标志位</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">flags</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">]) {</span><span style="color:var(--shiki-token-comment)"> // 第 2 位 (从右到左)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Flag 2 is active.&quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Flag 2 is active.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 修改标志位</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    flags</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">flip</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)"> // 翻转最高位</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    flags</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">set</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)">  // 激活最低位</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Modified flags: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> flags </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Modified flags: 11010011</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 转换为整数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Integer value: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-token-constant)"> flags</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">to_ulong</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 输出: Integer value: 211</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="总结"><a href="#总结" class="rp-header-anchor rp-link" aria-hidden="true">#</a>总结</h2>



































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">功能 (Feature)</th><th style="text-align:left">来源 (Source)</th><th style="text-align:left">核心用途</th><th style="text-align:left">C++ 版本</th></tr></thead><tbody><tr><td style="text-align:left"><strong>位运算符</strong></td><td style="text-align:left">C++ 语言内置</td><td style="text-align:left">基础、直接的位运算</td><td style="text-align:left">C++98</td></tr><tr><td style="text-align:left"><strong>位运算函数对象</strong></td><td style="text-align:left"><code>&lt;functional&gt;</code></td><td style="text-align:left">与 STL 算法结合，实现函数式风格</td><td style="text-align:left">C++14</td></tr><tr><td style="text-align:left"><strong>高性能位函数</strong></td><td style="text-align:left"><code>&lt;bit&gt;</code></td><td style="text-align:left">高性能、访问底层 CPU 指令</td><td style="text-align:left">C++20</td></tr><tr><td style="text-align:left"><strong>位序列容器</strong></td><td style="text-align:left"><code>&lt;bitset&gt;</code></td><td style="text-align:left">管理固定大小的位集合，如标志位、掩码</td><td style="text-align:left">C++98</td></tr></tbody></table></div>
<p><strong>如何选择？</strong></p>
<ul>
<li><strong>日常简单操作</strong>: 直接使用<strong>位运算符</strong> (<code>&amp;</code>, <code>|</code>, <code>^</code> 等)。</li>
<li><strong>需要与 STL 算法集成</strong>: 使用 <code>&lt;functional&gt;</code> 中的<strong>函数对象</strong>。</li>
<li><strong>追求极致性能或需要高级位操作</strong> (如 <code>popcount</code>, 循环移位): 优先使用 C++20 的 <code>&lt;bit&gt;</code> 库。</li>
<li><strong>需要管理一组状态标志或构建位掩码</strong>: <code>std::bitset</code> 是最清晰、最安全的选择。</li>
</ul>
<p>通过掌握这些工具，你可以在 C++ 中编写出更高效、更优雅、更底层的代码。希望这篇指南能成为你探索位操作世界的得力助手!</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[深入理解 C++ 左值、右值与移动语义]]></title>
        <id>/blog/2025/C++-lvalue-rvalue-reference</id>
        <link href="https://www.vhcffh.com/blog/2025/C++-lvalue-rvalue-reference"/>
        <updated>2025-08-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文深入讲解了C++中的左值与右值引用。内容涵盖了左值和右值的基本概念，详细对比了左值引用(&)和右值引用(&&)的绑定规则与用途，并解释了`const T&`的特殊性以及`std::move`的作用。通过函数参数传递和自定义`MyString`类的示例，清晰地展示了移动语义如何避免不必要的拷贝，提升程序性能。]]></summary>
        <content type="html"><![CDATA[<h1 class="rp-toc-include" id="深入理解-c-左值右值与移动语义"><span>深入理解 C++ 左值、右值与移动语义</span><a href="#深入理解-c-左值右值与移动语义" class="rp-header-anchor rp-link" aria-hidden="true">#</a> </h1><!--$--><p>在 C++ 的世界里，“引用”是一个既基础又强大的概念。然而，随着 C++11 的到来，引用的家族迎来了新成员——右值引用，这让许多开发者感到困惑。正确理解左值引用和右值引用，以及它们在函数参数传递中的应用，是编写高效、现代 C++ 代码的关键。</p>
<p>本文将系统地梳理 C++ 中的引用，帮助你彻底搞懂它们之间的区别与联系。</p>
<h2 class="rp-toc-include" id="核心概念什么是引用"><a href="#核心概念什么是引用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>核心概念：什么是引用？</h2>
<p>在 C++ 中，<strong>引用（Reference）</strong> 可以看作是一个变量的 <strong>别名（Alias）</strong>。它不是一个新变量，也不占用新的内存空间（在底层实现上，它通常是一个指针常量，但我们从语言层面理解它就是个别名）。一旦引用被初始化为一个变量，它就终生绑定到这个变量上，不能再改为其他变量的引用。</p>
<p>对引用的任何操作，都等同于对它所绑定的原始变量进行操作。</p>
<h2 class="rp-toc-include" id="左值lvalue与右值rvalue"><a href="#左值lvalue与右值rvalue" class="rp-header-anchor rp-link" aria-hidden="true">#</a>左值（Lvalue）与右值（Rvalue）</h2>
<p>在深入了解两种引用之前，我们必须先掌握左值和右值的概念。</p>
<ul>
<li>
<p><strong>左值 (Lvalue - Locator Value)</strong>: 指的是那些在内存中有固定地址、可以被“定位”到的表达式。简单来说，<strong>可以出现在赋值符号 <code>=</code> 左边的就是左值</strong>。</p>
<ul>
<li>例如：变量名 (<code>int x = 10;</code> 这里的 <code>x</code> 就是左值)、数组元素、函数返回的引用等。</li>
<li>特点：有持久的内存地址，不是临时的。</li>
</ul>
</li>
<li>
<p><strong>右值 (Rvalue - Read Value)</strong>: 指的是那些只能被“读取”的值，通常是临时的、没有固定内存地址的表达式。简单来说，<strong>只能出现在赋值符号 <code>=</code> 右边的就是右值</strong>。</p>
<ul>
<li>例如：字面量 (<code>10</code>, <code>&#x27;a&#x27;</code>)、临时对象（<code>x + y</code> 的计算结果）、函数返回的值（非引用）等。</li>
<li>特点：是临时的，表达式结束后就会被销毁。</li>
</ul>
</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // x 是左值, 10 是右值</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> y </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // y 是左值, 20 是右值</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> z </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> y;</span><span style="color:var(--shiki-token-comment)"> // z 是左值, (x + y) 的计算结果是右值</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="左值引用-lvalue-reference-"><a href="#左值引用-lvalue-reference-" class="rp-header-anchor rp-link" aria-hidden="true">#</a>左值引用 (Lvalue Reference, <code>&amp;</code>)</h2>
<p>这是我们传统意义上最常说的“引用”，使用 <code>&amp;</code> 符号声明。</p>
<p><strong>特点与规则:</strong></p>
<ol>
<li><strong>只能绑定到左值</strong>。</li>
<li>它的主要作用是作为别名，避免大对象的拷贝。</li>
</ol>
<p><strong>示例:</strong></p>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 100</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int&amp;</span><span style="color:var(--shiki-foreground)"> ref_a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a;</span><span style="color:var(--shiki-token-comment)"> // 正确：左值引用 ref_a 绑定到左值 a</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">ref_a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 200</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 修改 ref_a 就是修改 a，此刻 a 的值也变成了 200</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int&amp;</span><span style="color:var(--shiki-foreground)"> ref_b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 编译错误！不能将左值引用绑定到右值 (字面量 10)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="特例const-左值引用"><a href="#特例const-左值引用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>特例：<code>const</code> 左值引用</h3>
<p>一个 <code>const</code> 的左值引用<strong>既可以绑定到左值，也可以绑定到右值</strong>。当它绑定到右值时，C++ 会创建一个临时的、无名的左值对象，并将该引用绑定到这个临时对象上。</p>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-keyword)"> int&amp;</span><span style="color:var(--shiki-foreground)"> ref_c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a;</span><span style="color:var(--shiki-token-comment)">    // 正确：const 左值引用绑定到左值 a</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-keyword)"> int&amp;</span><span style="color:var(--shiki-foreground)"> ref_d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">   // 正确：const 左值引用绑定到右值 10</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-keyword)"> int&amp;</span><span style="color:var(--shiki-foreground)"> ref_e </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">// 正确：const 左值引用绑定到右值 (a+5 的结果)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>这个特性使得 <code>const T&amp;</code> 成为函数参数传递中非常重要的类型，因为它既能接收左值也能接收右值，同时保证了安全性。</p>
<h2 class="rp-toc-include" id="右值引用-rvalue-reference-"><a href="#右值引用-rvalue-reference-" class="rp-header-anchor rp-link" aria-hidden="true">#</a>右值引用 (Rvalue Reference, <code>&amp;&amp;</code>)</h2>
<p>这是 C++11 引入的新特性，使用 <code>&amp;&amp;</code> 符号声明。它的出现主要是为了解决两个问题：<strong>移动语义 (Move Semantics)</strong> 和 <strong>完美转发 (Perfect Forwarding)</strong>。</p>
<p><strong>特点与规则:</strong></p>
<ol>
<li><strong>只能绑定到右值</strong>。</li>
<li>它的核心作用是“窃取”或“移动”右值（临时对象）的资源，从而避免不必要的深拷贝，大幅提升性能。</li>
</ol>
<p><strong>示例:</strong></p>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int&amp;&amp;</span><span style="color:var(--shiki-foreground)"> rref_a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 正确：右值引用 rref_a 绑定到右值 10</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int&amp;&amp;</span><span style="color:var(--shiki-foreground)"> rref_b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 正确：右值引用 rref_b 绑定到右值 (a+5 的结果)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 100</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int&amp;&amp;</span><span style="color:var(--shiki-foreground)"> rref_c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a;</span><span style="color:var(--shiki-token-comment)"> // 错误！不能将右值引用绑定到左值 a</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="stdmove-的作用"><a href="#stdmove-的作用" class="rp-header-anchor rp-link" aria-hidden="true">#</a><code>std::move</code> 的作用</h3>
<p><code>std::move</code> 是一个非常有用的函数，它可以<strong>无条件地将一个左值强制转换为右值引用</strong>。这并不意味着它“移动”了任何东西，它只是做了一个类型转换，告诉编译器：“你可以把这个对象当成一个临时对象来处理了”。</p>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;utility&gt;</span><span style="color:var(--shiki-token-comment)"> // 需要包含 &lt;utility&gt; 头文件</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 100</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int&amp;&amp;</span><span style="color:var(--shiki-foreground)"> rref_d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">move</span><span style="color:var(--shiki-foreground)">(a);</span><span style="color:var(--shiki-token-comment)"> // 正确：通过 std::move 将左值 a 转换为右值引用</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">rref_d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 300</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 修改 rref_d 仍然是修改 a，因为它们指向同一块内存</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 此刻 a 的值也变成了 300</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><strong>注意</strong>：被 <code>std::move</code> 之后，原来的变量 <code>a</code> 就进入了一个“未指定但有效”的状态。你不应该再对它的值做任何假设，它的资源可能已经被“窃取”了。</p>
<h2 class="rp-toc-include" id="作为函数参数"><a href="#作为函数参数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>作为函数参数</h2>
<p>这是理解引用最有价值的场景之一。</p>
<h3 class="rp-toc-include" id="值传递-pass-by-value"><a href="#值传递-pass-by-value" class="rp-header-anchor rp-link" aria-hidden="true">#</a>值传递 (Pass by Value)</h3>
<ul>
<li><strong>工作方式</strong>: 函数会创建参数的一个<strong>完整副本</strong>。函数内部对参数的任何修改都<strong>不会</strong>影响到函数外部的原始变量。</li>
<li><strong>优点</strong>: 安全，函数不会意外修改外部状态。</li>
<li><strong>缺点</strong>: 对于大对象（如 <code>std::vector</code>），创建副本的开销非常大，严重影响性能。</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> process_by_value</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> val) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    val </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 99</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 只修改了副本 val，不影响外部</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="左值引用传递-pass-by-lvalue-reference"><a href="#左值引用传递-pass-by-lvalue-reference" class="rp-header-anchor rp-link" aria-hidden="true">#</a>左值引用传递 (Pass by Lvalue Reference)</h3>
<ul>
<li><strong>工作方式</strong>: 函数接收的是原始变量的<strong>别名</strong>，没有创建任何副本。函数内部对参数的修改<strong>会直接</strong>影响到外部的原始变量。</li>
<li><strong>优点</strong>: 效率高，避免了拷贝开销；能修改外部变量。</li>
<li><strong>缺点</strong>: 可能会意外修改原始数据。如果不想修改，应该使用 <code>const</code>。</li>
</ul>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-comment)">// 允许修改</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> process_by_ref</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int&amp;</span><span style="color:var(--shiki-foreground)"> ref) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    ref </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 99</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> // 直接修改了外部变量</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// 推荐：不允许修改，但同样高效</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> process_by_const_ref</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">string</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> s) {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // s = &quot;new value&quot;; // 编译错误！</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> s </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span><span style="color:var(--shiki-token-comment)"> // 只是读取，非常高效</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><strong>最佳实践</strong>: 当你传递一个大对象且不希望在函数内修改它时，<strong>总是使用 <code>const T&amp;</code></strong>。</p>
<h3 class="rp-toc-include" id="右值引用传递-pass-by-rvalue-reference"><a href="#右值引用传递-pass-by-rvalue-reference" class="rp-header-anchor rp-link" aria-hidden="true">#</a>右值引用传递 (Pass by Rvalue Reference)</h3>
<ul>
<li><strong>工作方式</strong>: 这个函数重载<strong>专门接收右值（临时对象）</strong>。它通常用于实现<strong>移动构造函数</strong>和<strong>移动赋值运算符</strong>。</li>
<li><strong>目的</strong>: 当我们知道传入的是一个临时对象时，我们不需要拷贝它的数据，只需要“窃取”它的内部资源（如指向堆内存的指针），然后将临时对象置为空壳。这就是<strong>移动语义</strong>。</li>
</ul>
<p><strong>示例：一个简单的字符串类</strong></p>
<div class="rp-codeblock language-cpp"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cpp"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;iostream&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;cstring&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;utility&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> MyString</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">private</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    char*</span><span style="color:var(--shiki-foreground)"> data;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    size_t</span><span style="color:var(--shiki-foreground)"> len;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">public</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 构造函数：从 C 风格字符串</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    MyString</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-keyword)"> char*</span><span style="color:var(--shiki-foreground)"> p </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> nullptr</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> (p) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            len </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> strlen</span><span style="color:var(--shiki-foreground)">(p);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-keyword)"> char</span><span style="color:var(--shiki-foreground)">[len </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            strcpy</span><span style="color:var(--shiki-foreground)">(data</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> p);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Constructor called for: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> data </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        } </span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            len </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-keyword)"> char</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            *</span><span style="color:var(--shiki-foreground)">data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)"> &#x27;\0&#x27;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Default Constructor called&quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 析构函数</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    ~MyString</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> (data) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Destructor called for: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> (len </span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-keyword)"> ?</span><span style="color:var(--shiki-foreground)"> data </span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &quot;empty/moved-from string&quot;</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">endl;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        delete[]</span><span style="color:var(--shiki-foreground)"> data;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 拷贝构造函数 (深拷贝)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    MyString</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-function)"> MyString</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> other) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Copy Constructor called (deep copy from: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">data </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;)\n&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        len </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">len;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-keyword)"> char</span><span style="color:var(--shiki-foreground)">[len </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        strcpy</span><span style="color:var(--shiki-foreground)">(data</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">data);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 移动构造函数 (资源窃取)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    MyString</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">MyString</span><span style="color:var(--shiki-token-keyword)">&amp;&amp;</span><span style="color:var(--shiki-foreground)"> other) </span><span style="color:var(--shiki-token-keyword)">noexcept</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Move Constructor called (stealing from: &quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">data </span><span style="color:var(--shiki-token-keyword)">?</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">data </span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &quot;empty&quot;</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;)\n&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        // 窃取资源</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">data;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        len </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">len;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        // 将临时对象置为空壳</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> nullptr</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">len </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 拷贝赋值运算符</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    MyString</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> operator</span><span style="color:var(--shiki-foreground)">=(</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-function)"> MyString</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> other) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Copy Assignment Operator called\n&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-foreground)">other) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            delete[]</span><span style="color:var(--shiki-foreground)"> data;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            len </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">len;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-keyword)"> char</span><span style="color:var(--shiki-foreground)">[len </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            strcpy</span><span style="color:var(--shiki-foreground)">(data</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">data);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 移动赋值运算符</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    MyString</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> operator</span><span style="color:var(--shiki-foreground)">=(</span><span style="color:var(--shiki-token-function)">MyString</span><span style="color:var(--shiki-token-keyword)">&amp;&amp;</span><span style="color:var(--shiki-foreground)"> other) </span><span style="color:var(--shiki-token-keyword)">noexcept</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;Move Assignment Operator called\n&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-foreground)">other) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            delete[]</span><span style="color:var(--shiki-foreground)"> data;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">data;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            len </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">len;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">            other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">data </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> nullptr</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">            other</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">len </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    void</span><span style="color:var(--shiki-token-function)"> print</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">string</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> name) </span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> name </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot; content: \&quot;&quot;</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)"> (data </span><span style="color:var(--shiki-token-keyword)">?</span><span style="color:var(--shiki-foreground)"> data </span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-string-expression)"> &quot;null&quot;</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;\&quot;\n&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">MyString</span><span style="color:var(--shiki-token-function)"> create_string</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-function)"> MyString</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;temporary&quot;</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)"> // 返回一个临时对象 (右值)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;--- 1. Initial construction ---\n&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    MyString </span><span style="color:var(--shiki-token-function)">s1</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;hello&quot;</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)"> // 调用构造函数</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 预期输出: Constructor called for: hello</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;\n--- 2. Copy construction ---\n&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    MyString s2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> s1;</span><span style="color:var(--shiki-token-comment)"> // s1 是左值，调用拷贝构造函数</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 预期输出: Copy Constructor called (deep copy from: hello)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;\n--- 3. Move construction (usually optimized away by RVO) ---\n&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    MyString s3 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> create_string</span><span style="color:var(--shiki-foreground)">();</span><span style="color:var(--shiki-token-comment)"> // create_string() 返回右值，理论上调用移动构造，但常被 RVO 优化</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 预期输出: Constructor called for: temporary (RVO 生效)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;\n--- 4. Force move construction ---\n&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    MyString s4 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-token-function)">move</span><span style="color:var(--shiki-foreground)">(s1);</span><span style="color:var(--shiki-token-comment)"> // std::move(s1) 将 s1 转换为右值，明确调用移动构造函数</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 预期输出: Move Constructor called (stealing from: hello)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;\n--- After move ---\n&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    s1</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;s1&quot;</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)"> // s1 的资源已被移走</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 预期输出: s1 content: &quot;null&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    s4</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;s4&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 预期输出: s4 content: &quot;hello&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    std</span><span style="color:var(--shiki-token-punctuation)">::</span><span style="color:var(--shiki-foreground)">cout </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-string-expression)"> &quot;\n--- End of main (Destructors will be called) ---\n&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 析构函数按栈顺序逆序调用：s4, s3, s2, s1</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 预期输出:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // Destructor called for: hello</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // Destructor called for: temporary</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // Destructor called for: hello</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // Destructor called for: empty/moved-from string</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>在上面的例子中，<code>s4</code> 的创建就得益于移动语义，它没有进行昂贵的内存分配和拷贝，只是交换了指针，效率极高。</p>
<blockquote>
<p><strong>关于返回值优化 (RVO)</strong></p>
<p>你可能会注意到，在编译运行时，第 3 步（<code>MyString s3 = create_string();</code>）并没有像预期那样打印出 &quot;Move Constructor called&quot;。这是因为现代 C++ 编译器会进行一种非常普遍的优化，叫做 <strong>返回值优化 (Return Value Optimization, RVO)</strong>。</p>
<p>编译器会识别出 <code>create_string</code> 函数返回的是一个临时对象，并且这个对象会立即用于构造 <code>s3</code>。因此，编译器会“跳过”创建临时对象的步骤，直接在 <code>s3</code> 的内存空间上构造这个对象，从而避免了一次不必要的移动（或拷贝）操作。这是 C++ 标准允许甚至鼓励的行为，可以极大地提升性能。</p>
<p>所以，即使你看不到移动构造函数的调用，也要理解这背后是移动语义和 RVO 共同作用的结果。第 4 步中使用 <code>std::move</code> 的例子则能更明确地展示移动构造函数的调用。</p>
</blockquote>
<h2 class="rp-toc-include" id="总结"><a href="#总结" class="rp-header-anchor rp-link" aria-hidden="true">#</a>总结</h2>






























<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">特性</th><th style="text-align:left">左值引用 (<code>&amp;</code>)</th><th style="text-align:left">右值引用 (<code>&amp;&amp;</code>)</th></tr></thead><tbody><tr><td style="text-align:left"><strong>声明符号</strong></td><td style="text-align:left"><code>&amp;</code></td><td style="text-align:left"><code>&amp;&amp;</code></td></tr><tr><td style="text-align:left"><strong>绑定对象</strong></td><td style="text-align:left">只能绑定到左值</td><td style="text-align:left">只能绑定到右值</td></tr><tr><td style="text-align:left"><strong><code>const</code> 特例</strong></td><td style="text-align:left"><code>const T&amp;</code> 可以绑定到右值</td><td style="text-align:left">-</td></tr><tr><td style="text-align:left"><strong>主要用途</strong></td><td style="text-align:left">1. 作为变量别名<br/>2. 作为函数参数避免拷贝</td><td style="text-align:left">1. 实现移动语义<br/>2. 实现完美转发</td></tr></tbody></table></div>
<p>掌握左值和右值引用的区别是迈向现代 C++ 开发的重要一步。它不仅能让你写出性能更优的代码，也是理解标准库中许多高级功能（如智能指针、<code>std::vector</code> 的 <code>emplace_back</code>）的基础。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[gcc 编译选项总结]]></title>
        <id>/blog/2025/gcc-build-options</id>
        <link href="https://www.vhcffh.com/blog/2025/gcc-build-options"/>
        <updated>2025-06-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文总结了GCC编译中实用的编译选项及常用库的链接方法。内容列举了`-save-temps`、`-###`、`-fsanitize=address`等高级编译选项，并整理了数学库(-lm)、线程库(-lpthread)等常用系统库以及OpenCV、FFmpeg等第三方库的GCC链接命令，为C/C++开发者提供了便利的参考。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="gcc-编译选项总结"><a href="#gcc-编译选项总结" class="rp-header-anchor rp-link" aria-hidden="true">#</a>gcc 编译选项总结<!-- --> </h1>
<h2 class="rp-toc-include" id="有用的编译选项"><a href="#有用的编译选项" class="rp-header-anchor rp-link" aria-hidden="true">#</a>有用的编译选项</h2>





































































































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:center">编译选项</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:center"><code>-save-temps</code></td><td style="text-align:left">保存生成的预处理 <code>.i</code>、编译<code>.s</code>、汇编 <code>.o</code>生成的临时文件</td></tr><tr><td style="text-align:center"><code>-dM</code></td><td style="text-align:left">生成预定义的宏信息</td></tr><tr><td style="text-align:center"><code>-###</code></td><td style="text-align:left">打印(不执行)gcc 调用的各个子命令</td></tr><tr><td style="text-align:center"><code>-v</code></td><td style="text-align:left">可以打印出 gcc 搜索头文件的路径和顺序</td></tr><tr><td style="text-align:center"><code>-Q --help=optimizers</code></td><td style="text-align:left">打印优化选项</td></tr><tr><td style="text-align:center"><code>-fdiagnostics-color</code></td><td style="text-align:left">通过定义环境变量<code>GCC_COLORS</code>来彩色打印诊断信息</td></tr><tr><td style="text-align:center"><code>-print-file-name</code></td><td style="text-align:left">显示出 gcc 究竟会连接哪个 libc 库</td></tr><tr><td style="text-align:center"><code>-P</code></td><td style="text-align:left">去掉预处理时生成的行号标记</td></tr><tr><td style="text-align:center"><code>-DMACRO</code></td><td style="text-align:left">命令行中预定义一个宏</td></tr><tr><td style="text-align:center"><code>-UMACRO</code></td><td style="text-align:left">命令行中取消一个宏</td></tr><tr><td style="text-align:center"><code>-Wa,option</code></td><td style="text-align:left">将选项<code>option</code>传递给汇编器</td></tr><tr><td style="text-align:center"><code>-Wa,-L</code></td><td style="text-align:left">在目标文件中保留局部符号</td></tr><tr><td style="text-align:center"><code>-fverbose-asm</code></td><td style="text-align:left">生成带有详细信息的汇编文件</td></tr><tr><td style="text-align:center"><code>-fsanitize=address</code></td><td style="text-align:left">生成能检查内存访问错误的可执行文件</td></tr><tr><td style="text-align:center"><code>-fsanitize=thread -fPIE -pie</code></td><td style="text-align:left">生成能检查数据竞争的可执行文件</td></tr><tr><td style="text-align:center"><code>-Wl,option</code></td><td style="text-align:left">将选项<code>option</code>传递给连接器</td></tr><tr><td style="text-align:center"><code>-Wl,-Map=o.map</code></td><td style="text-align:left">让连接器生成内存映射文件</td></tr><tr><td style="text-align:center"><code>__attribute__ ((__used__))</code></td><td style="text-align:left">禁止函数被优化掉</td></tr><tr><td style="text-align:center"><code>__attribute__ ((always_inline))</code></td><td style="text-align:left">强制函数永远以 inline 的形式调用</td></tr><tr><td style="text-align:center"><code>-fsyntax-only</code></td><td style="text-align:left">只做语法检查，不进行实际的编译输出</td></tr><tr><td style="text-align:center"><code>-Wall</code></td><td style="text-align:left">打开警告信息</td></tr><tr><td style="text-align:center"><code>-x</code></td><td style="text-align:left">指定语言类型</td></tr><tr><td style="text-align:center"><code>-fpack-struct=2</code></td><td style="text-align:left">改变结构体成员的字节对齐</td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="常用的系统库"><a href="#常用的系统库" class="rp-header-anchor rp-link" aria-hidden="true">#</a>常用的系统库</h2>













































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">库名称</th><th style="text-align:left">GCC 链接命令</th><th style="text-align:left">作用</th></tr></thead><tbody><tr><td style="text-align:left">math (数学库)</td><td style="text-align:left"><code>-lm</code></td><td style="text-align:left">三角函数、对数、指数等</td></tr><tr><td style="text-align:left">pthread (多线程库)</td><td style="text-align:left"><code>-lpthread</code></td><td style="text-align:left">POSIX 线程</td></tr><tr><td style="text-align:left">dl (动态链接库加载)</td><td style="text-align:left"><code>-ldl</code></td><td style="text-align:left"><code>dlopen</code> / <code>dlsym</code> 等</td></tr><tr><td style="text-align:left">rt (实时库)</td><td style="text-align:left"><code>-lrt</code></td><td style="text-align:left">高精度定时器、实时功能</td></tr><tr><td style="text-align:left">zlib (压缩库)</td><td style="text-align:left"><code>-lz</code></td><td style="text-align:left">压缩与解压缩</td></tr><tr><td style="text-align:left">ssl/crypto</td><td style="text-align:left"><code>-lssl -lcrypto</code></td><td style="text-align:left">OpenSSL 安全加密库</td></tr><tr><td style="text-align:left">curl</td><td style="text-align:left"><code>-lcurl</code></td><td style="text-align:left">网络库，支持 HTTP/FTP 等</td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="常用的第三方库"><a href="#常用的第三方库" class="rp-header-anchor rp-link" aria-hidden="true">#</a>常用的第三方库</h2>













































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">库名称</th><th style="text-align:left">GCC 链接方式</th><th style="text-align:left">说明</th></tr></thead><tbody><tr><td style="text-align:left">OpenCV</td><td style="text-align:left"><code>-lopencv_core -lopencv_imgproc ...</code></td><td style="text-align:left">图像处理与计算机视觉</td></tr><tr><td style="text-align:left">FFmpeg</td><td style="text-align:left"><code>-lavcodec -lavformat -lavutil ...</code></td><td style="text-align:left">音视频编解码</td></tr><tr><td style="text-align:left">SQLite</td><td style="text-align:left"><code>-lsqlite3</code></td><td style="text-align:left">轻量级数据库</td></tr><tr><td style="text-align:left">Boost</td><td style="text-align:left"><code>-lboost_system -lboost_filesystem ...</code></td><td style="text-align:left">通用 C++ 库</td></tr><tr><td style="text-align:left">protobuf</td><td style="text-align:left"><code>-lprotobuf</code></td><td style="text-align:left">Google 协议缓冲区</td></tr><tr><td style="text-align:left">json-c</td><td style="text-align:left"><code>-ljson-c</code></td><td style="text-align:left">C 语言 JSON 解析库</td></tr><tr><td style="text-align:left">yaml-cpp</td><td style="text-align:left"><code>-lyaml-cpp</code></td><td style="text-align:left">C++ YAML 解析库</td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://github.com/hellogcc/100-gcc-tips" target="_blank" rel="noopener noreferrer" class="rp-link">100 个 gcc 小技巧</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[nodejs opensslErrorStack 错误]]></title>
        <id>/blog/2025/nodejs-error-03000086</id>
        <link href="https://www.vhcffh.com/blog/2025/nodejs-error-03000086"/>
        <updated>2025-06-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文解决了Node.js v17及以上版本中因OpenSSL 3.0兼容性问题导致的`error:0308010C:digital envelope routines::unsupported`错误。文章提供了三种解决方法：设置`NODE_OPTIONS=--openssl-legacy-provider`环境变量、修改`package.json`脚本或降级Node.js版本。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="nodejs-opensslerrorstack-错误"><a href="#nodejs-opensslerrorstack-错误" class="rp-header-anchor rp-link" aria-hidden="true">#</a>nodejs opensslErrorStack 错误<!-- --> </h1>
<p>报错信息如下</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">❯</span><span style="color:var(--shiki-token-string)"> npm</span><span style="color:var(--shiki-token-string)"> run</span><span style="color:var(--shiki-token-string)"> build</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> script-server@1.18.0 build</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> vue-cli-service build</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">Browserslist:</span><span style="color:var(--shiki-token-string)"> caniuse-lite</span><span style="color:var(--shiki-token-string)"> is</span><span style="color:var(--shiki-token-string)"> outdated.</span><span style="color:var(--shiki-token-string)"> Please</span><span style="color:var(--shiki-token-string)"> run:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  npx</span><span style="color:var(--shiki-token-string)"> update-browserslist-db@latest</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  Why</span><span style="color:var(--shiki-token-string)"> you</span><span style="color:var(--shiki-token-string)"> should</span><span style="color:var(--shiki-token-string)"> do</span><span style="color:var(--shiki-token-string)"> it</span><span style="color:var(--shiki-token-string)"> regularly:</span><span style="color:var(--shiki-token-string)"> https://github.com/browserslist/update-db#readme</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">⠹</span><span style="color:var(--shiki-token-string)">  Building</span><span style="color:var(--shiki-token-string)"> for</span><span style="color:var(--shiki-token-string)"> production...Error:</span><span style="color:var(--shiki-token-string)"> error:0308010C:digital</span><span style="color:var(--shiki-token-string)"> envelope</span><span style="color:var(--shiki-token-string)"> routines::unsupported</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> new</span><span style="color:var(--shiki-token-string)"> Hash</span><span style="color:var(--shiki-foreground)"> (node:internal/crypto/hash:69:19)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> Object.createHash</span><span style="color:var(--shiki-foreground)"> (node:crypto:133:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> module.exports</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/util/createHash.js:135:53)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> NormalModule._initBuildHash</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:417:16)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> handleParseError</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:471:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:503:5</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:358:12</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:373:3</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> iterateNormalLoaders</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:214:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> iterateNormalLoaders</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:221:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:236:3</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> runSyncOrAsync</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:130:11)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> iterateNormalLoaders</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:232:2)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> Array.</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-string)">anonymou</span><span style="color:var(--shiki-foreground)">s</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:205:4)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> Storage.finished</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:55:16)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/webpack/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:91:9</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">Error:</span><span style="color:var(--shiki-token-string)"> error:0308010C:digital</span><span style="color:var(--shiki-token-string)"> envelope</span><span style="color:var(--shiki-token-string)"> routines::unsupported</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> new</span><span style="color:var(--shiki-token-string)"> Hash</span><span style="color:var(--shiki-foreground)"> (node:internal/crypto/hash:69:19)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> Object.createHash</span><span style="color:var(--shiki-foreground)"> (node:crypto:133:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> module.exports</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/util/createHash.js:135:53)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> NormalModule._initBuildHash</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:417:16)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> handleParseError</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:471:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:503:5</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:358:12</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:373:3</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> iterateNormalLoaders</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:214:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> iterateNormalLoaders</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:221:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:236:3</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> runSyncOrAsync</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:130:11)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> iterateNormalLoaders</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:232:2)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> Array.</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-string)">anonymou</span><span style="color:var(--shiki-foreground)">s</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:205:4)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> Storage.finished</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:55:16)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/webpack/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:91:9</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">Error:</span><span style="color:var(--shiki-token-string)"> error:0308010C:digital</span><span style="color:var(--shiki-token-string)"> envelope</span><span style="color:var(--shiki-token-string)"> routines::unsupported</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> new</span><span style="color:var(--shiki-token-string)"> Hash</span><span style="color:var(--shiki-foreground)"> (node:internal/crypto/hash:69:19)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> Object.createHash</span><span style="color:var(--shiki-foreground)"> (node:crypto:133:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> module.exports</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/util/createHash.js:135:53)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> NormalModule._initBuildHash</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:417:16)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> handleParseError</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:471:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:503:5</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:358:12</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:373:3</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> iterateNormalLoaders</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:214:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> iterateNormalLoaders</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:221:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:236:3</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> runSyncOrAsync</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:130:11)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> iterateNormalLoaders</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:232:2)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> Array.</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-string)">anonymou</span><span style="color:var(--shiki-foreground)">s</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:205:4)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> Storage.finished</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:55:16)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/webpack/node_modules/enhanced-resolve/lib/CachedInputFileSystem.js:91:9</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">⠙</span><span style="color:var(--shiki-token-string)">  Building</span><span style="color:var(--shiki-token-string)"> for</span><span style="color:var(--shiki-token-string)"> production...Browserslist:</span><span style="color:var(--shiki-token-string)"> caniuse-lite</span><span style="color:var(--shiki-token-string)"> is</span><span style="color:var(--shiki-token-string)"> outdated.</span><span style="color:var(--shiki-token-string)"> Please</span><span style="color:var(--shiki-token-string)"> run:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  npx</span><span style="color:var(--shiki-token-string)"> update-browserslist-db@latest</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  Why</span><span style="color:var(--shiki-token-string)"> you</span><span style="color:var(--shiki-token-string)"> should</span><span style="color:var(--shiki-token-string)"> do</span><span style="color:var(--shiki-token-string)"> it</span><span style="color:var(--shiki-token-string)"> regularly:</span><span style="color:var(--shiki-token-string)"> https://github.com/browserslist/update-db#readme</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">Browserslist:</span><span style="color:var(--shiki-token-string)"> caniuse-lite</span><span style="color:var(--shiki-token-string)"> is</span><span style="color:var(--shiki-token-string)"> outdated.</span><span style="color:var(--shiki-token-string)"> Please</span><span style="color:var(--shiki-token-string)"> run:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  npx</span><span style="color:var(--shiki-token-string)"> update-browserslist-db@latest</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  Why</span><span style="color:var(--shiki-token-string)"> you</span><span style="color:var(--shiki-token-string)"> should</span><span style="color:var(--shiki-token-string)"> do</span><span style="color:var(--shiki-token-string)"> it</span><span style="color:var(--shiki-token-string)"> regularly:</span><span style="color:var(--shiki-token-string)"> https://github.com/browserslist/update-db#readme</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">Browserslist:</span><span style="color:var(--shiki-token-string)"> caniuse-lite</span><span style="color:var(--shiki-token-string)"> is</span><span style="color:var(--shiki-token-string)"> outdated.</span><span style="color:var(--shiki-token-string)"> Please</span><span style="color:var(--shiki-token-string)"> run:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  npx</span><span style="color:var(--shiki-token-string)"> update-browserslist-db@latest</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  Why</span><span style="color:var(--shiki-token-string)"> you</span><span style="color:var(--shiki-token-string)"> should</span><span style="color:var(--shiki-token-string)"> do</span><span style="color:var(--shiki-token-string)"> it</span><span style="color:var(--shiki-token-string)"> regularly:</span><span style="color:var(--shiki-token-string)"> https://github.com/browserslist/update-db#readme</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">⠦</span><span style="color:var(--shiki-token-string)">  Building</span><span style="color:var(--shiki-token-string)"> for</span><span style="color:var(--shiki-token-string)"> production.../home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:114</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                        throw</span><span style="color:var(--shiki-token-string)"> e</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                        ^</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">Error:</span><span style="color:var(--shiki-token-string)"> error:0308010C:digital</span><span style="color:var(--shiki-token-string)"> envelope</span><span style="color:var(--shiki-token-string)"> routines::unsupported</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> new</span><span style="color:var(--shiki-token-string)"> Hash</span><span style="color:var(--shiki-foreground)"> (node:internal/crypto/hash:69:19)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> Object.createHash</span><span style="color:var(--shiki-foreground)"> (node:crypto:133:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> module.exports</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/util/createHash.js:135:53)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> NormalModule._initBuildHash</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:417:16)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> handleParseError</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:471:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:503:5</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/webpack/lib/NormalModule.js:358:12</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:373:3</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> iterateNormalLoaders</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:214:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> iterateNormalLoaders</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:221:10)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:236:3</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> context.callback</span><span style="color:var(--shiki-foreground)"> (/home/frey/workspace/project/script-manager/web-src/node_modules/loader-runner/lib/LoaderRunner.js:111:13)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/cache-loader/dist/index.js:147:7</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> /home/frey/workspace/project/script-manager/web-src/node_modules/graceful-fs/graceful-fs.js:61:14</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    at</span><span style="color:var(--shiki-token-string)"> FSReqCallback.oncomplete</span><span style="color:var(--shiki-foreground)"> (node:fs:192:23) {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  opensslErrorStack:</span><span style="color:var(--shiki-foreground)"> [ </span><span style="color:var(--shiki-token-string-expression)">&#x27;error:03000086:digital envelope routines::initialization error&#x27;</span><span style="color:var(--shiki-token-string)"> ],</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  library:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;digital envelope routines&#x27;</span><span style="color:var(--shiki-token-string)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  reason:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;unsupported&#x27;</span><span style="color:var(--shiki-token-string)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  code:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;ERR_OSSL_EVP_UNSUPPORTED&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">Node.js</span><span style="color:var(--shiki-token-string)"> v18.20.5</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="主要原因"><a href="#主要原因" class="rp-header-anchor rp-link" aria-hidden="true">#</a>主要原因</h2>
<p>这通常是由于 Nodejs 版本与 OpenSSL 3.0 (默认禁用了某些加密功能) 不兼容导致的，这个错误通常出现在 Node.js 17 版本及更高版本中。</p>
<h2 class="rp-toc-include" id="解决方法一"><a href="#解决方法一" class="rp-header-anchor rp-link" aria-hidden="true">#</a>解决方法一</h2>
<p>设置环境变量，告诉 Node.js 使用 OpenSSL 3.0 的传统加密功能。</p>
<p><strong>在 Windows 上(CMD)</strong></p>
<div class="rp-codeblock language-cmd"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cmd"><code><span class="line"><span style="color:var(--shiki-token-keyword)">set </span><span style="color:var(--shiki-foreground)">NODE_OPTIONS</span><span style="color:var(--shiki-token-keyword)">=--</span><span style="color:var(--shiki-foreground)">openssl</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">legacy</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">provider</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">npm run build</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><strong>在 Windows 上(PowerShell)</strong></p>
<div class="rp-codeblock language-powershell"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="powershell"><code><span class="line"><span style="color:var(--shiki-foreground)">$</span><span style="color:var(--shiki-token-constant)">env:</span><span style="color:var(--shiki-foreground)">NODE_OPTIONS</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;--openssl-legacy-provider&quot;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">npm run build</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><strong>在 macOs 或 Linux 上</strong></p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-foreground)"> NODE_OPTIONS</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">--openssl-legacy-provider</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">npm</span><span style="color:var(--shiki-token-string)"> run</span><span style="color:var(--shiki-token-string)"> build</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="解决方法二"><a href="#解决方法二" class="rp-header-anchor rp-link" aria-hidden="true">#</a>解决方法二</h2>
<p>修改<code>package.json</code>, 运行命令前设置环境变量</p>
<div class="rp-codeblock language-json"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="json"><code><span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  &quot;scripts&quot;</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    &quot;serve&quot;</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-string-expression)"> &quot;NODE_OPTIONS=--openssl-legacy-provider vue-cli-service serve&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    &quot;build&quot;</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-string-expression)"> &quot;NODE_OPTIONS=--openssl-legacy-provider vue-cli-service build&quot;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="解决方法三"><a href="#解决方法三" class="rp-header-anchor rp-link" aria-hidden="true">#</a>解决方法三</h2>
<p>将 Nodejs 降级到 v16.x 版本</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[pyright 配置]]></title>
        <id>/blog/2025/pyright-config</id>
        <link href="https://www.vhcffh.com/blog/2025/pyright-config"/>
        <updated>2025-06-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了如何配置Pyright类型检查工具以识别非标准目录中的模块。通过在项目根目录创建`pyrightconfig.json`文件，并使用`extraPaths`选项添加额外的包搜索路径，可以解决模块导入时无法找到的问题。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="pyright-配置"><a href="#pyright-配置" class="rp-header-anchor rp-link" aria-hidden="true">#</a>pyright 配置<!-- --> </h1>
<ol>
<li>设置额外的包搜索路径</li>
</ol>
<p>在项目根目录创建文件<code>pyrightconfig.json</code></p>
<div class="rp-codeblock language-json"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="json"><code><span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  &quot;extraPaths&quot;</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-string-expression)">&quot;./src&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;./libs&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;../shared&quot;</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>&quot;extraPahts&quot; 告诉 pyright 去哪里找你的模块，不在默认路径的模块可以通过这里指定</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Hugging Face 模型简介]]></title>
        <id>/blog/2025/hugging-face-model</id>
        <link href="https://www.vhcffh.com/blog/2025/hugging-face-model"/>
        <updated>2025-05-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是一份Hugging Face模型格式加载与推理指南。内容按文件类型分类，详细说明了PyTorch(.bin)、Safetensors、TensorFlow(.h5)、ONNX、GGUF等多种模型格式的加载方式和推理方法，并为每种格式提供了具体的代码示例，帮助开发者快速上手使用不同框架的模型。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="hugging-face-模型简介"><a href="#hugging-face-模型简介" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Hugging Face 模型简介<!-- --> </h1>
<p>下面是 Hugging Face 上各种<strong>模型格式对应的加载方式和推理方法</strong>，本文按文件类型分类说明，并给出具体代码示例：</p>
<ul>
<li>PyTorch</li>
<li>Safetensors</li>
<li>TensorFlow / Keras</li>
<li>Flax / JAX</li>
<li>ONNX</li>
<li>TensorFlow.js</li>
<li>GGUF（llama.cpp）</li>
<li>分词器（Tokenizer）</li>
</ul>
<h2 class="rp-toc-include" id="-1-pytorch-bin-pt-pth"><a href="#-1-pytorch-bin-pt-pth" class="rp-header-anchor rp-link" aria-hidden="true">#</a>✅ 1. PyTorch (<code>.bin</code>, <code>.pt</code>, <code>.pth</code>)</h2>
<h3 class="rp-toc-include" id="使用-hugging-face-transformers"><a href="#使用-hugging-face-transformers" class="rp-header-anchor rp-link" aria-hidden="true">#</a>使用 Hugging Face Transformers：</h3>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> transformers </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> AutoModel</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> AutoTokenizer</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">tokenizer </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> AutoTokenizer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">from_pretrained</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;model_dir/&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> AutoModel</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">from_pretrained</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;model_dir/&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">inputs </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> tokenizer</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;Hello world&quot;</span><span style="color:var(--shiki-token-punctuation)">, return_tensors</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;pt&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">outputs </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> model</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">**</span><span style="color:var(--shiki-token-punctuation)">inputs)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<blockquote>
<p><code>model_dir/</code> 目录中需要包含：<code>pytorch_model.bin</code> + <code>config.json</code> + tokenizer 文件</p>
</blockquote>
<h2 class="rp-toc-include" id="-2-safetensors-safetensors"><a href="#-2-safetensors-safetensors" class="rp-header-anchor rp-link" aria-hidden="true">#</a>✅ 2. Safetensors (<code>.safetensors</code>)</h2>
<p>等价于 PyTorch 权重，但更安全。Transformers 会自动识别，无需特殊处理。</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> transformers </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> AutoModel</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">model </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> AutoModel</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">from_pretrained</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;model_dir/&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="纯-pytorch-加载"><a href="#纯-pytorch-加载" class="rp-header-anchor rp-link" aria-hidden="true">#</a>纯 PyTorch 加载：</h3>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> safetensors</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">torch </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> load_file</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">state_dict </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> load_file</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;model.safetensors&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> MyModel</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">load_state_dict</span><span style="color:var(--shiki-token-punctuation)">(state_dict)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="-3-tensorflow--keras-h5-pb-ckpt"><a href="#-3-tensorflow--keras-h5-pb-ckpt" class="rp-header-anchor rp-link" aria-hidden="true">#</a>✅ 3. TensorFlow / Keras (<code>.h5</code>, <code>.pb</code>, <code>.ckpt</code>)</h2>
<h3 class="rp-toc-include" id="keras-h5"><a href="#keras-h5" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Keras <code>.h5</code>：</h3>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> tensorflow</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">models </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> load_model</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">model </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> load_model</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;model.h5&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">result </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">predict</span><span style="color:var(--shiki-token-punctuation)">(input_data)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="savedmodel-saved_modelpb"><a href="#savedmodel-saved_modelpb" class="rp-header-anchor rp-link" aria-hidden="true">#</a>SavedModel (<code>saved_model.pb</code>)</h3>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> tensorflow </span><span style="color:var(--shiki-token-keyword)">as</span><span style="color:var(--shiki-foreground)"> tf</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">model </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> tf</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">saved_model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">load</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;saved_model_directory/&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">result </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> model</span><span style="color:var(--shiki-token-punctuation)">(input_tensor)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="-4-flax--jax-msgpack"><a href="#-4-flax--jax-msgpack" class="rp-header-anchor rp-link" aria-hidden="true">#</a>✅ 4. Flax / JAX (<code>.msgpack</code>)</h2>
<p>需要使用 <code>transformers</code> 的 Flax 模型接口：</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> transformers </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> FlaxAutoModel</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">model </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> FlaxAutoModel</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">from_pretrained</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;model_dir/&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="-5-onnx-onnx"><a href="#-5-onnx-onnx" class="rp-header-anchor rp-link" aria-hidden="true">#</a>✅ 5. ONNX (<code>.onnx</code>)</h2>
<p>使用 <code>onnxruntime</code> 推理：</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> onnxruntime</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> numpy </span><span style="color:var(--shiki-token-keyword)">as</span><span style="color:var(--shiki-foreground)"> np</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">session </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> onnxruntime</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">InferenceSession</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;model.onnx&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">inputs </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)"> {</span><span style="color:var(--shiki-token-string-expression)">&quot;input_ids&quot;</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">array</span><span style="color:var(--shiki-token-punctuation)">([[</span><span style="color:var(--shiki-token-constant)">101</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">102</span><span style="color:var(--shiki-token-punctuation)">]])}</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">outputs </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> session</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">run</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, inputs)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="-6-tensorflowjs-modeljson--bin"><a href="#-6-tensorflowjs-modeljson--bin" class="rp-header-anchor rp-link" aria-hidden="true">#</a>✅ 6. TensorFlow.js (<code>model.json</code> + <code>.bin</code>)</h2>
<p>在 <strong>浏览器中运行</strong>：</p>
<div class="rp-codeblock language-html"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="html"><code><span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-token-function)"> src</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;https://cdn.jsdelivr.net/npm/@tensorflow/tfjs&quot;</span><span style="color:var(--shiki-foreground)">&gt;&lt;/</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">  async</span><span style="color:var(--shiki-token-keyword)"> function</span><span style="color:var(--shiki-token-function)"> loadModel</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    const</span><span style="color:var(--shiki-token-constant)"> model</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-keyword)"> await</span><span style="color:var(--shiki-token-constant)"> tf</span><span style="color:var(--shiki-token-function)">.loadGraphModel</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;path/to/model.json&#x27;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    const</span><span style="color:var(--shiki-token-constant)"> input</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-constant)"> tf</span><span style="color:var(--shiki-token-function)">.tensor</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">...</span><span style="color:var(--shiki-foreground)">);  </span><span style="color:var(--shiki-token-comment)">// 根据模型输入 shape 构造</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    const</span><span style="color:var(--shiki-token-constant)"> output</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-constant)"> model</span><span style="color:var(--shiki-token-function)">.predict</span><span style="color:var(--shiki-foreground)">(input);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">  }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">&lt;/</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-foreground)">&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="-7-gguf-gguf"><a href="#-7-gguf-gguf" class="rp-header-anchor rp-link" aria-hidden="true">#</a>✅ 7. GGUF (<code>.gguf</code>)</h2>
<p>用于 <strong>llama.cpp</strong> 项目中的大语言模型：</p>
<h3 class="rp-toc-include" id="cli-推理"><a href="#cli-推理" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CLI 推理：</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">./main</span><span style="color:var(--shiki-token-string)"> -m</span><span style="color:var(--shiki-token-string)"> model.gguf</span><span style="color:var(--shiki-token-string)"> -p</span><span style="color:var(--shiki-token-string-expression)"> &quot;Hello, how are you?&quot;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>或使用 <a href="https://github.com/abetlen/llama-cpp-python" target="_blank" rel="noopener noreferrer" class="rp-link">llama-cpp-python</a>：</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> llama_cpp </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> Llama</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">llm </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Llama</span><span style="color:var(--shiki-token-punctuation)">(model_path</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;model.gguf&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">output </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> llm</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;Hello world&quot;</span><span style="color:var(--shiki-token-punctuation)">, max_tokens</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">50</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="-8-分词器tokenizer"><a href="#-8-分词器tokenizer" class="rp-header-anchor rp-link" aria-hidden="true">#</a>✅ 8. 分词器（Tokenizer）</h2>
<p>Hugging Face 的 <code>transformers</code> 和 <code>tokenizers</code> 均可自动加载：</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> transformers </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> AutoTokenizer</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">tokenizer </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> AutoTokenizer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">from_pretrained</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;model_dir/&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">inputs </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> tokenizer</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;文本&quot;</span><span style="color:var(--shiki-token-punctuation)">, return_tensors</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;pt&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>支持：</p>
<ul>
<li><code>tokenizer.json</code></li>
<li><code>vocab.txt</code></li>
<li><code>merges.txt</code></li>
<li><code>sentencepiece.model</code> 等</li>
</ul>
<h2 class="rp-toc-include" id="-小结"><a href="#-小结" class="rp-header-anchor rp-link" aria-hidden="true">#</a>🧠 小结</h2>









































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>文件类型</th><th>加载方法</th></tr></thead><tbody><tr><td><code>.bin</code></td><td><code>transformers.AutoModel.from_pretrained()</code></td></tr><tr><td><code>.safetensors</code></td><td>同上（自动识别），或用 <code>safetensors</code> 手动加载</td></tr><tr><td><code>.h5</code></td><td><code>tf.keras.models.load_model()</code></td></tr><tr><td><code>.pb</code></td><td><code>tf.saved_model.load()</code></td></tr><tr><td><code>.onnx</code></td><td><code>onnxruntime.InferenceSession()</code></td></tr><tr><td><code>model.json</code></td><td>浏览器中用 <code>tf.loadGraphModel()</code></td></tr><tr><td><code>.gguf</code></td><td>llama.cpp 或 llama-cpp-python</td></tr><tr><td>分词器相关文件</td><td><code>AutoTokenizer.from_pretrained()</code></td></tr></tbody></table></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Keras 基础]]></title>
        <id>/blog/2025/keras-base</id>
        <link href="https://www.vhcffh.com/blog/2025/keras-base"/>
        <updated>2025-05-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是Keras框架的基础入门教程。内容从安装开始，通过三个实例程序，分别演示了如何使用Keras构建、编译和训练线性回归、非线性回归以及MNIST手写数字分类模型。文章详细讲解了`Sequential`模型、`Dense`全连接层、激活函数和优化器的基本用法。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="keras-基础"><a href="#keras-基础" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Keras 基础<!-- --> </h1>
<div class="rp-callout rp-callout--tip"><div class="rp-callout__title">参考文档</div><div class="rp-callout__content"><p>
<a href="https://keras.io" target="_blank" rel="noopener noreferrer" class="rp-link">Keras 官网文档</a></p></div></div>
<h2 class="rp-toc-include" id="安装"><a href="#安装" class="rp-header-anchor rp-link" aria-hidden="true">#</a>安装</h2>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-comment)"># 安装 Tensorflow</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">pip</span><span style="color:var(--shiki-token-string)"> install</span><span style="color:var(--shiki-token-string)"> tensorflow</span><span style="color:var(--shiki-token-string)"> --user</span><span style="color:var(--shiki-token-string)"> -i</span><span style="color:var(--shiki-token-string)"> https://pypi.tuna.tsinghua.edu.cn/simple</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 安装 Keras</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">pip</span><span style="color:var(--shiki-token-string)"> install</span><span style="color:var(--shiki-token-string)"> keras</span><span style="color:var(--shiki-token-string)"> --user</span><span style="color:var(--shiki-token-string)"> -i</span><span style="color:var(--shiki-token-string)"> https://pypi.tuna.tsinghua.edu.cn/simple</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="线性回归"><a href="#线性回归" class="rp-header-anchor rp-link" aria-hidden="true">#</a>线性回归</h2>
<h3 class="rp-toc-include" id="示例程序"><a href="#示例程序" class="rp-header-anchor rp-link" aria-hidden="true">#</a>示例程序</h3>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> numpy </span><span style="color:var(--shiki-token-keyword)">as</span><span style="color:var(--shiki-foreground)"> np</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> matplotlib</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">pyplot </span><span style="color:var(--shiki-token-keyword)">as</span><span style="color:var(--shiki-foreground)"> plt</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">src</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">models </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> Sequential  </span><span style="color:var(--shiki-token-comment)"># Keras 中的顺序模型</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">src</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">layers </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> Dense  </span><span style="color:var(--shiki-token-comment)"># Keras 中的全连接层</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">src</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">layers </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> Input</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 构造训练样本</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">x_train </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">rand</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-comment)">  # 一维数据，样本量 100，服从均一分布</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">noise </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">normal</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">0.01</span><span style="color:var(--shiki-token-punctuation)">, x_train.shape)</span><span style="color:var(--shiki-token-comment)">  # 噪声数据，服从高斯分布（正态分布）</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">y_train </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> x_train </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 0.1</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-constant)"> 0.2</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> noise</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 编译模型</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Sequential</span><span style="color:var(--shiki-token-punctuation)">()</span><span style="color:var(--shiki-token-comment)">  # 顺序模型</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Input</span><span style="color:var(--shiki-token-punctuation)">(shape</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,)))</span><span style="color:var(--shiki-token-comment)">  # 输入数据 1 维</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Dense</span><span style="color:var(--shiki-token-punctuation)">(units</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">))</span><span style="color:var(--shiki-token-comment)">  # 全连接层，输出数据 1 维，</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">compile</span><span style="color:var(--shiki-token-punctuation)">(optimizer</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;sgd&quot;</span><span style="color:var(--shiki-token-punctuation)">, loss</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;mse&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-comment)">  # 优化算法：随机梯度下降，损失函数：均方差</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 训练样本</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> step </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">5000</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    cost </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">train_on_batch</span><span style="color:var(--shiki-token-punctuation)">(x_train, y_train)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> step </span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-token-constant)"> 500</span><span style="color:var(--shiki-token-keyword)"> ==</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;cost: &quot;</span><span style="color:var(--shiki-token-punctuation)">, cost)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 查看训练得到的权重和偏置</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">w</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">layers</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">].</span><span style="color:var(--shiki-token-function)">get_weights</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;W= &quot;</span><span style="color:var(--shiki-token-punctuation)">, w, </span><span style="color:var(--shiki-token-string-expression)">&quot;b= &quot;</span><span style="color:var(--shiki-token-punctuation)">, b)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 展示拟合结果</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">y_pred </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">predict</span><span style="color:var(--shiki-token-punctuation)">(x_train)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">plt</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">scatter</span><span style="color:var(--shiki-token-punctuation)">(x_train, y_train)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">plt</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">plot</span><span style="color:var(--shiki-token-punctuation)">(x_train, y_pred, </span><span style="color:var(--shiki-token-string-expression)">&quot;r-&quot;</span><span style="color:var(--shiki-token-punctuation)">, lw</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">plt</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">show</span><span style="color:var(--shiki-token-punctuation)">()</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="结果展示"><a href="#结果展示" class="rp-header-anchor rp-link" aria-hidden="true">#</a>结果展示</h3>
<p><img alt="linear-regression" src="/static/image/keras-1.fe1afbcc01.png"/></p>
<h2 class="rp-toc-include" id="非线性回归"><a href="#非线性回归" class="rp-header-anchor rp-link" aria-hidden="true">#</a>非线性回归</h2>
<h3 class="rp-toc-include" id="示例程序-1"><a href="#示例程序-1" class="rp-header-anchor rp-link" aria-hidden="true">#</a>示例程序</h3>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> numpy </span><span style="color:var(--shiki-token-keyword)">as</span><span style="color:var(--shiki-foreground)"> np</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> matplotlib</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">pyplot </span><span style="color:var(--shiki-token-keyword)">as</span><span style="color:var(--shiki-foreground)"> plt</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">src</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">models </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> Sequential  </span><span style="color:var(--shiki-token-comment)"># Keras 中的顺序模型</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">src</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">layers </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> Input</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> Dense</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> Activation  </span><span style="color:var(--shiki-token-comment)"># Keras 中的全连接层和激活函数</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">src</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">optimizers </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> SGD  </span><span style="color:var(--shiki-token-comment)"># Keras 中的 SGD 优化器</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 构造训练样本</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">x_train </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">linspace</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)">0.5</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">0.5</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">200</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-comment)">  # 一维数据，样本量 200，等差线性分布</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">noise </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">normal</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">0.02</span><span style="color:var(--shiki-token-punctuation)">, x_train.shape)</span><span style="color:var(--shiki-token-comment)">  # 噪声数据，服从高斯分布（正态分布）</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">y_train </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">square</span><span style="color:var(--shiki-token-punctuation)">(x_train)</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> noise</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 编译模型</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Sequential</span><span style="color:var(--shiki-token-punctuation)">()</span><span style="color:var(--shiki-token-comment)">  # 顺序模型</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Input</span><span style="color:var(--shiki-token-punctuation)">(shape</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,)))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Dense</span><span style="color:var(--shiki-token-punctuation)">(units</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">))</span><span style="color:var(--shiki-token-comment)">  # 全连接层，输出数据 10 维， 输入数据 1 维</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Activation</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;tanh&quot;</span><span style="color:var(--shiki-token-punctuation)">))</span><span style="color:var(--shiki-token-comment)">  # tanh 激活函数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Dense</span><span style="color:var(--shiki-token-punctuation)">(units</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">))</span><span style="color:var(--shiki-token-comment)">  # 全连接层，输出数据 1 维， 输入数据 10 维</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Activation</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;tanh&quot;</span><span style="color:var(--shiki-token-punctuation)">))</span><span style="color:var(--shiki-token-comment)">  # tanh 激活函数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">sgd </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> SGD</span><span style="color:var(--shiki-token-punctuation)">(learning_rate</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0.2</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-comment)">  # 设置随机梯度下降算法的学习率</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">compile</span><span style="color:var(--shiki-token-punctuation)">(optimizer</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">sgd, loss</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;mse&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-comment)">  # 优化算法：随机梯度下降，损失函数：均方差</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 训练样本</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> step </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">5000</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    cost </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">train_on_batch</span><span style="color:var(--shiki-token-punctuation)">(x_train, y_train)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> step </span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-token-constant)"> 500</span><span style="color:var(--shiki-token-keyword)"> ==</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;cost: &quot;</span><span style="color:var(--shiki-token-punctuation)">, cost)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 展示拟合结果</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">y_pred </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">predict</span><span style="color:var(--shiki-token-punctuation)">(x_train)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">plt</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">scatter</span><span style="color:var(--shiki-token-punctuation)">(x_train, y_train)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">plt</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">plot</span><span style="color:var(--shiki-token-punctuation)">(x_train, y_pred, </span><span style="color:var(--shiki-token-string-expression)">&quot;r-&quot;</span><span style="color:var(--shiki-token-punctuation)">, lw</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">plt</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">show</span><span style="color:var(--shiki-token-punctuation)">()</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="结果展示-1"><a href="#结果展示-1" class="rp-header-anchor rp-link" aria-hidden="true">#</a>结果展示</h3>
<p><img alt="Non-linear-regression" src="/static/image/keras-2.b71fd99691.png"/></p>
<h2 class="rp-toc-include" id="mnist-数据分类"><a href="#mnist-数据分类" class="rp-header-anchor rp-link" aria-hidden="true">#</a>MNIST 数据分类</h2>
<h3 class="rp-toc-include" id="示例程序-2"><a href="#示例程序-2" class="rp-header-anchor rp-link" aria-hidden="true">#</a>示例程序</h3>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">src</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">datasets </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> mnist</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> tensorflow</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">python</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">utils </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> np_utils</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">src</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">models </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> Sequential</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">src</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">layers </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> Input</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> Dense</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> Dropout</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">from</span><span style="color:var(--shiki-foreground)"> keras</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">src</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">optimizers </span><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> SGD</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 载入数据集（第一次运行会联网下载）</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">(x_train</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> y_train)</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> (x_test</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> y_test) </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> mnist</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">load_data</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;x_train: &quot;</span><span style="color:var(--shiki-token-punctuation)">, x_train.shape, </span><span style="color:var(--shiki-token-string-expression)">&quot;y_train: &quot;</span><span style="color:var(--shiki-token-punctuation)">, y_train.shape)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;x_test:  &quot;</span><span style="color:var(--shiki-token-punctuation)">, x_test.shape, </span><span style="color:var(--shiki-token-string-expression)">&quot;y_test:  &quot;</span><span style="color:var(--shiki-token-punctuation)">, y_test.shape)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">x_train </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> x_train</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">reshape</span><span style="color:var(--shiki-token-punctuation)">(x_train.shape[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">], </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-keyword)"> /</span><span style="color:var(--shiki-token-constant)"> 255.0</span><span style="color:var(--shiki-token-comment)">  # 归一化</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">x_test </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> x_test</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">reshape</span><span style="color:var(--shiki-token-punctuation)">(x_test.shape[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">], </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-keyword)"> /</span><span style="color:var(--shiki-token-constant)"> 255.0</span><span style="color:var(--shiki-token-comment)"> # 标签值转为 one-hot 码</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">y_train </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np_utils</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">to_categorical</span><span style="color:var(--shiki-token-punctuation)">(y_train, num_classes</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">y_test </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np_utils</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">to_categorical</span><span style="color:var(--shiki-token-punctuation)">(y_test, num_classes</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 编译模型</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Sequential</span><span style="color:var(--shiki-token-punctuation)">()</span><span style="color:var(--shiki-token-comment)">  # 顺序模型</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Input</span><span style="color:var(--shiki-token-punctuation)">(shape</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">(x_train.shape[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">],)))</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 全连接层(隐藏层），输出数据 200 维，输入数据维度由训练数据本身决定, 使用 tanh 激活函数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Dense</span><span style="color:var(--shiki-token-punctuation)">(units</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">196</span><span style="color:var(--shiki-token-punctuation)">, input_dim</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">x_train.shape[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">], activation</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;relu&quot;</span><span style="color:var(--shiki-token-punctuation)">))</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 全连接层（隐藏层），输出数据 100 维，输入数据由前一层决定, 使用 tanh 激活函数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Dense</span><span style="color:var(--shiki-token-punctuation)">(units</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">98</span><span style="color:var(--shiki-token-punctuation)">, activation</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;relu&quot;</span><span style="color:var(--shiki-token-punctuation)">))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Dropout</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">0.4</span><span style="color:var(--shiki-token-punctuation)">))</span><span style="color:var(--shiki-token-comment)">  # 让 20% 的神经元不工作（防止过拟合的一种手段）</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 全连接层（输出层），输出数据 10 维（共 10 种手写数字），输入数据由前一层决定, 使用 softmax 激活函数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Dense</span><span style="color:var(--shiki-token-punctuation)">(units</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">, activation</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;softmax&quot;</span><span style="color:var(--shiki-token-punctuation)">))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">sgd </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> SGD</span><span style="color:var(--shiki-token-punctuation)">(learning_rate</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0.1</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-comment)">  # 设置随机梯度下降算法的学习率</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">compile</span><span style="color:var(--shiki-token-punctuation)">(</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    optimizer</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">sgd,</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    loss</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;categorical_crossentropy&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    metrics</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-string-expression)">&quot;accuracy&quot;</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-comment)">  # 优化算法：随机梯度下降，损失函数：交叉熵</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 训练样本</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">fit</span><span style="color:var(--shiki-token-punctuation)">(x_train, y_train, batch_size</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-punctuation)">, epochs</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 评估模型</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">loss</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> accuracy </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">evaluate</span><span style="color:var(--shiki-token-punctuation)">(x_test, y_test)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;loss= &quot;</span><span style="color:var(--shiki-token-punctuation)">, loss, </span><span style="color:var(--shiki-token-string-expression)">&quot;accuracy= &quot;</span><span style="color:var(--shiki-token-punctuation)">, accuracy)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[CAN 基础]]></title>
        <id>/blog/2025/can-base</id>
        <link href="https://www.vhcffh.com/blog/2025/can-base"/>
        <updated>2025-05-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文全面介绍了CAN总线的基础知识。内容涵盖了其拓扑结构、信号表示、多主通信和非破坏性位仲裁等特点。文章详细解析了数据帧、遥控帧、错误帧等帧结构，并讲解了节点的错误处理机制。最后还介绍了Linux下的SocketCAN及其命令行工具和python-can库的使用。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="can-基础"><a href="#can-基础" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CAN 基础<!-- --> </h1>
<h2 class="rp-toc-include" id="拓扑结构"><a href="#拓扑结构" class="rp-header-anchor rp-link" aria-hidden="true">#</a>拓扑结构</h2>
<p><img alt="CAN 拓扑结构" src="/static/image/can-topology.bcd7e9227a.png"/></p>
<p>CAN 总线有两个 ISO 国际标准：ISO11898 和 ISO11519。</p>
<ul>
<li>ISO11898 定义了通信速率为 125 Kbps ～ 1 Mbps 的高速 CAN 通信标准，属于闭环总线，总线长度 ≤ 40 米。</li>
<li>ISO11519 定义了通信速率为 10 ～ 125 Kbps 的低速 CAN 通信标准，属于开环总线，总线长度可达 1000 米。</li>
<li>ISO16845 定义了认证需要的测试用例</li>
<li>在同一条总线上，所有节点的通信速度必须相同；如果两条不同通信速度的总线上的节点想要实现信息交互，必须通过网关或者中继器转发信息。</li>
</ul>
<h2 class="rp-toc-include" id="信号表示"><a href="#信号表示" class="rp-header-anchor rp-link" aria-hidden="true">#</a>信号表示</h2>
<p><img alt="CAN 信号表示" src="/static/image/can-signal.438ddad3b8.png"/></p>
<h2 class="rp-toc-include" id="通信特点"><a href="#通信特点" class="rp-header-anchor rp-link" aria-hidden="true">#</a>通信特点</h2>
<h3 class="rp-toc-include" id="多主多从结构"><a href="#多主多从结构" class="rp-header-anchor rp-link" aria-hidden="true">#</a>多主多从结构</h3>
<ul>
<li>CAN 总线上的所有节点没有主从之分，在总线空闲状态，任意节点都可以向总线上发送消息</li>
<li>当总线上出现连续的 11 位隐形电平，那么总线就处于空闲状态</li>
<li>最先向总线发送消息的节点获得总线的发送权，当多个节点同时向总线发送消息时，所发送消息的优先级高的那个节点获得总线的发送权</li>
<li>依赖于<strong>硬件</strong>的验收滤波技术，CAN 总线可以实现一对一，一对多以及广播的数据传输方式。</li>
</ul>
<h3 class="rp-toc-include" id="非破坏性位仲裁机制"><a href="#非破坏性位仲裁机制" class="rp-header-anchor rp-link" aria-hidden="true">#</a>非破坏性位仲裁机制</h3>
<p>当多个节点同时向总线发送消息时，对各个消息的标识符（即 ID 号）进行逐位仲裁，如果某个节点发送的消息仲裁获胜，那么这个节点将获取总线的发送权，仲裁失败的节点则立即停止发送并转变为监听（接收）状态。</p>
<p>这种仲裁机制既不会造成已发送数据的延迟，也不会破坏已经发送的数据。</p>
<h3 class="rp-toc-include" id="报文过滤"><a href="#报文过滤" class="rp-header-anchor rp-link" aria-hidden="true">#</a>报文过滤</h3>
<p>CAN 总线中没有地址的概念，CAN 总线是通过报文 ID 来实现收发数据的。每个节点上都会有一个验收滤波 ID 表，其位于 CAN 节点的验收滤波器中，如果总线上的报文的 ID 号在某个节点的验收滤波 ID 表中，那么这一帧报文就能通过该节点验收滤波器的验收，该节点就会接收这一帧报文。</p>
<h3 class="rp-toc-include" id="远程数据请求"><a href="#远程数据请求" class="rp-header-anchor rp-link" aria-hidden="true">#</a>远程数据请求</h3>
<p>某个节点 Node_A 可以通过发送<code>遥控帧</code>到总线上的方式，请求某个节点 Node_B 来发送由该遥控帧所指定的报文。</p>
<h3 class="rp-toc-include" id="出错处理"><a href="#出错处理" class="rp-header-anchor rp-link" aria-hidden="true">#</a>出错处理</h3>
<ul>
<li>所有的节点都可以检测出错误</li>
<li>检测出错误的节点会立即通知总线上其它所有的节点</li>
<li>正在发送消息的节点，如果检测到错误，会立即停止当前的发送，同时不断地重复发送此消息，直到该消息发送成功为止</li>
</ul>
<h3 class="rp-toc-include" id="故障封闭"><a href="#故障封闭" class="rp-header-anchor rp-link" aria-hidden="true">#</a>故障封闭</h3>
<p>节点能够判断错误的类型，判断是暂时性的数据错误（如噪声干扰）还是持续性的数据错误（如节点内部故障），如果判断是严重的持续性错误，那么节点就会切断自己与总线的联系，从而避免影响总线上其他节点的正常工作。</p>
<h3 class="rp-toc-include" id="位填充"><a href="#位填充" class="rp-header-anchor rp-link" aria-hidden="true">#</a>位填充</h3>
<p><img alt="CAN 位填充原则" src="/static/image/can-bit-fill.40f11dcf44.png"/></p>
<p>CAN 协议中规定，当相同极性的电平持续五位时，则添加一个极性相反的位。</p>
<h2 class="rp-toc-include" id="网络分层架构"><a href="#网络分层架构" class="rp-header-anchor rp-link" aria-hidden="true">#</a>网络分层架构</h2>
<p><img alt="CAN 网络层次结构" src="/static/image/can-net-stack.bfcf754e8b.jpeg"/></p>
<h2 class="rp-toc-include" id="帧结构"><a href="#帧结构" class="rp-header-anchor rp-link" aria-hidden="true">#</a>帧结构</h2>
<h3 class="rp-toc-include" id="数据帧和遥控帧"><a href="#数据帧和遥控帧" class="rp-header-anchor rp-link" aria-hidden="true">#</a>数据帧和遥控帧</h3>
<p><img alt="CAN 数据帧" src="/static/image/can-data-frame.7ba14b1e4d.png"/></p>
<p><img alt="CAN 遥控帧" src="/static/image/can-remote-frame.8094c83147.png"/></p>
<ul>
<li>RTR(Remote Transmission Request) 位保证了数据帧的优先级高于遥控帧</li>
<li>SRR(Substitutes Remote Requests) 位保证了标准数据帧的优先级高于扩展数据帧</li>
<li>IDE(Identifier Extension) 位保证了标准遥控帧的优先级高于扩展遥控帧</li>
<li>DLC(Data Length Code) 位指示了数据段中的字节数，对于遥控帧而言，DLC 表示该遥控帧对应的数据帧的数据段的字节数</li>
<li>数据段从 MSB 开始输出</li>
<li>CRC 校验序列(15bit)的计算范围包括：SOF,仲裁段，控制段和数据段</li>
<li>ACK 包括 ACK 槽和 ACK 分界符：
<ul>
<li>发送节点发出的报文中 ACK 槽为<code>隐性1</code></li>
<li>接收节点在接收到正确的报文之后会在 ACK 槽发送<code>显性0</code>，通知发送节点正常接收结束</li>
</ul>
</li>
<li>EOF(End Of Frame) 表示该帧报文的结束，由 7 个隐性位构成</li>
</ul>
<h3 class="rp-toc-include" id="错误帧"><a href="#错误帧" class="rp-header-anchor rp-link" aria-hidden="true">#</a>错误帧</h3>
<p>在 CAN 总线通信中，一共有五种错误，分别是：位错误、ACK 错误、填充错误、CRC 错误、格式错误。</p>
<p><img alt="CAN 错误帧" src="/static/image/can-error-frame.8ac102488b.png"/></p>
<ul>
<li>主动错误标志：6 个连续的显性位 0</li>
<li>被动错误标志：6 个连续的隐性位 1</li>
<li>错误分界符：8 个连续的隐性位 1</li>
</ul>
<h3 class="rp-toc-include" id="过载帧"><a href="#过载帧" class="rp-header-anchor rp-link" aria-hidden="true">#</a>过载帧</h3>
<p><img alt="CAN 过载帧" src="/static/image/can-overload-frame.2a81fa8142.png"/></p>
<ul>
<li>接受单元会发从此帧来通知总线自己还没有做好接收准备</li>
</ul>
<h3 class="rp-toc-include" id="帧间隔"><a href="#帧间隔" class="rp-header-anchor rp-link" aria-hidden="true">#</a>帧间隔</h3>
<p><img alt="CAN 帧间隔" src="/static/image/can-inter-frame.a156e6973b.png"/></p>
<ul>
<li>数据帧和遥控帧可通过插入帧间隔将本帧与前面的任何帧（数据帧、遥控帧、错误帧、过载帧）分开，过载帧和错误帧前不能插入帧间隔</li>
</ul>
<h2 class="rp-toc-include" id="错误通知"><a href="#错误通知" class="rp-header-anchor rp-link" aria-hidden="true">#</a>错误通知</h2>
<h3 class="rp-toc-include" id="节点错误状态"><a href="#节点错误状态" class="rp-header-anchor rp-link" aria-hidden="true">#</a>节点错误状态</h3>
<p>按照 CAN 协议的规定，CAN 总线上的节点始终处于以下三种状态之一：</p>
<ul>
<li>
<p>主动错误状态</p>
<ul>
<li>可以正常通信</li>
<li>在检测出错误时，发出主动错误标志</li>
</ul>
</li>
<li>
<p>被动错误状态</p>
<ul>
<li>可以正常通信</li>
<li>在检测出错误时，发出被动错误标志</li>
</ul>
</li>
<li>
<p>总线关闭状态</p>
<ul>
<li>节点不能收发报文</li>
<li>在满足一定条件的时候，再次进入到主动错误状态</li>
</ul>
</li>
</ul>
<h3 class="rp-toc-include" id="错误状态的转换"><a href="#错误状态的转换" class="rp-header-anchor rp-link" aria-hidden="true">#</a>错误状态的转换</h3>
<p>在 CAN 节点内，有两个计数器：发送错误计数器（TEC）和接收错误计数器（REC）。TEC 和 REC 计数值的变化，是根据下表的规定来进行的</p>
<p><img alt="TEC/REC" src="/static/image/can-tec-rec.7c413acefb.png"/></p>
<p>CAN 节点错误状态的转换，就是基于这两个计数器来进行的</p>
<p><img alt="错误状态转换" src="/static/image/can-error-state.4563c01f9a.png"/></p>
<h3 class="rp-toc-include" id="错误帧的发送"><a href="#错误帧的发送" class="rp-header-anchor rp-link" aria-hidden="true">#</a>错误帧的发送</h3>
<p><img alt="错误帧的发送" src="/static/image/can-error-recovery.538d320161.png"/></p>
<ol>
<li>发送节点 Node_A 发送一个显性位，但是却从总线上听到一个隐形位，于是 Node_A 节点就会检测到一个位错误</li>
<li>Node_A 检测到位错误之后，立即在下一位开始发送主动错误帧：6 个连续显性位的主动错误标志+8 个连续隐性位的错误界定符</li>
<li>对应 Node_A 发出的主动错误标志，总线上电平为 6 个连续显性位</li>
<li>接收节点 Node_B 和 Node_C 从总线上听到连续 6 个显性位，那么就会检测到一个<strong>填充错误</strong>，于是这两个节点都会发送主动错误帧</li>
<li>对应 Node_B 和 Node_C 发出的主动错误标志，总线电平又有 6 个连续显性电平，对应 Node_B 和 Node_C 发出的错误界定符，总线电平有 8 个连续的隐性电平</li>
<li>在间歇域之后，Node_A 节点重新发送刚刚出错的报文</li>
</ol>
<h2 class="rp-toc-include" id="socket-can"><a href="#socket-can" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Socket CAN</h2>
<h3 class="rp-toc-include" id="命令行工具"><a href="#命令行工具" class="rp-header-anchor rp-link" aria-hidden="true">#</a>命令行工具</h3>
<h4 class="rp-toc-include" id="ip-命令"><a href="#ip-命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>ip 命令</h4>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">ip</span><span style="color:var(--shiki-token-string)"> link</span><span style="color:var(--shiki-token-string)"> set</span><span style="color:var(--shiki-token-string)"> can0</span><span style="color:var(--shiki-token-string)"> type</span><span style="color:var(--shiki-token-string)"> can</span><span style="color:var(--shiki-token-string)"> help</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h5 class="rp-toc-include" id="设置-can-设备的波特率"><a href="#设置-can-设备的波特率" class="rp-header-anchor rp-link" aria-hidden="true">#</a>设置 CAN 设备的波特率</h5>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">ip</span><span style="color:var(--shiki-token-string)"> link</span><span style="color:var(--shiki-token-string)"> set</span><span style="color:var(--shiki-token-string)"> can0</span><span style="color:var(--shiki-token-string)"> type</span><span style="color:var(--shiki-token-string)"> can</span><span style="color:var(--shiki-token-string)"> bitrate</span><span style="color:var(--shiki-token-constant)"> 500000</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">ip</span><span style="color:var(--shiki-token-string)"> link</span><span style="color:var(--shiki-token-string)"> set</span><span style="color:var(--shiki-token-string)"> can0</span><span style="color:var(--shiki-token-string)"> type</span><span style="color:var(--shiki-token-string)"> can</span><span style="color:var(--shiki-token-string)"> bitrate</span><span style="color:var(--shiki-token-constant)"> 500000</span><span style="color:var(--shiki-token-string)"> dbitrate</span><span style="color:var(--shiki-token-constant)"> 2000000</span><span style="color:var(--shiki-token-string)"> fd</span><span style="color:var(--shiki-token-string)"> on</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">ip</span><span style="color:var(--shiki-token-string)"> link</span><span style="color:var(--shiki-token-string)"> set</span><span style="color:var(--shiki-token-string)"> can0</span><span style="color:var(--shiki-token-string)"> type</span><span style="color:var(--shiki-token-string)"> can</span><span style="color:var(--shiki-token-string)"> bitrate</span><span style="color:var(--shiki-token-constant)"> 500000</span><span style="color:var(--shiki-token-string)"> sample-point</span><span style="color:var(--shiki-token-constant)"> 0.875</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h5 class="rp-toc-include" id="启动关闭-can-设备"><a href="#启动关闭-can-设备" class="rp-header-anchor rp-link" aria-hidden="true">#</a>启动/关闭 CAN 设备</h5>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">ip</span><span style="color:var(--shiki-token-string)"> link</span><span style="color:var(--shiki-token-string)"> set</span><span style="color:var(--shiki-token-string)"> can0</span><span style="color:var(--shiki-token-string)"> up</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">ip</span><span style="color:var(--shiki-token-string)"> link</span><span style="color:var(--shiki-token-string)"> set</span><span style="color:var(--shiki-token-string)"> can0</span><span style="color:var(--shiki-token-string)"> down</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h5 class="rp-toc-include" id="设置-can-设备的模式"><a href="#设置-can-设备的模式" class="rp-header-anchor rp-link" aria-hidden="true">#</a>设置 CAN 设备的模式</h5>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">ip</span><span style="color:var(--shiki-token-string)"> link</span><span style="color:var(--shiki-token-string)"> set</span><span style="color:var(--shiki-token-string)"> can0</span><span style="color:var(--shiki-token-string)"> type</span><span style="color:var(--shiki-token-string)"> can</span><span style="color:var(--shiki-token-string)"> loopback</span><span style="color:var(--shiki-token-string)"> on</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">ip</span><span style="color:var(--shiki-token-string)"> link</span><span style="color:var(--shiki-token-string)"> set</span><span style="color:var(--shiki-token-string)"> can0</span><span style="color:var(--shiki-token-string)"> type</span><span style="color:var(--shiki-token-string)"> can</span><span style="color:var(--shiki-token-string)"> listen-only</span><span style="color:var(--shiki-token-string)"> on</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h5 class="rp-toc-include" id="查看详细的配置信息"><a href="#查看详细的配置信息" class="rp-header-anchor rp-link" aria-hidden="true">#</a>查看详细的配置信息</h5>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">ip</span><span style="color:var(--shiki-token-string)"> -details</span><span style="color:var(--shiki-token-string)"> link</span><span style="color:var(--shiki-token-string)"> show</span><span style="color:var(--shiki-token-string)"> can0</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h4 class="rp-toc-include" id="can-utils-程序"><a href="#can-utils-程序" class="rp-header-anchor rp-link" aria-hidden="true">#</a>can-utils 程序</h4>
<h5 class="rp-toc-include" id="candump"><a href="#candump" class="rp-header-anchor rp-link" aria-hidden="true">#</a>candump</h5>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">candump</span><span style="color:var(--shiki-token-string)"> can0,0x123:0x7FF</span><span style="color:var(--shiki-token-comment)"> # 仅显示can0上收到的ID为0x123的消息</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h5 class="rp-toc-include" id="cansend"><a href="#cansend" class="rp-header-anchor rp-link" aria-hidden="true">#</a>cansend</h5>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">cansend</span><span style="color:var(--shiki-token-string)"> can0</span><span style="color:var(--shiki-token-string)"> 123#1122334455667788</span><span style="color:var(--shiki-token-comment)"> # 发送一个ID为0x123的报文</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h5 class="rp-toc-include" id="cangen"><a href="#cangen" class="rp-header-anchor rp-link" aria-hidden="true">#</a>cangen</h5>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">cangen</span><span style="color:var(--shiki-token-string)"> can0</span><span style="color:var(--shiki-token-string)"> -g</span><span style="color:var(--shiki-token-constant)"> 0x123</span><span style="color:var(--shiki-token-string)"> -I</span><span style="color:var(--shiki-token-constant)"> 1000</span><span style="color:var(--shiki-token-string)"> -L</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-string)"> -D</span><span style="color:var(--shiki-token-constant)"> 0x1122334455667788</span><span style="color:var(--shiki-token-comment)"> # 每1000ms发送一个ID为0x123的报文</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h5 class="rp-toc-include" id="cansniffer"><a href="#cansniffer" class="rp-header-anchor rp-link" aria-hidden="true">#</a>cansniffer</h5>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">cansniffer</span><span style="color:var(--shiki-token-string)"> can0</span><span style="color:var(--shiki-token-comment)"> # 抓取can0上的所有报文，可以过滤掉数据不变的帧</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="python-can"><a href="#python-can" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python-can</h2>
<h3 class="rp-toc-include" id="安装"><a href="#安装" class="rp-header-anchor rp-link" aria-hidden="true">#</a>安装</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">pip</span><span style="color:var(--shiki-token-string)"> install</span><span style="color:var(--shiki-token-string)"> python-can</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="使用"><a href="#使用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>使用</h3>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-comment)"># import the library</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> can</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># create a bus instance</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># many other interfaces are supported as well (see documentation)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">bus </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> can</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Bus</span><span style="color:var(--shiki-token-punctuation)">(interface</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;socketcan&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">              channel</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;vcan0&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">              receive_own_messages</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">True</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># send a message</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">message </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> can</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Message</span><span style="color:var(--shiki-token-punctuation)">(arbitration_id</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">123</span><span style="color:var(--shiki-token-punctuation)">, is_extended_id</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">True</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">                      data</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">11</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">22</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">33</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">bus</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">send</span><span style="color:var(--shiki-token-punctuation)">(message, timeout</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0.2</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># iterate over received messages</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> msg </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-foreground)"> bus</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">f</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">{</span><span style="color:var(--shiki-token-punctuation)">msg.arbitration_id</span><span style="color:var(--shiki-token-keyword)">:X</span><span style="color:var(--shiki-token-constant)">}</span><span style="color:var(--shiki-token-string-expression)">: </span><span style="color:var(--shiki-token-constant)">{</span><span style="color:var(--shiki-token-punctuation)">msg.data</span><span style="color:var(--shiki-token-constant)">}</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># or use an asynchronous notifier</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">notifier </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> can</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Notifier</span><span style="color:var(--shiki-token-punctuation)">(bus, [can.</span><span style="color:var(--shiki-token-function)">Logger</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;recorded.log&quot;</span><span style="color:var(--shiki-token-punctuation)">), can.</span><span style="color:var(--shiki-token-function)">Printer</span><span style="color:var(--shiki-token-punctuation)">()])</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[大模型参数和内存解析]]></title>
        <id>/blog/2025/foundation-model</id>
        <link href="https://www.vhcffh.com/blog/2025/foundation-model"/>
        <updated>2025-04-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文解析了大模型参数规模与内存占用的关系。内容解释了参数单位（B/M）的含义，并详细说明了float32、float16、int8等不同数据类型下每个参数的内存大小。文章以7B模型为例进行计算，并列举了GPT-3、LLaMA-2和DeepSeek等主流模型的参数规模及常用数据类型。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="大模型参数和内存解析"><a href="#大模型参数和内存解析" class="rp-header-anchor rp-link" aria-hidden="true">#</a>大模型参数和内存解析<!-- --> </h1>
<p>在讨论大模型时，我们通常会见到类似 “175B” 或 “125M” 的描述。</p>
<ul>
<li><strong>B</strong> 表示 <strong>billion</strong>（十亿）</li>
<li><strong>M</strong> 表示 <strong>million</strong>（百万）</li>
</ul>
<h2 class="rp-toc-include" id="每个参数的内存占用"><a href="#每个参数的内存占用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>每个参数的内存占用</h2>
<p>模型中参数的数据类型直接影响每个参数的内存大小，常见的数据类型包括：</p>






























<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>数据类型</th><th>每个参数占用内存</th><th>说明</th></tr></thead><tbody><tr><td>float32</td><td>4 字节</td><td>全精度训练常用，但占用内存较大</td></tr><tr><td>float16/bfloat16</td><td>2 字节</td><td>半精度训练/推理，兼顾速度与精度</td></tr><tr><td>int8</td><td>1 字节</td><td>量化推理，内存和计算资源大大降低</td></tr><tr><td>int4</td><td>0.5 字节</td><td>边缘设备或极限量化场景，进一步降低内存开销</td></tr></tbody></table></div>
<p>举例：
对于一个 7B 模型来说：</p>
<ul>
<li><strong>float32</strong>：约 28 GB</li>
<li><strong>float16</strong>：约 14 GB</li>
<li><strong>int8</strong>：约 7 GB</li>
<li><strong>int4</strong>：约 3.5 GB</li>
</ul>
<h2 class="rp-toc-include" id="模型案例"><a href="#模型案例" class="rp-header-anchor rp-link" aria-hidden="true">#</a>模型案例</h2>
<h3 class="rp-toc-include" id="gpt-3"><a href="#gpt-3" class="rp-header-anchor rp-link" aria-hidden="true">#</a>GPT-3</h3>
<ul>
<li>参数规模从 125M 到 175B 不等</li>
<li>原始训练时可能使用 float32，但推理常用 float16 或经过 int8 量化</li>
<li>例如：GPT-3 175B 模型在推理时常采用 float16 来降低内存需求</li>
</ul>
<h3 class="rp-toc-include" id="llama-2"><a href="#llama-2" class="rp-header-anchor rp-link" aria-hidden="true">#</a>LLaMA-2</h3>
<ul>
<li>提供 7B、13B 和 70B 等多个版本</li>
<li>原始训练一般采用 float16 或 bfloat16</li>
<li>推理阶段支持 float16，同时有 int8 或 int4 的量化版本</li>
</ul>
<h3 class="rp-toc-include" id="deepseek-系列"><a href="#deepseek-系列" class="rp-header-anchor rp-link" aria-hidden="true">#</a>DeepSeek 系列</h3>
<ul>
<li>包括 DeepSeek-LLM 和 DeepSeek-Coder 等</li>
<li>DeepSeek-LLM 常见有 7B 与 67B 版本，原始精度使用 float16/bfloat16，推理时可选 int8/int4</li>
<li>DeepSeek-Coder 针对代码任务，提供 1.3B、6.7B、33B 不同版本，均支持灵活的数据类型选择</li>
</ul><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[qemu 运行 busybox]]></title>
        <id>/blog/2025/linux-busybox-run</id>
        <link href="https://www.vhcffh.com/blog/2025/linux-busybox-run"/>
        <updated>2025-03-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了如何编译BusyBox并将其作为根文件系统，通过QEMU运行自定义编译的Linux内核。内容涵盖了下载BusyBox源码、配置静态编译、解决编译错误、打包生成initramfs.cpio.gz文件，以及最终使用QEMU加载内核和根文件系统的完整命令和步骤。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="qemu-运行-busybox"><a href="#qemu-运行-busybox" class="rp-header-anchor rp-link" aria-hidden="true">#</a>qemu 运行 busybox<!-- --> </h1>
<p>在<a href="/blog/2025/git-linux-build" class="rp-link">上篇文章</a>中，通过编译linux内核，编写简单的C程序，实现基于内核运行程序。本篇文章实现在linux内核上运行busybox。</p>
<h2 class="rp-toc-include" id="下载-busybox"><a href="#下载-busybox" class="rp-header-anchor rp-link" aria-hidden="true">#</a>下载 busybox</h2>
<p>在<a href="https://git.busybox.net/busybox/" target="_blank" rel="noopener noreferrer" class="rp-link">busybox官网</a>可以获取到最新的busybox源码，通过git下载。
本文编译v1.37.0。</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">git</span><span style="color:var(--shiki-token-string)"> clone</span><span style="color:var(--shiki-token-string)"> git://git.busybox.net/busybox</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="配置构建"><a href="#配置构建" class="rp-header-anchor rp-link" aria-hidden="true">#</a>配置构建</h2>
<p>生成默认配置</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">make</span><span style="color:var(--shiki-token-string)"> defconfig</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>通过 <code>menuconfig</code> 配置static编译</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">Busybox</span><span style="color:var(--shiki-token-string)"> Settings</span><span style="color:var(--shiki-token-string)">  ---</span><span style="color:var(--shiki-token-keyword)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    Build</span><span style="color:var(--shiki-token-string)"> Options</span><span style="color:var(--shiki-token-string)">  ---</span><span style="color:var(--shiki-token-keyword)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        [</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-function)">Build</span><span style="color:var(--shiki-token-string)"> BusyBox</span><span style="color:var(--shiki-token-string)"> as</span><span style="color:var(--shiki-token-string)"> a</span><span style="color:var(--shiki-token-string)"> static</span><span style="color:var(--shiki-token-string)"> binary</span><span style="color:var(--shiki-foreground)"> (no </span><span style="color:var(--shiki-token-string)">shared</span><span style="color:var(--shiki-token-string)"> libs</span><span style="color:var(--shiki-foreground)">) (</span><span style="color:var(--shiki-token-function)">NEW</span><span style="color:var(--shiki-foreground)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">make</span><span style="color:var(--shiki-token-string)"> menuconfig</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">❯</span><span style="color:var(--shiki-token-string)"> make</span><span style="color:var(--shiki-token-string)"> menuconfig</span></span>
<span class="line"><span style="color:var(--shiki-token-function)"> ***</span><span style="color:var(--shiki-token-string)"> Unable</span><span style="color:var(--shiki-token-string)"> to</span><span style="color:var(--shiki-token-string)"> find</span><span style="color:var(--shiki-token-string)"> the</span><span style="color:var(--shiki-token-string)"> ncurses</span><span style="color:var(--shiki-token-string)"> libraries</span><span style="color:var(--shiki-token-string)"> or</span><span style="color:var(--shiki-token-string)"> the</span></span>
<span class="line"><span style="color:var(--shiki-token-function)"> ***</span><span style="color:var(--shiki-token-string)"> required</span><span style="color:var(--shiki-token-string)"> header</span><span style="color:var(--shiki-token-string)"> files.</span></span>
<span class="line"><span style="color:var(--shiki-token-function)"> ***</span><span style="color:var(--shiki-token-string-expression)"> &#x27;make menuconfig&#x27;</span><span style="color:var(--shiki-token-string)"> requires</span><span style="color:var(--shiki-token-string)"> the</span><span style="color:var(--shiki-token-string)"> ncurses</span><span style="color:var(--shiki-token-string)"> libraries.</span></span>
<span class="line"><span style="color:var(--shiki-token-function)"> ***</span></span>
<span class="line"><span style="color:var(--shiki-token-function)"> ***</span><span style="color:var(--shiki-token-string)"> Install</span><span style="color:var(--shiki-token-string)"> ncurses</span><span style="color:var(--shiki-foreground)"> (ncurses-devel) and try again.</span></span>
<span class="line"><span style="color:var(--shiki-token-function)"> ***</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">make[2]:</span><span style="color:var(--shiki-token-string)"> ***</span><span style="color:var(--shiki-foreground)"> [/home/frey/workspace/git/os/busybox/scripts/kconfig/lxdialog/Makefile:15: </span><span style="color:var(--shiki-token-string)">scripts/kconfig/lxdialog/dochecklxdialog]</span><span style="color:var(--shiki-token-string)"> Error</span><span style="color:var(--shiki-token-constant)"> 1</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">make[1]:</span><span style="color:var(--shiki-token-string)"> ***</span><span style="color:var(--shiki-foreground)"> [/home/frey/workspace/git/os/busybox/scripts/kconfig/Makefile:14: </span><span style="color:var(--shiki-token-string)">menuconfig]</span><span style="color:var(--shiki-token-string)"> Error</span><span style="color:var(--shiki-token-constant)"> 2</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">make:</span><span style="color:var(--shiki-token-string)"> ***</span><span style="color:var(--shiki-foreground)"> [Makefile:444: </span><span style="color:var(--shiki-token-string)">menuconfig]</span><span style="color:var(--shiki-token-string)"> Error</span><span style="color:var(--shiki-token-constant)"> 2</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>在wsl2运行archlinux编译时，遇到下面检测<code>ncurses-devel</code>出现的错误，但是已经安装了<code>ncurses</code>，通过gcc可以编译包含<code>&lt;ncurses.h&gt;</code>头文件的程序。</p>
<p>在文件<code>check-lxdialog.sh</code>中直接返回0,表示成功即可进行配置。</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">---</span><span style="color:var(--shiki-token-string)"> a/scripts/kconfig/lxdialog/check-lxdialog.sh</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">+++</span><span style="color:var(--shiki-token-string)"> b/scripts/kconfig/lxdialog/check-lxdialog.sh</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">@@</span><span style="color:var(--shiki-token-string)"> -44,11</span><span style="color:var(--shiki-token-string)"> +44,13</span><span style="color:var(--shiki-token-string)"> @@</span><span style="color:var(--shiki-token-string)"> tmp=.lxdialog.tmp</span></span>
<span class="line"><span style="color:var(--shiki-token-function)"> trap</span><span style="color:var(--shiki-token-string-expression)"> &quot;rm -f $tmp&quot;</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-constant)"> 15</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"> # Check if we can link to ncurses</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">+#</span><span style="color:var(--shiki-token-string)"> 直接返回0成功</span></span>
<span class="line"><span style="color:var(--shiki-token-function)"> check</span><span style="color:var(--shiki-token-punctuation)">()</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">         $cc </span><span style="color:var(--shiki-token-string)">-x</span><span style="color:var(--shiki-token-string)"> c</span><span style="color:var(--shiki-token-string)"> -</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-foreground)"> $tmp </span><span style="color:var(--shiki-token-keyword)">2&gt;</span><span style="color:var(--shiki-token-string)">/dev/null</span><span style="color:var(--shiki-token-keyword)"> &lt;&lt;</span><span style="color:var(--shiki-foreground)">&#x27;EOF&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)"> #include CURSES_LOC</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)"> main() {}</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)"> EOF</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">+exit 0</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>编译</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">make</span><span style="color:var(--shiki-token-string)"> -j6</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>遇到一些报错</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">networking/tc.c:</span><span style="color:var(--shiki-token-string)"> In</span><span style="color:var(--shiki-token-string)"> function</span><span style="color:var(--shiki-token-string-expression)"> &#x27;cbq_print_opt&#x27;</span><span style="color:var(--shiki-token-string)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">networking/tc.c:236:27:</span><span style="color:var(--shiki-token-string)"> error:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;TCA_CBQ_MAX&#x27;</span><span style="color:var(--shiki-token-string)"> undeclared</span><span style="color:var(--shiki-foreground)"> (first </span><span style="color:var(--shiki-token-string)">use</span><span style="color:var(--shiki-token-string)"> in</span><span style="color:var(--shiki-token-string)"> this</span><span style="color:var(--shiki-token-string)"> function</span><span style="color:var(--shiki-foreground)">); </span><span style="color:var(--shiki-token-function)">did</span><span style="color:var(--shiki-token-string)"> you</span><span style="color:var(--shiki-token-string)"> mean</span><span style="color:var(--shiki-token-string-expression)"> &#x27;TCA_CBS_MAX&#x27;</span><span style="color:var(--shiki-token-string)">?</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  236</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)">         struct</span><span style="color:var(--shiki-token-string)"> rtattr</span><span style="color:var(--shiki-token-string)"> *tb[TCA_CBQ_MAX+1]</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">      |</span><span style="color:var(--shiki-token-function)">                           ^~~~~~~~~~~</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">      |</span><span style="color:var(--shiki-token-function)">                           TCA_CBS_MAX</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">networking/tc.c:236:27:</span><span style="color:var(--shiki-token-string)"> note:</span><span style="color:var(--shiki-token-string)"> each</span><span style="color:var(--shiki-token-string)"> undeclared</span><span style="color:var(--shiki-token-string)"> identifier</span><span style="color:var(--shiki-token-string)"> is</span><span style="color:var(--shiki-token-string)"> reported</span><span style="color:var(--shiki-token-string)"> only</span><span style="color:var(--shiki-token-string)"> once</span><span style="color:var(--shiki-token-string)"> for</span><span style="color:var(--shiki-token-string)"> each</span><span style="color:var(--shiki-token-string)"> function</span><span style="color:var(--shiki-token-string)"> it</span><span style="color:var(--shiki-token-string)"> appears</span><span style="color:var(--shiki-token-string)"> in</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">networking/tc.c:249:16:</span><span style="color:var(--shiki-token-string)"> error:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;TCA_CBQ_RATE&#x27;</span><span style="color:var(--shiki-token-string)"> undeclared</span><span style="color:var(--shiki-foreground)"> (first </span><span style="color:var(--shiki-token-string)">use</span><span style="color:var(--shiki-token-string)"> in</span><span style="color:var(--shiki-token-string)"> this</span><span style="color:var(--shiki-token-string)"> function</span><span style="color:var(--shiki-foreground)">); </span><span style="color:var(--shiki-token-function)">did</span><span style="color:var(--shiki-token-string)"> you</span><span style="color:var(--shiki-token-string)"> mean</span><span style="color:var(--shiki-token-string-expression)"> &#x27;TCA_TBF_RATE64&#x27;</span><span style="color:var(--shiki-token-string)">?</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">  249</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-keyword)">         if</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">tb[TCA_CBQ_RATE]</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">      |</span><span style="color:var(--shiki-token-function)">                ^~~~~~~~~~~~</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">      |</span><span style="color:var(--shiki-token-function)">                TCA_TBF_RATE64</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>内核不再支持CBQ(Class-Based Queuing，一种流量控制和调度算法)，编辑<code>.config</code>文件，禁用<code>CONFIG_TC</code>可消除错误。
<a href="https://www.reddit.com/r/linuxquestions/comments/1cizfpo/id_like_some_help_with_this_youtube_guide/" target="_blank" rel="noopener noreferrer" class="rp-link">参考</a></p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">libbb/hash_md5_sha.c:1316:35:</span><span style="color:var(--shiki-token-string)"> error:</span><span style="color:var(--shiki-token-string-expression)"> &#x27;sha1_process_block64_shaNI&#x27;</span><span style="color:var(--shiki-token-string)"> undeclared</span><span style="color:var(--shiki-foreground)"> (first </span><span style="color:var(--shiki-token-string)">use</span><span style="color:var(--shiki-token-string)"> in</span><span style="color:var(--shiki-token-string)"> this</span><span style="color:var(--shiki-token-string)"> function</span><span style="color:var(--shiki-foreground)">); </span><span style="color:var(--shiki-token-function)">did</span><span style="color:var(--shiki-token-string)"> you</span><span style="color:var(--shiki-token-string)"> mean</span><span style="color:var(--shiki-token-string-expression)"> &#x27;sha1_process_block64&#x27;</span><span style="color:var(--shiki-token-string)">?</span></span>
<span class="line"><span style="color:var(--shiki-token-function)"> 1316</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-keyword)">          ||</span><span style="color:var(--shiki-token-function)"> ctx-</span><span style="color:var(--shiki-foreground)">&gt;</span><span style="color:var(--shiki-token-string)">process_block</span><span style="color:var(--shiki-token-string)"> ==</span><span style="color:var(--shiki-token-string)"> sha1_process_block64_shaNI</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">      |</span><span style="color:var(--shiki-token-function)">                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">      |</span><span style="color:var(--shiki-token-function)">                                   sha1_process_block64</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>busybox的bug，arm架构没有<code>sha1_process_block64_shaNI</code>。<a href="https://lists.busybox.net/pipermail/busybox/2024-September/090944.html" target="_blank" rel="noopener noreferrer" class="rp-link">参考</a></p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">diff</span><span style="color:var(--shiki-token-string)"> --git</span><span style="color:var(--shiki-token-string)"> a/libbb/hash_md5_sha.c</span><span style="color:var(--shiki-token-string)"> b/libbb/hash_md5_sha.c</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">index</span><span style="color:var(--shiki-token-string)"> 57a801459..75a61c32c</span><span style="color:var(--shiki-token-constant)"> 100644</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">---</span><span style="color:var(--shiki-token-string)"> a/libbb/hash_md5_sha.c</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">+++</span><span style="color:var(--shiki-token-string)"> b/libbb/hash_md5_sha.c</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">@@</span><span style="color:var(--shiki-token-string)"> -1313,7</span><span style="color:var(--shiki-token-string)"> +1313,9</span><span style="color:var(--shiki-token-string)"> @@</span><span style="color:var(--shiki-token-string)"> unsigned</span><span style="color:var(--shiki-token-string)"> FAST_FUNC</span><span style="color:var(--shiki-token-string)"> sha1_end</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">sha1_ctx_t</span><span style="color:var(--shiki-token-string)"> *ctx,</span><span style="color:var(--shiki-token-string)"> void</span><span style="color:var(--shiki-token-string)"> *resbuf</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        hash_size</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">ctx-</span><span style="color:var(--shiki-foreground)">&gt;</span><span style="color:var(--shiki-token-string)">process_block</span><span style="color:var(--shiki-token-string)"> ==</span><span style="color:var(--shiki-token-string)"> sha1_process_block64</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"> #if ENABLE_SHA1_HWACCEL</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">+#</span><span style="color:var(--shiki-token-string)"> if</span><span style="color:var(--shiki-token-string)"> defined</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">__GNUC__</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-punctuation)">&amp;&amp;</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">defined(__i386__</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">||</span><span style="color:var(--shiki-token-function)"> defined(__x86_64__</span><span style="color:var(--shiki-foreground)">))</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         ||</span><span style="color:var(--shiki-token-function)"> ctx-</span><span style="color:var(--shiki-foreground)">&gt;</span><span style="color:var(--shiki-token-string)">process_block</span><span style="color:var(--shiki-token-string)"> ==</span><span style="color:var(--shiki-token-string)"> sha1_process_block64_shaNI</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">+#</span><span style="color:var(--shiki-token-string)"> endif</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"> #endif</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        ) {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                hash_size</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>编译成功后，执行install，在<code>_install</code>目录生成boxbusy文件</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">make</span><span style="color:var(--shiki-token-string)"> ARCH=arm64</span><span style="color:var(--shiki-token-string)"> CROSS_COMPILE=aarch64-linux-gnu-</span><span style="color:var(--shiki-token-string)"> -j6</span><span style="color:var(--shiki-token-string)"> install</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="打包根文件系统"><a href="#打包根文件系统" class="rp-header-anchor rp-link" aria-hidden="true">#</a>打包根文件系统</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>cd _install</span></span>
<span class="line"><span>ln -s bin/busybox init</span></span>
<span class="line"><span>find . | cpio -o -H newc | gzip &gt; initramfs.cpio.gz</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="运行"><a href="#运行" class="rp-header-anchor rp-link" aria-hidden="true">#</a>运行</h2>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">qemu-system-aarch64</span><span style="color:var(--shiki-token-string)"> -machine</span><span style="color:var(--shiki-token-string)"> virt</span><span style="color:var(--shiki-token-string)"> -cpu</span><span style="color:var(--shiki-token-string)"> cortex-a53</span><span style="color:var(--shiki-token-string)"> -nographic</span><span style="color:var(--shiki-token-string)"> -smp</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-string)"> -m</span><span style="color:var(--shiki-token-constant)"> 2048</span><span style="color:var(--shiki-token-string)"> -kernel</span><span style="color:var(--shiki-token-string)"> arch/arm64/boot/Image</span><span style="color:var(--shiki-token-string)"> -append</span><span style="color:var(--shiki-token-string-expression)"> &quot;root=/dev/ram0 rootfstype=ramfs rw init=/init&quot;</span><span style="color:var(--shiki-token-string)">  -initrd</span><span style="color:var(--shiki-token-string)"> ../busybox/_install/initramfs.cpio.gz</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>[    1.117193] 9pnet: Installing 9P2000 support</span></span>
<span class="line"><span>[    1.117799] Key type dns_resolver registered</span></span>
<span class="line"><span>[    1.139603] registered taskstats version 1</span></span>
<span class="line"><span>[    1.141234] Loading compiled-in X.509 certificates</span></span>
<span class="line"><span>[    1.157385] Demotion targets for Node 0: null</span></span>
<span class="line"><span>[    1.168037] input: gpio-keys as /devices/platform/gpio-keys/input/input0</span></span>
<span class="line"><span>[    1.177580] clk: Disabling unused clocks</span></span>
<span class="line"><span>[    1.178038] PM: genpd: Disabling unused power domains</span></span>
<span class="line"><span>[    1.178810] ALSA device list:</span></span>
<span class="line"><span>[    1.179113]   No soundcards found.</span></span>
<span class="line"><span>[    1.222812] Freeing unused kernel memory: 3072K</span></span>
<span class="line"><span>[    1.223923] Run /init as init process</span></span>
<span class="line"><span>can&#x27;t run &#x27;/etc/init.d/rcS&#x27;: No such file or directory</span></span>
<span class="line"><span>can&#x27;t open /dev/tty2: No such file or directory</span></span>
<span class="line"><span></span></span>
<span class="line"><span>can&#x27;t open /dev/tty3: No such file or directory</span></span>
<span class="line"><span>can&#x27;t open /dev/tty4: No such file or directory</span></span>
<span class="line"><span>can&#x27;t open /dev/tty2: No such file or directory</span></span>
<span class="line"><span>ls</span></span>
<span class="line"><span>can&#x27;t open /dev/tty3: No such file or directory</span></span>
<span class="line"><span>can&#x27;t open /dev/tty4: No such file or directory</span></span>
<span class="line"><span>ls</span></span>
<span class="line"><span>bin                init               linuxrc            sbin</span></span>
<span class="line"><span>dev                initramfs.cpio.gz  root               usr</span></span>
<span class="line"><span>can&#x27;t open /dev/tty2: No such file or directory</span></span>
<span class="line"><span></span></span>
<span class="line"><span>~ # ls</span></span>
<span class="line"><span>bin                init               linuxrc            sbin</span></span>
<span class="line"><span>dev                initramfs.cpio.gz  root               usr</span></span>
<span class="line"><span>can&#x27;t open /dev/tty3: No such file or directory</span></span>
<span class="line"><span>can&#x27;t open /dev/tty4: No such file or directory</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>对于<code>can&#x27;t open /dev/tty4: No such file or directory</code>打包前创建tty终端即可</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">mknod</span><span style="color:var(--shiki-token-string)"> dev/tty2</span><span style="color:var(--shiki-token-string)"> c</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-constant)"> 2</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">mknod</span><span style="color:var(--shiki-token-string)"> dev/tty3</span><span style="color:var(--shiki-token-string)"> c</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-constant)"> 2</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">mknod</span><span style="color:var(--shiki-token-string)"> dev/tty4</span><span style="color:var(--shiki-token-string)"> c</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-constant)"> 2</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">find</span><span style="color:var(--shiki-token-string)"> .</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> cpio</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> -H</span><span style="color:var(--shiki-token-string)"> newc</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> gzip</span><span style="color:var(--shiki-token-keyword)"> &gt;</span><span style="color:var(--shiki-token-string)"> initramfs.cpio.gz</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Git下载构建Linux]]></title>
        <id>/blog/2025/git-linux-build</id>
        <link href="https://www.vhcffh.com/blog/2025/git-linux-build"/>
        <updated>2025-03-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了从Git下载、配置、编译并运行最新Linux内核的全过程。内容涵盖了使用`git clone`获取源码，通过`make menuconfig`进行配置，以及交叉编译arm64内核的步骤。文章还解决了内核启动时因缺少根文件系统而导致的"Kernel panic"问题，并演示了如何制作并挂载一个简单的initramfs。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="git下载构建linux"><a href="#git下载构建linux" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Git下载构建Linux<!-- --> </h1>
<p>在本文中，我将介绍如何使用 Git 从官方仓库下载最新版 Linux 内核源码，然后进行配置、编译构建并安装。无论你是开发者、系统管理员还是 Linux 爱好者，这篇文章都能为你提供详细的步骤。</p>
<h2 class="rp-toc-include" id="源代码下载"><a href="#源代码下载" class="rp-header-anchor rp-link" aria-hidden="true">#</a>源代码下载</h2>
<p>Linux 内核源码托管在 <a href="https://www.kernel.org/" target="_blank" rel="noopener noreferrer" class="rp-link">kernel.org</a> 的 Git 仓库中。
Linux 的最新版本是 mainline 。
进入<a href="https://www.kernel.org/" target="_blank" rel="noopener noreferrer" class="rp-link">官网</a>，点击 mainline 行的browse。
点击summary，获取最新 linux 版本的 Git 地址。</p>
<p>打开终端，执行以下命令开始克隆内核源码（仓库体积较大，可能需要较长时间）：</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">git</span><span style="color:var(--shiki-token-string)"> clone</span><span style="color:var(--shiki-token-string)"> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<blockquote>
<p><strong>提示</strong>：克隆完成后，所有历史提交记录都会下载到本地。如果只想获取最新的代码，可以使用 <code>--depth</code> 参数来进行浅克隆</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">git</span><span style="color:var(--shiki-token-string)"> clone</span><span style="color:var(--shiki-token-string)"> --depth=1</span><span style="color:var(--shiki-token-string)"> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</blockquote>
<p>进入下载好的源码目录：</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">cd</span><span style="color:var(--shiki-token-string)"> linux</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="配置内核源码"><a href="#配置内核源码" class="rp-header-anchor rp-link" aria-hidden="true">#</a>配置内核源码</h2>
<p>在开始编译之前，需要对内核进行配置。可以选择图形界面配置或基于已有配置文件的方式进行设置。</p>
<h3 class="rp-toc-include" id="图形界面配置"><a href="#图形界面配置" class="rp-header-anchor rp-link" aria-hidden="true">#</a>图形界面配置</h3>
<p>确保安装了必要的依赖（<code>libncurses5-dev</code> 或 <code>libncurses-dev</code>），然后运行：</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">make</span><span style="color:var(--shiki-token-string)"> menuconfig</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="使用现有配置文件"><a href="#使用现有配置文件" class="rp-header-anchor rp-link" aria-hidden="true">#</a>使用现有配置文件</h3>
<p>你可以复制当前系统正在使用的内核配置文件，然后更新配置：</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">cp</span><span style="color:var(--shiki-token-string)"> /boot/config-</span><span style="color:var(--shiki-foreground)">$(</span><span style="color:var(--shiki-token-function)">uname</span><span style="color:var(--shiki-token-string)"> -r</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-string)">.config</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">make</span><span style="color:var(--shiki-token-string)"> oldconfig</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>在配置过程中，根据需要启用或禁用内核选项。大多数用户保留默认配置即可。</p>
<h3 class="rp-toc-include" id="生成arm64配置"><a href="#生成arm64配置" class="rp-header-anchor rp-link" aria-hidden="true">#</a>生成arm64配置</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">make</span><span style="color:var(--shiki-token-string)"> ARCH=arm64</span><span style="color:var(--shiki-token-string)"> CROSS_COMPILE=aarch64-linux-gnu-</span><span style="color:var(--shiki-token-string)"> defconfig</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="编译与构建内核"><a href="#编译与构建内核" class="rp-header-anchor rp-link" aria-hidden="true">#</a>编译与构建内核</h2>
<p>配置完成后，就可以编译内核。编译过程需要一些时间，这取决于你的硬件性能和选择的配置选项。</p>
<p>使用以下命令启动编译，<code>-j$(nproc)</code> 参数会自动利用所有 CPU 核心，加速编译过程：</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">make</span><span style="color:var(--shiki-token-string)"> ARCH=arm64</span><span style="color:var(--shiki-token-string)"> CROSS_COMPILE=aarch64-linux-gnu-</span><span style="color:var(--shiki-token-string)"> -j6</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>编译结束后，你会在源码目录下看到编译生成的各类目标文件和模块。</p>
<h2 class="rp-toc-include" id="运行内核"><a href="#运行内核" class="rp-header-anchor rp-link" aria-hidden="true">#</a>运行内核</h2>
<p>使用命令运行编译后的内核</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">qemu-system-aarch64</span><span style="color:var(--shiki-token-string)"> -machine</span><span style="color:var(--shiki-token-string)"> virt</span><span style="color:var(--shiki-token-string)"> -cpu</span><span style="color:var(--shiki-token-string)"> cortex-a53</span><span style="color:var(--shiki-token-string)">  -nographic</span><span style="color:var(--shiki-token-string)"> -smp</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-string)"> -m</span><span style="color:var(--shiki-token-constant)"> 2048</span><span style="color:var(--shiki-token-string)"> -kernel</span><span style="color:var(--shiki-token-string)"> arch/arm64/boot/Image</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>可以看到启动成功，但是没有挂载上文件系统，就<code>kernel panic</code></p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">❯</span><span style="color:var(--shiki-token-string)"> qemu-system-aarch64</span><span style="color:var(--shiki-token-string)"> -machine</span><span style="color:var(--shiki-token-string)"> virt</span><span style="color:var(--shiki-token-string)"> -cpu</span><span style="color:var(--shiki-token-string)"> cortex-a53</span><span style="color:var(--shiki-token-string)">  -nographic</span><span style="color:var(--shiki-token-string)"> -smp</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-string)"> -m</span><span style="color:var(--shiki-token-constant)"> 2048</span><span style="color:var(--shiki-token-string)"> -kernel</span><span style="color:var(--shiki-token-string)"> arch/arm64/boot/Image</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Booting Linux on physical CPU 0x0000000000 [0x410fd034]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Linux version 6.14.0-rc5-00013-g99fa936e8e4f (</span><span style="color:var(--shiki-token-function)">frey@wsl</span><span style="color:var(--shiki-foreground)">) (</span><span style="color:var(--shiki-token-function)">aarch64-linux-gnu-gcc</span><span style="color:var(--shiki-foreground)"> (GCC) 14.2.0, GNU ld (</span><span style="color:var(--shiki-token-function)">GNU</span><span style="color:var(--shiki-token-string)"> Binutils</span><span style="color:var(--shiki-foreground)">) 2.43) </span><span style="color:var(--shiki-token-comment)">#2 SMP PREEMPT Mon Mar 10 22:25:13 CST 2025</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] KASLR enabled</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] random: crng init </span><span style="color:var(--shiki-token-keyword)">done</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Machine model: linux,dummy-virt</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] efi: UEFI not found.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] OF: reserved mem: Reserved memory: No reserved-memory node in the DT</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] NUMA: Faking a node at [mem 0x0000000040000000-0x00000000bfffffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] NODE_DATA(</span><span style="color:var(--shiki-token-function)">0</span><span style="color:var(--shiki-foreground)">) allocated [mem 0xbfbfb980-0xbfbfdfbf]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Zone ranges:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000]   DMA      [mem 0x0000000040000000-0x00000000bfffffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000]   DMA32    empty</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000]   Normal   empty</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Movable zone start </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> each node</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Early memory node ranges</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000]   node   0: [mem 0x0000000040000000-0x00000000bfffffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Initmem setup node 0 [mem 0x0000000040000000-0x00000000bfffffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] cma: Reserved 32 MiB at 0x00000000bba00000 on node -1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] psci: probing </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> conduit method from DT.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] psci: PSCIv1.1 detected in firmware.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] psci: Using standard PSCI v0.2 </span><span style="color:var(--shiki-token-keyword)">function</span><span style="color:var(--shiki-token-function)"> IDs</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] psci: Trusted OS migration not required</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] psci: SMC Calling Convention v1.0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] percpu: Embedded 25 pages/cpu s61592 r8192 d32616 u102400</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Detected VIPT I-cache on CPU0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] CPU features: kernel page table isolation forced ON by KASLR</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] CPU features: detected: Kernel page table isolation (</span><span style="color:var(--shiki-token-function)">KPTI</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] CPU features: detected: ARM erratum 845719</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] alternatives: applying boot alternatives</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Kernel command line:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] printk: log buffer data + meta data: 131072 + 458752 = 589824 bytes</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Dentry cache hash table entries: 262144 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 9,</span><span style="color:var(--shiki-token-constant)"> 2097152</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Inode-cache hash table entries: 131072 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 8,</span><span style="color:var(--shiki-token-constant)"> 1048576</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Fallback order </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> Node 0: </span><span style="color:var(--shiki-token-constant)">0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Built 1 zonelists, mobility grouping on.  Total pages: 524288</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Policy zone: DMA</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] mem auto-init: stack:all(</span><span style="color:var(--shiki-token-function)">zero</span><span style="color:var(--shiki-foreground)">), heap alloc:off, heap free:off</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] software IO TLB: SWIOTLB bounce buffer size adjusted to 2MB</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] software IO TLB: area num 1.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] software IO TLB: mapped [mem 0x00000000bb600000-0x00000000bb800000] (</span><span style="color:var(--shiki-token-function)">2MB</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] SLUB: HWalign</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">64,</span><span style="color:var(--shiki-foreground)"> Order</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">0-3,</span><span style="color:var(--shiki-foreground)"> MinObjects</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">0,</span><span style="color:var(--shiki-foreground)"> CPUs</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">1,</span><span style="color:var(--shiki-foreground)"> Nodes</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] rcu: Preemptible hierarchical RCU implementation.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] rcu:     RCU event tracing is enabled.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] rcu:     RCU restricting CPUs from NR_CPUS</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">512</span><span style="color:var(--shiki-token-function)"> to</span><span style="color:var(--shiki-token-string)"> nr_cpu_ids=1.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000]  Trampoline variant of Tasks RCU enabled.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000]  Tracing variant of Tasks RCU enabled.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] rcu: RCU calculated value of scheduler-enlistment delay is 25 jiffies.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] rcu: Adjusting geometry </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> rcu_fanout_leaf=16, nr_cpu_ids=</span><span style="color:var(--shiki-token-constant)">1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] RCU Tasks: Setting shift to 0 and lim to 1 rcu_task_cb_adjust</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">1</span><span style="color:var(--shiki-foreground)"> rcu_task_cpu_ids</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">1.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] RCU Tasks Trace: Setting shift to 0 and lim to 1 rcu_task_cb_adjust</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">1</span><span style="color:var(--shiki-foreground)"> rcu_task_cpu_ids</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">1.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] NR_IRQS: 64, nr_irqs: 64, preallocated irqs: 0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] Root IRQ handler: gic_handle_irq</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] GICv2m: range[mem 0x08020000-0x08020fff], SPI[80:143]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] rcu: srcu_init: Setting srcu_struct sizes based on contention.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] arch_timer: cp15 timer(</span><span style="color:var(--shiki-token-function)">s</span><span style="color:var(--shiki-foreground)">) running at 62.50MHz (</span><span style="color:var(--shiki-token-function)">virt</span><span style="color:var(--shiki-foreground)">).</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000000] clocksource: arch_sys_counter: mask: 0x1ffffffffffffff max_cycles: 0x1cd42e208c, max_idle_ns: 881590405314 ns</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.000061] sched_clock: 57 bits at 63MHz, resolution 16ns, wraps every 4398046511096ns</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.010953] Console: colour dummy device 80x25</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.011631] printk: legacy console [tty0] enabled</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.016729] Calibrating delay loop (</span><span style="color:var(--shiki-token-function)">skipped</span><span style="color:var(--shiki-foreground)">), value calculated using timer frequency.. 125.00 BogoMIPS (lpj</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">250000</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.016954] pid_max: default: 32768 minimum: 301</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.018494] LSM: initializing lsm</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">capability</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.021314] Mount-cache hash table entries: 4096 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 3,</span><span style="color:var(--shiki-token-constant)"> 32768</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.021419] Mountpoint-cache hash table entries: 4096 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 3,</span><span style="color:var(--shiki-token-constant)"> 32768</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.052601] cacheinfo: Unable to detect cache hierarchy </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> CPU </span><span style="color:var(--shiki-token-constant)">0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.073827] rcu: Hierarchical SRCU implementation.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.073945] rcu:     Max phase no-delay instances is 1000.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.082111] EFI services will not be available.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.082833] smp: Bringing up secondary CPUs ...</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.084629] smp: Brought up 1 node, 1 CPU</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.084720] SMP: Total of 1 processors activated.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.084770] CPU: All CPU(</span><span style="color:var(--shiki-token-function)">s</span><span style="color:var(--shiki-foreground)">) started at EL1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.085034] CPU features: detected: 32-bit EL0 Support</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.085072] CPU features: detected: 32-bit EL1 Support</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.085161] CPU features: detected: CRC32 instructions</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.099130] alternatives: applying system-wide alternatives</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.123449] Memory: 1978696K/2097152K available (</span><span style="color:var(--shiki-token-function)">17728K</span><span style="color:var(--shiki-token-string)"> kernel</span><span style="color:var(--shiki-token-string)"> code,</span><span style="color:var(--shiki-token-string)"> 5150K</span><span style="color:var(--shiki-token-string)"> rwdata,</span><span style="color:var(--shiki-token-string)"> 12208K</span><span style="color:var(--shiki-token-string)"> rodata,</span><span style="color:var(--shiki-token-string)"> 3072K</span><span style="color:var(--shiki-token-string)"> init,</span><span style="color:var(--shiki-token-string)"> 744K</span><span style="color:var(--shiki-token-string)"> bss,</span><span style="color:var(--shiki-token-string)"> 82340K</span><span style="color:var(--shiki-token-string)"> reserved,</span><span style="color:var(--shiki-token-string)"> 32768K</span><span style="color:var(--shiki-token-string)"> cma-reserved</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.152982] devtmpfs: initialized</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.178128] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 7645041785100000 ns</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.178750] futex hash table entries: 256 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 2,</span><span style="color:var(--shiki-token-constant)"> 16384</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.182446] 2G module region forced by RANDOMIZE_MODULE_REGION_FULL</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.182559] 0 pages in range </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> non-PLT usage</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.182617] 514496 pages in range </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> PLT usage</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.186387] pinctrl core: initialized pinctrl subsystem</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.196332] DMI not present or invalid.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.219290] NET: Registered PF_NETLINK/PF_ROUTE protocol family</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.230164] DMA: preallocated 256 KiB GFP_KERNEL pool </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> atomic allocations</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.231152] DMA: preallocated 256 KiB GFP_KERNEL</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-function)">GFP_DMA</span><span style="color:var(--shiki-token-string)"> pool</span><span style="color:var(--shiki-token-string)"> for</span><span style="color:var(--shiki-token-string)"> atomic</span><span style="color:var(--shiki-token-string)"> allocations</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.232221] DMA: preallocated 256 KiB GFP_KERNEL</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-function)">GFP_DMA32</span><span style="color:var(--shiki-token-string)"> pool</span><span style="color:var(--shiki-token-string)"> for</span><span style="color:var(--shiki-token-string)"> atomic</span><span style="color:var(--shiki-token-string)"> allocations</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.232649] audit: initializing netlink subsys (</span><span style="color:var(--shiki-token-function)">disabled</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.237149] audit: type</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">2000</span><span style="color:var(--shiki-token-function)"> audit(0.208:1</span><span style="color:var(--shiki-foreground)">): state</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">initialized</span><span style="color:var(--shiki-foreground)"> audit_enabled</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">0</span><span style="color:var(--shiki-foreground)"> res</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.242673] thermal_sys: Registered thermal governor </span><span style="color:var(--shiki-token-string-expression)">&#x27;step_wise&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.242743] thermal_sys: Registered thermal governor </span><span style="color:var(--shiki-token-string-expression)">&#x27;power_allocator&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.243272] cpuidle: using governor menu</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.244689] hw-breakpoint: found 6 breakpoint and 4 watchpoint registers.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.245377] ASID allocator initialised with 32768 entries</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.252209] Serial: AMBA PL011 UART driver</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.316980] 9000000.pl011: ttyAMA0 at MMIO 0x9000000 (</span><span style="color:var(--shiki-token-function)">irq</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-string)"> 13,</span><span style="color:var(--shiki-token-string)"> base_baud</span><span style="color:var(--shiki-token-string)"> =</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">) is a PL011 rev1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.318820] printk: legacy console [ttyAMA0] enabled</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.407534] HugeTLB: registered 1.00 GiB page size, pre-allocated 0 pages</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.408045] HugeTLB: 0 KiB vmemmap can be freed </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-constant)">1.00</span><span style="color:var(--shiki-foreground)"> GiB page</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.408352] HugeTLB: registered 32.0 MiB page size, pre-allocated 0 pages</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.408691] HugeTLB: 0 KiB vmemmap can be freed </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-constant)">32.0</span><span style="color:var(--shiki-foreground)"> MiB page</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.409266] HugeTLB: registered 2.00 MiB page size, pre-allocated 0 pages</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.410754] HugeTLB: 0 KiB vmemmap can be freed </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-constant)">2.00</span><span style="color:var(--shiki-foreground)"> MiB page</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.411163] HugeTLB: registered 64.0 KiB page size, pre-allocated 0 pages</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.411589] HugeTLB: 0 KiB vmemmap can be freed </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-constant)">64.0</span><span style="color:var(--shiki-foreground)"> KiB page</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.422530] ACPI: Interpreter disabled.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.429665] iommu: Default domain type: Translated</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.429974] iommu: DMA domain TLB invalidation policy: strict mode</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.432015] SCSI subsystem initialized</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.434719] usbcore: registered new interface driver usbfs</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.435215] usbcore: registered new interface driver hub</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.435988] usbcore: registered new device driver usb</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.438373] pps_core: LinuxPPS API ver. 1 registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.438699] pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)">giometti@linux.it</span><span style="color:var(--shiki-token-keyword)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.439186] PTP clock support registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.439959] EDAC MC: Ver: 3.0.0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.441633] scmi_core: SCMI protocol bus registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.451134] FPGA manager framework</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.452112] Advanced Linux Sound Architecture Driver Initialized.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.466163] vgaarb: loaded</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.468516] clocksource: Switched to clocksource arch_sys_counter</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.473167] VFS: Disk quotas dquot_6.6.0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.473598] VFS: Dquot-cache hash table entries: 512 (</span><span style="color:var(--shiki-token-function)">order</span><span style="color:var(--shiki-token-string)"> 0,</span><span style="color:var(--shiki-token-constant)"> 4096</span><span style="color:var(--shiki-token-string)"> bytes</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.475572] pnp: PnP ACPI: disabled</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.498996] NET: Registered PF_INET protocol family</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.500966] IP idents hash table entries: 32768 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 6,</span><span style="color:var(--shiki-token-constant)"> 262144</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.508950] tcp_listen_portaddr_hash hash table entries: 1024 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 2,</span><span style="color:var(--shiki-token-constant)"> 16384</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.509902] Table-perturb hash table entries: 65536 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 6,</span><span style="color:var(--shiki-token-constant)"> 262144</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.510513] TCP established hash table entries: 16384 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 5,</span><span style="color:var(--shiki-token-constant)"> 131072</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.511574] TCP bind hash table entries: 16384 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 7,</span><span style="color:var(--shiki-token-constant)"> 524288</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.513749] TCP: Hash tables configured (</span><span style="color:var(--shiki-token-function)">established</span><span style="color:var(--shiki-token-constant)"> 16384</span><span style="color:var(--shiki-token-string)"> bind</span><span style="color:var(--shiki-token-constant)"> 16384</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.515960] UDP hash table entries: 1024 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 4,</span><span style="color:var(--shiki-token-constant)"> 65536</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.517155] UDP-Lite hash table entries: 1024 (</span><span style="color:var(--shiki-token-function)">order:</span><span style="color:var(--shiki-token-string)"> 4,</span><span style="color:var(--shiki-token-constant)"> 65536</span><span style="color:var(--shiki-token-string)"> bytes,</span><span style="color:var(--shiki-token-string)"> linear</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.518956] NET: Registered PF_UNIX/PF_LOCAL protocol family</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.533079] RPC: Registered named UNIX socket transport module.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.533441] RPC: Registered udp transport module.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.533611] RPC: Registered tcp transport module.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.533846] RPC: Registered tcp-with-tls transport module.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.534094] RPC: Registered tcp NFSv4.1 backchannel transport module.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.534610] PCI: CLS 0 bytes, default 64</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.536824] kvm [1]: HYP mode not available</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.546413] Initialise system trusted keyrings</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.548140] workingset: timestamp_bits</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">42</span><span style="color:var(--shiki-foreground)"> max_order</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">19</span><span style="color:var(--shiki-foreground)"> bucket_order</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string)">0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.551637] squashfs: version 4.0 (</span><span style="color:var(--shiki-token-function)">2009/01/31</span><span style="color:var(--shiki-foreground)">) Phillip Lougher</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.554195] NFS: Registering the id_resolver key type</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.554994] Key type id_resolver registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.555354] Key type id_legacy registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.555904] nfs4filelayout_init: NFSv4 File Layout Driver Registering...</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.557397] nfs4flexfilelayout_init: NFSv4 Flexfile Layout Driver Registering...</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.558893] 9p: Installing v9fs 9p2000 file system support</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.626086] Key type asymmetric registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.626427] Asymmetric key parser </span><span style="color:var(--shiki-token-string-expression)">&#x27;x509&#x27;</span><span style="color:var(--shiki-foreground)"> registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.627092] Block layer SCSI generic (</span><span style="color:var(--shiki-token-function)">bsg</span><span style="color:var(--shiki-foreground)">) driver version 0.4 loaded (</span><span style="color:var(--shiki-token-function)">major</span><span style="color:var(--shiki-token-constant)"> 245</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.627747] io scheduler mq-deadline registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.628482] io scheduler kyber registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.629287] io scheduler bfq registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.655255] pl061_gpio 9030000.pl061: PL061 GPIO chip registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.659715] ledtrig-cpu: registered to indicate activity on CPUs</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.664721] pci-host-generic 4010000000.pcie: host bridge /pcie@10000000 ranges:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.665863] pci-host-generic 4010000000.pcie:       IO 0x003eff0000..0x003effffff -</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> 0x0000000000</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.667013] pci-host-generic 4010000000.pcie:      MEM 0x0010000000..0x003efeffff -</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> 0x0010000000</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.667599] pci-host-generic 4010000000.pcie:      MEM 0x8000000000..0xffffffffff -</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> 0x8000000000</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.669366] pci-host-generic 4010000000.pcie: Memory resource size exceeds max </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-foreground)"> bits</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.671053] pci-host-generic 4010000000.pcie: ECAM at [mem 0x4010000000-0x401fffffff] </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> [bus 00-ff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.673373] pci-host-generic 4010000000.pcie: PCI host bridge to bus 0000:00</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.674164] pci_bus 0000:00: root bus resource [bus 00-ff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.674582] pci_bus 0000:00: root bus resource [io  0x0000-0xffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.674966] pci_bus 0000:00: root bus resource [mem 0x10000000-0x3efeffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.675380] pci_bus 0000:00: root bus resource [mem 0x8000000000-0xffffffffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.677876] pci 0000:00:00.0: [1b36:0008] type 00 class 0x060000 conventional PCI endpoint</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.684199] pci 0000:00:01.0: [1af4:1000] type 00 class 0x020000 conventional PCI endpoint</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.685457] pci 0000:00:01.0: BAR 0 [io  0x0000-0x001f]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.685782] pci 0000:00:01.0: BAR 1 [mem 0x00000000-0x00000fff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.686634] pci 0000:00:01.0: BAR 4 [mem 0x00000000-0x00003fff 64bit pref]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.687649] pci 0000:00:01.0: ROM [mem 0x00000000-0x0003ffff pref]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.690778] pci 0000:00:01.0: ROM [mem 0x10000000-0x1003ffff pref]: assigned</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.691667] pci 0000:00:01.0: BAR 4 [mem 0x8000000000-0x8000003fff 64bit pref]: assigned</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.692282] pci 0000:00:01.0: BAR 1 [mem 0x10040000-0x10040fff]: assigned</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.693232] pci 0000:00:01.0: BAR 0 [io  0x1000-0x101f]: assigned</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.693941] pci_bus 0000:00: resource 4 [io  0x0000-0xffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.694504] pci_bus 0000:00: resource 5 [mem 0x10000000-0x3efeffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.695383] pci_bus 0000:00: resource 6 [mem 0x8000000000-0xffffffffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.758592] virtio-pci 0000:00:01.0: enabling device (</span><span style="color:var(--shiki-token-function)">0000</span><span style="color:var(--shiki-foreground)"> -</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-token-constant)"> 0003</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.776913] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.786524] msm_serial: driver initialized</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.787566] SuperH (</span><span style="color:var(--shiki-token-function)">H</span><span style="color:var(--shiki-foreground)">)SCI(</span><span style="color:var(--shiki-token-function)">F</span><span style="color:var(--shiki-foreground)">) driver initialized</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.788711] STM32 USART driver initialized</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.817222] loop: module loaded</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.819956] megasas: 07.727.03.00-rc1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.825879] physmap-flash 0.flash: physmap platform flash device: [mem 0x00000000-0x03ffffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.828468] 0.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.829623] Intel/Sharp Extended Query Table at 0x0031</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.831260] Using buffer write method</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.832620] physmap-flash 0.flash: physmap platform flash device: [mem 0x04000000-0x07ffffff]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.834380] 0.flash: Found 2 x16 devices at 0x0 in 32-bit bank. Manufacturer ID 0x000000 Chip ID 0x000000</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.835111] Intel/Sharp Extended Query Table at 0x0031</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.836804] Using buffer write method</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.837322] Concatenating MTD devices:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.837526] (</span><span style="color:var(--shiki-token-function)">0</span><span style="color:var(--shiki-foreground)">): </span><span style="color:var(--shiki-token-string-expression)">&quot;0.flash&quot;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.837692] (</span><span style="color:var(--shiki-token-function)">1</span><span style="color:var(--shiki-foreground)">): </span><span style="color:var(--shiki-token-string-expression)">&quot;0.flash&quot;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.837952] into device </span><span style="color:var(--shiki-token-string-expression)">&quot;0.flash&quot;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.865829] tun: Universal TUN/TAP device driver, 1.6</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.883830] thunder_xcv, ver 1.0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.884214] thunder_bgx, ver 1.0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.884944] nicpf, ver 1.0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.887822] hns3: Hisilicon Ethernet Network Driver </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> Hip08 Family - version</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.888112] hns3: Copyright (</span><span style="color:var(--shiki-token-function)">c</span><span style="color:var(--shiki-foreground)">) 2017 Huawei Corporation.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.888873] hclge is initializing</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.889266] e1000: Intel(</span><span style="color:var(--shiki-token-function)">R</span><span style="color:var(--shiki-foreground)">) PRO/1000 Network Driver</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.889509] e1000: Copyright (</span><span style="color:var(--shiki-token-function)">c</span><span style="color:var(--shiki-foreground)">) 1999-2006 Intel Corporation.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.890006] e1000e: Intel(</span><span style="color:var(--shiki-token-function)">R</span><span style="color:var(--shiki-foreground)">) PRO/1000 Network Driver</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.890429] e1000e: Copyright(</span><span style="color:var(--shiki-token-function)">c</span><span style="color:var(--shiki-foreground)">) 1999 - 2015 Intel Corporation.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.891030] igb: Intel(</span><span style="color:var(--shiki-token-function)">R</span><span style="color:var(--shiki-foreground)">) Gigabit Ethernet Network Driver</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.891574] igb: Copyright (</span><span style="color:var(--shiki-token-function)">c</span><span style="color:var(--shiki-foreground)">) 2007-2014 Intel Corporation.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.892397] igbvf: Intel(</span><span style="color:var(--shiki-token-function)">R</span><span style="color:var(--shiki-foreground)">) Gigabit Virtual Function Network Driver</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.893067] igbvf: Copyright (</span><span style="color:var(--shiki-token-function)">c</span><span style="color:var(--shiki-foreground)">) 2009 - 2012 Intel Corporation.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.894384] sky2: driver version 1.30</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.899286] VFIO - User Level meta-driver version: 0.3</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.908820] usbcore: registered new interface driver usb-storage</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.920923] rtc-pl031 9010000.pl031: registered as rtc0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.921877] rtc-pl031 9010000.pl031: setting system clock to 2025-03-11T12:15:46 UTC (</span><span style="color:var(--shiki-token-function)">1741695346</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.924773] i2c_dev: i2c /dev entries driver</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.941260] sdhci: Secure Digital Host Controller Interface driver</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.941587] sdhci: Copyright(</span><span style="color:var(--shiki-token-function)">c</span><span style="color:var(--shiki-foreground)">) Pierre Ossman</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.943342] Synopsys Designware Multimedia Card Interface Driver</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.946224] sdhci-pltfm: SDHCI platform and OF driver helper</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.955270] usbcore: registered new interface driver usbhid</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.955680] usbhid: USB HID core driver</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.966204] hw perfevents: enabled with armv8_pmuv3 PMU driver, 7 (</span><span style="color:var(--shiki-token-function)">0,8000003f</span><span style="color:var(--shiki-foreground)">) counters available</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.981580] NET: Registered PF_PACKET protocol family</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.983268] 9pnet: Installing 9P2000 support</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    0.983923] Key type dns_resolver registered</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    1.006902] registered taskstats version 1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    1.009045] Loading compiled-in X.509 certificates</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    1.028728] Demotion targets </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> Node 0: null</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    1.039448] input: gpio-keys as /devices/platform/gpio-keys/input/input0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    1.049892] clk: Disabling unused clocks</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    1.050371] PM: genpd: Disabling unused power domains</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    1.050995] ALSA device list:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    1.051202]   No soundcards found.</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[    1.060111] /dev/root: Can</span><span style="color:var(--shiki-token-string-expression)">&#x27;t open blockdev</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.061434] VFS: Cannot open root device &quot;&quot; or unknown-block(0,0): error -6</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.062042] Please append a correct &quot;root=&quot; boot option; here are the available partitions:</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.062782] 1f00          131072 mtdblock0</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.062885]  (driver?)</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.063616] List of all bdev filesystems:</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.064152]  ext3</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.064179]  ext2</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.064706]  ext4</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.064930]  squashfs</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.065135]  vfat</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.065504]</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.066044] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.067317] CPU: 0 UID: 0 PID: 1 Comm: swapper/0 Not tainted 6.14.0-rc5-00013-g99fa936e8e4f #2</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.067962] Hardware name: linux,dummy-virt (DT)</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.069456] Call trace:</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.069861]  show_stack+0x18/0x24 (C)</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.070978]  dump_stack_lvl+0x60/0x80</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.071317]  dump_stack+0x18/0x24</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.071691]  panic+0x168/0x360</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.072154]  mount_root_generic+0x1f8/0x2b0</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.072603]  mount_root+0x208/0x248</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.072918]  prepare_namespace+0x1d8/0x240</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.073664]  kernel_init_freeable+0x254/0x278</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.074329]  kernel_init+0x20/0x140</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.074665]  ret_from_fork+0x10/0x20</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.075455] Kernel Offset: 0x518503000000 from 0xffff800080000000</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.076354] PHYS_OFFSET: 0xfff0f0e3c0000000</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.076753] CPU features: 0x000,00000900,00800000,0200421b</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.077146] Memory Limit: none</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">[    1.078023] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="添加根文件系统"><a href="#添加根文件系统" class="rp-header-anchor rp-link" aria-hidden="true">#</a>添加根文件系统</h2>
<h3 class="rp-toc-include" id="配置内核支持"><a href="#配置内核支持" class="rp-header-anchor rp-link" aria-hidden="true">#</a>配置内核支持</h3>
<p>勾选上RAM block device support，也即CONFIG_BLK_DEV_RAM=y</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>Device Drivers  ---&gt;</span></span>
<span class="line"><span>[*] Block devices  ---&gt;</span></span>
<span class="line"><span> &lt;M&gt;   RAM block device support</span></span>
<span class="line"><span> (16)    Default number of RAM disks</span></span>
<span class="line"><span> (4096)  Default RAM disk size (kbytes) (NEW)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>重新编译</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">make</span><span style="color:var(--shiki-token-string)"> ARCH=arm64</span><span style="color:var(--shiki-token-string)"> CROSS_COMPILE=aarch64-linux-gnu-</span><span style="color:var(--shiki-token-string)"> -j6</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="制作根文件系统"><a href="#制作根文件系统" class="rp-header-anchor rp-link" aria-hidden="true">#</a>制作根文件系统</h3>
<p>创建一个文件夹<code>initramfs</code>作为系统根目录，然后创建一个可执行程序`init.c</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-comment)">// initramfs/init.c</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;stdio.h&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;unistd.h&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;hello world!\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> count </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    while</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;count: </span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> count</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        sleep(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>编程生成<code>init</code>启动文件</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">aarch64-linux-gnu-gcc</span><span style="color:var(--shiki-token-string)"> init.c</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> init</span><span style="color:var(--shiki-token-string)"> -static</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>使用cpio打包文件系统</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">find</span><span style="color:var(--shiki-token-string)"> .</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> cpio</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> -H</span><span style="color:var(--shiki-token-string)"> newc</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> gzip</span><span style="color:var(--shiki-token-keyword)"> &gt;</span><span style="color:var(--shiki-token-string)"> initramfs.cpio.gz</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="运行带有跟文件系统的内核"><a href="#运行带有跟文件系统的内核" class="rp-header-anchor rp-link" aria-hidden="true">#</a>运行带有跟文件系统的内核</h2>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">qemu-system-aarch64</span><span style="color:var(--shiki-token-string)"> -machine</span><span style="color:var(--shiki-token-string)"> virt</span><span style="color:var(--shiki-token-string)"> -cpu</span><span style="color:var(--shiki-token-string)"> cortex-a53</span><span style="color:var(--shiki-token-string)"> -nographic</span><span style="color:var(--shiki-token-string)"> -smp</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-string)"> -m</span><span style="color:var(--shiki-token-constant)"> 2048</span><span style="color:var(--shiki-token-string)"> -kernel</span><span style="color:var(--shiki-token-string)"> arch/arm64/boot/Image</span><span style="color:var(--shiki-token-string)"> -append</span><span style="color:var(--shiki-token-string-expression)"> &quot;root=/dev/ram0 rootfstype=ramfs rw init=/init&quot;</span><span style="color:var(--shiki-token-string)">  -initrd</span><span style="color:var(--shiki-token-string)"> initramfs.cpio.gz</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>按下<code>Ctrl + a</code>键，然后按下<code>x</code>键推出qemu</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>...</span></span>
<span class="line"><span>[    2.001303] Key type dns_resolver registered</span></span>
<span class="line"><span>[    2.045796] registered taskstats version 1</span></span>
<span class="line"><span>[    2.049218] Loading compiled-in X.509 certificates</span></span>
<span class="line"><span>[    2.079850] Demotion targets for Node 0: null</span></span>
<span class="line"><span>[    2.098945] input: gpio-keys as /devices/platform/gpio-keys/input/input0</span></span>
<span class="line"><span>[    2.116717] clk: Disabling unused clocks</span></span>
<span class="line"><span>[    2.117571] PM: genpd: Disabling unused power domains</span></span>
<span class="line"><span>[    2.118599] ALSA device list:</span></span>
<span class="line"><span>[    2.120375]   No soundcards found.</span></span>
<span class="line"><span>[    2.192567] Freeing unused kernel memory: 3072K</span></span>
<span class="line"><span>[    2.194741] Run /init as init process</span></span>
<span class="line"><span>hello world!</span></span>
<span class="line"><span>count: 0</span></span>
<span class="line"><span>count: 1</span></span>
<span class="line"><span>count: 2</span></span>
<span class="line"><span>count: 3</span></span>
<span class="line"><span>count: 4</span></span>
<span class="line"><span>count: 5</span></span>
<span class="line"><span>QEMU: Terminated</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="qemu参数解释"><a href="#qemu参数解释" class="rp-header-anchor rp-link" aria-hidden="true">#</a>qemu参数解释</h3>
<ul>
<li><code>-machine virt </code>：指定<code>qemu</code>模拟的设备，这里就是指一个通用的<code>armv8</code>架构的芯片</li>
<li><code>-cpu cortex-a53 </code>：指定具体的核心</li>
<li><code>-nographic</code>：表示启动时没有图形界面</li>
<li><code>-smp 1 </code>：设置该设备只有1个核</li>
<li><code>-m 2048 </code>：表示设置该设备有<code>2048MB</code>的内存</li>
<li><code>-kernel arch/arm64/boot/Image</code>：指定用于启动的内核文件</li>
<li><code>-initrd initramfs.cpio.gz</code>：表示指定使用这个文件作为<code>ramfs</code>的内容，也即我们自己生成的根文件系统</li>
<li><code>-append &quot;root=/dev/ram0 rootfstype=ramfs rw init=/init</code>：表示了传递给内核的参数
<ul>
<li><code>root</code> 表示根文件系统的设备为 <code>/dev/ram0</code>, 除此之外制定了文件系统的类型是 <code>ramfs</code></li>
<li><code>init</code> 表示系统启动的第一个进程名称，内核会从文件系统中加载该进程去执行</li>
</ul>
</li>
</ul><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Linux中的各种锁及其基本原理]]></title>
        <id>/blog/2025/linux-lock</id>
        <link href="https://www.vhcffh.com/blog/2025/linux-lock"/>
        <updated>2025-02-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文深入探讨了Linux中的各种锁机制。内容从并行性、同步与互斥等基本概念入手，详细解析了自旋锁、互斥锁、读写锁和RCU锁的原理与适用场景。文章还区分了可重入与不可重入锁，并讲解了条件变量如何与互斥锁结合使用，以生产者-消费者模型为例进行了说明。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="linux中的各种锁及其基本原理"><a href="#linux中的各种锁及其基本原理" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Linux中的各种锁及其基本原理<!-- --> </h1>
<p>通过本文将了解到如下内容:</p>
<ol>
<li>Linux系统的并行性特征</li>
<li>互斥和同步机制</li>
<li>Linux中常用锁的基本特性</li>
<li>互斥锁和条件变量</li>
</ol>
<h2 class="rp-toc-include" id="linux的并行性特征"><a href="#linux的并行性特征" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Linux的并行性特征</h2>
<p>Linux作为典型的多用户、多任务、抢占式内核调度的操作系统，为了提高并行处理能力，无论在内核层面还是在用户层面都需要特殊的机制来确保任务的正确性和系统的稳定运行，就如同一个国家需要各种法律条款来约束每个公民的行为，才能有条不紊地运转。</p>
<p>在内核层面涉及到各种软硬件中断、进线程睡眠、抢占式内核调度、多处理器SMP架构等，因此内核在完成自己工作的时候一直在处理这些资源抢占的冲突问题。</p>
<p>在用户层面的进程，虽然Linux作为虚地址模式操作系统，为每个进程开辟了独立的虚拟地址空间，伪独占式拥有资源，但是仍然存在很多场景不得不产生多个进程共享资源的问题，来完成进程间的通信。</p>
<p>在线程层面，线程作为进程的一部分，进程内的多个线程只拥有自己的独立堆栈等少量结构，大部分的资源还是线程共享，因此多线程的资源占用冲突比进程更加明显，所以多线程编程的线程安全问题是个重难点。
综上可知，无论在kernel还是user space都必须有一些机制来确保对于资源共享问题的解决，然后这个机制就是接下来要说的：同步和互斥。</p>
<h2 class="rp-toc-include" id="同步和互斥机制"><a href="#同步和互斥机制" class="rp-header-anchor rp-link" aria-hidden="true">#</a>同步和互斥机制</h2>
<h3 class="rp-toc-include" id="基本概念"><a href="#基本概念" class="rp-header-anchor rp-link" aria-hidden="true">#</a>基本概念</h3>
<p>同步和互斥的概念有时候很容易混淆，可以简单地认为同步是更加宏观角度的一种说法，互斥是冲突解决的细节方法。
所谓同步就是调度者让任务按照约定的合理的顺序进行，但是当任务之间出现资源竞争，也就是竞态冲突时，使用互斥的规则强制约束允许数量的任务占用资源，从而解决各个竞争状态，实现任务的合理运行。</p>
<p>同步和互斥密不可分。</p>
<p>简单来说:</p>
<ul>
<li>同步与互斥机制是用于控制多个任务对某些特定资源的访问策略</li>
<li>同步是控制多个任务按照一定的规则或顺序访问某些共享资源</li>
<li>互斥是控制某些共享资源在任意时刻只能允许规定数量的任务访问</li>
</ul>
<h3 class="rp-toc-include" id="角色分类"><a href="#角色分类" class="rp-header-anchor rp-link" aria-hidden="true">#</a>角色分类</h3>
<p>整个协调流程涉及的角色本质上只有三类:</p>
<ul>
<li>不可独占的共享资源</li>
<li>多个使用者</li>
<li>调度者</li>
</ul>
<p>调度者需要为多个运行任务制定访问使用规则来实现稳定运行，这个调度者可以是内核、可以是应用程序，具体场景具体分析。</p>
<h3 class="rp-toc-include" id="重要术语"><a href="#重要术语" class="rp-header-anchor rp-link" aria-hidden="true">#</a>重要术语</h3>
<p>要很好地理解同步和互斥，就必须得搞清楚几个重要术语:</p>
<ul>
<li>竞争冒险(race hazard)或竞态条件(race condition）</li>
</ul>
<p>最早听说这个术语是在模电数电的课程上，门电路出现竞态条件造成错误的结果，在计算机里面就是多个使用者同时操作共享的变量造成结果的不确定。</p>
<ul>
<li>临界区</li>
</ul>
<p>临界区域critical section是指多使用者可能同时共同操作的那部分代码，比如自加自减操作，多个线程处理时就需要对自加自减进行保护，这段代码就是临界区域。</p>
<h2 class="rp-toc-include" id="linux中常用的锁"><a href="#linux中常用的锁" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Linux中常用的锁</h2>
<p>在说锁之前还需要知道几个东西:信号量和条件变量。
这两个东西和锁有一定的联系和区别，在不同的场合单独使用或者配合实现来说实现安全的并发，至于网上很多说互斥锁是一种信号量的特例，对于这种特例理解不了也罢。
信号量和互斥锁的场景不一样，信号量主要是资源数量的管理(池化)，实际用的频率远不如互斥锁，文字游戏着实无趣，实用主义至上，掌握高频工具的特点正确使用即可，大可不必过于学术派。
在使用锁时需要明确几个问题：</p>
<ul>
<li>锁的所有权问题 谁加锁 谁解锁 解铃还须系铃人</li>
<li>锁的作用就是对临界区资源的读写操作的安全限制</li>
<li>锁是否可以被多个使用者占用（互不影响的使用者对资源的占用）</li>
<li>占用资源的加锁者的释放问题（锁持有的超时问题）</li>
<li>等待资源的待加锁者的等待问题（如何通知到其他等着资源的使用者）</li>
<li>多个临界区资源锁的循环问题（死锁场景）</li>
</ul>
<p>带着问题明确想要达到的目的，我们同样可以根据自己的需求设计锁，Linux现有的锁如果从上面几个问题的角度去理解，就非常容易了。</p>
<h3 class="rp-toc-include" id="自旋锁spinlock"><a href="#自旋锁spinlock" class="rp-header-anchor rp-link" aria-hidden="true">#</a>自旋锁spinlock</h3>
<p>自旋锁的主要特征是使用者在想要获得临界区执行权限时，如果临界区已经被加锁，那么自旋锁并不会阻塞睡眠，等待系统来主动唤醒，而是原地忙轮询资源是否被释放加锁，自旋就是自我旋转，这个名字还是很形象的。
自旋锁有它的优点就是避免了系统的唤醒，自己来执行轮询，如果在临界区的资源代码非常短且是原子的，那么使用起来是非常方便的，避免了各种上下文切换，开销非常小，因此在内核的一些数据结构中自旋锁被广泛的使用。</p>
<h3 class="rp-toc-include" id="互斥锁mutex"><a href="#互斥锁mutex" class="rp-header-anchor rp-link" aria-hidden="true">#</a>互斥锁mutex</h3>
<p>使用者使用互斥锁时在访问共享资源之前对进行加锁操作，在访问完成之后进行解锁操作，谁加锁谁释放，其他使用者没有释放权限。
加锁后，任何其他试图再次加锁的线程会被阻塞，直到当前进程解锁。
区别于自旋锁，互斥锁无法获取锁时将阻塞睡眠，需要系统来唤醒，可以看出来自旋转自己原地旋转来确定锁被释放了，互斥锁由系统来唤醒，但是现实并不是那么美好的，因为很多业务逻辑系统是不知道的，仍然需要业务线程执行while来轮询是否可以重新加锁。
考虑这种情况：解锁时有多个线程阻塞，那么所有该锁上的线程都被编程就绪状态，第一个变为就绪状态的线程又执行加锁操作，那么其他的线程又会进入等待，对其他线程而言就是虚假唤醒。
在这种方式下，只有一个线程能够访问被互斥锁保护的资源。</p>
<h3 class="rp-toc-include" id="读写锁rwlock"><a href="#读写锁rwlock" class="rp-header-anchor rp-link" aria-hidden="true">#</a>读写锁rwlock</h3>
<p>读写锁也叫共享互斥锁：读模式共享和写模式互斥，本质上这种非常合理，因为在数据没有被写的前提下，多个使用者读取时完全不需要加锁的。
读写锁有读加锁状态、写加锁状态和不加锁状态三种状态，当读写锁在写加锁模式下，任何试图对这个锁进行加锁的线程都会被阻塞，直到写进程对其解锁。</p>
<p>读优先的读写锁：读写锁rwlock默认的也是读优先，也就是:当读写锁在读加锁模式先，任何线程都可以对其进行读加锁操作，但是所有试图进行写加锁操作的线程都会被阻塞，直到所有的读线程都解锁，因此读写锁很适合读次数远远大于写的情况。
这种情况需要考虑写饥饿问题，也就是大量的读一直轮不到写，因此需要设置公平的读写策略。
在一次面试中曾经问到实现一个写优先级的读写锁，感兴趣的可以想想如何实现。</p>
<h3 class="rp-toc-include" id="rcu锁"><a href="#rcu锁" class="rp-header-anchor rp-link" aria-hidden="true">#</a>RCU锁</h3>
<p>RCU锁是读写锁的扩展版本，简单来说就是支持多读多写同时加锁，多读没什么好说的，但是对于多写同时加锁，还是存在一些技术挑战的。
RCU锁翻译为Read Copy Update Lock，读-拷贝-更新 锁。
Copy拷贝：写者在访问临界区时，写者将先拷贝一个临界区副本，然后对副本进行修改；Update更新：RCU机制将在在适当时机使用一个回调函数把指向原来临界区的指针重新指向新的被修改的临界区，锁机制中的垃圾收集器负责回调函数的调用。
更新时机：没有CPU再去操作这段被RCU保护的临界区后，这段临界区即可回收了，此时回调函数即被调用。
从实现逻辑来看，RCU锁在多个写者之间的同步开销还是比较大的，涉及到多份数据拷贝，回调函数等，因此这种锁机制的使用范围比较窄，适用于读多写少的情况，如网络路由表的查询更新、设备状态表更新等，在业务开发中使用不是很多。</p>
<h3 class="rp-toc-include" id="可重入锁和不可重入锁"><a href="#可重入锁和不可重入锁" class="rp-header-anchor rp-link" aria-hidden="true">#</a>可重入锁和不可重入锁</h3>
<ul>
<li>递归锁recursive mutex 可重入锁(reentrant mutex)</li>
<li>非递归锁non-recursive mutex 不可重入锁(non-reentrant mutex)</li>
</ul>
<p>Windows下的Mutex和Critical Section是可递归的。
Linux下的<code>pthread_mutex_t</code>锁默认是非递归的。
在Linux中可以显式设置<code>PTHREAD_MUTEX_RECURSIVE</code>属性，将<code>pthread_mutex_t</code>设为递归锁避免这种场景。
同一个线程可以多次获取同一个递归锁，不会产生死锁。
而如果一个线程多次获取同一个非递归锁，则会产生死锁。</p>
<p>如下代码对于非递归锁的死锁示例：</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-foreground)">MutexLock mutex;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> funca</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    mutex</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">lock</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    do_sth()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    mutex</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">unlock</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> funcb</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    mutex</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">lock</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    funca()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    mutex</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">unlock</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>代码中testb使用了mutex并且调用testa，但是testa中也调用了相同的mutext，这种场景下如果mutex是非递归的就会出现死锁。</p>
<h3 class="rp-toc-include" id="条件变量condition-variables"><a href="#条件变量condition-variables" class="rp-header-anchor rp-link" aria-hidden="true">#</a>条件变量condition variables</h3>
<p>条件变量是用来等待线程而不是上锁的，通常和互斥锁一起使用。
互斥锁的一个明显的特点就是某些业务场景中无法借助系统来唤醒，仍然需要业务代码使用while来判断，这样效率本质上比较低。
而条件变量通过允许线程阻塞和等待另一个线程发送信号来弥补互斥锁的不足，所以互斥锁和条件变量通常一起使用，来让条件变量异步唤醒阻塞的线程。</p>
<p>条件变量和互斥锁的典型使用就是生产者和消费者模型，这个模型非常经典，也在面试中经常被问到，示例代码：</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;stdio.h&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;pthread.h&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#define</span><span style="color:var(--shiki-token-function)"> MAX</span><span style="color:var(--shiki-token-constant)"> 5</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">pthread_mutex_t</span><span style="color:var(--shiki-foreground)"> mutex </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> PTHREAD_MUTEX_INITIALIZER;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">pthread_cond_t</span><span style="color:var(--shiki-foreground)"> notfull </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> PTHREAD_COND_INITIALIZER;</span><span style="color:var(--shiki-token-comment)">  //是否队满</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">pthread_cond_t</span><span style="color:var(--shiki-foreground)"> notempty </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> PTHREAD_COND_INITIALIZER;</span><span style="color:var(--shiki-token-comment)"> //是否队空</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> top </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> bottom </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void*</span><span style="color:var(--shiki-token-function)"> produce</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">void*</span><span style="color:var(--shiki-foreground)"> arg)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> i;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> ( i </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">; i </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)"> MAX</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">; i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        pthread_mutex_lock(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">mutex)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-foreground)"> ((top</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-foreground)">MAX </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-foreground)"> bottom)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;full! producer is waiting\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //等待队不满</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            pthread_cond_wait(notfull</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">mutex)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        top </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (top</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-foreground)"> MAX;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //发出队非空的消息</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        pthread_cond_signal(notempty)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        pthread_mutex_unlock(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">mutex)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">void*</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void*</span><span style="color:var(--shiki-token-function)"> consume</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">void*</span><span style="color:var(--shiki-foreground)"> arg)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> i;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> ( i </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">; i </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)"> MAX</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">; i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        pthread_mutex_lock(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">mutex)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-foreground)"> ( top</span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-foreground)">MAX </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-foreground)"> bottom)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;empty! consumer is waiting\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //等待队不空</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            pthread_cond_wait(notempty</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">mutex)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        bottom </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (bottom</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-foreground)"> MAX;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //发出队不满的消息</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        pthread_cond_signal(notfull)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        pthread_mutex_unlock(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">mutex)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">void*</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> argc</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">argv</span><span style="color:var(--shiki-token-keyword)">[]</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    pthread_t</span><span style="color:var(--shiki-foreground)"> thid1;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    pthread_t</span><span style="color:var(--shiki-foreground)"> thid2;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    pthread_t</span><span style="color:var(--shiki-foreground)"> thid3;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    pthread_t</span><span style="color:var(--shiki-foreground)"> thid4;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> ret1;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> ret2;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> ret3;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> ret4;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">    pthread_create(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">thid1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> produce</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    pthread_create(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">thid2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> consume</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    pthread_create(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">thid3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> produce</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    pthread_create(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">thid4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> consume</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">    pthread_join(thid1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> (</span><span style="color:var(--shiki-token-keyword)">void**</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">ret1)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    pthread_join(thid2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> (</span><span style="color:var(--shiki-token-keyword)">void**</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">ret2)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    pthread_join(thid3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> (</span><span style="color:var(--shiki-token-keyword)">void**</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">ret3)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    pthread_join(thid4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> (</span><span style="color:var(--shiki-token-keyword)">void**</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">ret4)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>其中<code>pthread_cond_wait</code>的使用是个需要注意的地方:<code>pthread_cond_wait()</code>是先将互斥锁解开，并陷入阻塞，直到<code>pthread_signal()</code>发出信号后<code>pthread_cond_wait()</code>再加上锁，然后退出。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[FreeRTOS中的锁]]></title>
        <id>/blog/2025/freertos-lock</id>
        <link href="https://www.vhcffh.com/blog/2025/freertos-lock"/>
        <updated>2025-02-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了FreeRTOS中用于多任务同步的几种锁机制。内容涵盖了用于保护共享资源的互斥锁（Mutexes），其特点是支持优先级继承以避免优先级反转。此外，还讲解了用于简单同步的二值信号量、控制资源数量的计数信号量以及用于复杂状态管理的事件组。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="freertos中的锁"><a href="#freertos中的锁" class="rp-header-anchor rp-link" aria-hidden="true">#</a>FreeRTOS中的锁<!-- --> </h1>
<p>在FreeRTOS中，锁(locks)主要用于在多任务环境中同步访问共享资源，防止多个任务同时访问资源引发冲突。
FreeRTOS提供了几种不同的锁机制，每种锁都有其特定的使用场景和作用。</p>
<h2 class="rp-toc-include" id="互斥锁mutexes"><a href="#互斥锁mutexes" class="rp-header-anchor rp-link" aria-hidden="true">#</a>互斥锁(Mutexes)</h2>
<p>互斥锁用于任务间的互斥访问，通常用来保护共享资源，确保同一时间只有一个任务能够访问资源，避免数据竞争。</p>
<p>在FreeRTOS中，互斥锁是二值信号量的一个扩展，但它增加了<a href="https://www.cnblogs.com/mickey-double/p/14366803.html" target="_blank" rel="noopener noreferrer" class="rp-link">优先级继承机制</a>，用于避免优先级反转(priority inversion)的问题。
通常用于保护共享资源（例如硬件设备、全局变量等）。</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &quot;FreeRTOS.h&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &quot;semphr.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-constant)">SemaphoreHandle_t</span><span style="color:var(--shiki-foreground)"> xMutex;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> vTask1</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">pvParameters) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    while</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        // 获取互斥锁</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">xSemaphoreTake(xMutex</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> portMAX_DELAY)</span><span style="color:var(--shiki-token-keyword)"> ==</span><span style="color:var(--shiki-foreground)"> pdTRUE) {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            // 访问共享资源</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;Task 1 is accessing shared resource\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;Task 1 is run...\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            vTaskDelay(pdMS_TO_TICKS(</span><span style="color:var(--shiki-token-constant)">500</span><span style="color:var(--shiki-token-function)">))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;Task 1 is run end\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            // 释放互斥锁</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            xSemaphoreGive(xMutex)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    vTaskDelete(</span><span style="color:var(--shiki-token-constant)">NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> vTask2</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">pvParameters) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    while</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        // 获取互斥锁</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">xSemaphoreTake(xMutex</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> portMAX_DELAY)</span><span style="color:var(--shiki-token-keyword)"> ==</span><span style="color:var(--shiki-foreground)"> pdTRUE) {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            // 访问共享资源</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;Task 2 is accessing shared resource\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;Task 2 is run...\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            vTaskDelay(pdMS_TO_TICKS(</span><span style="color:var(--shiki-token-constant)">500</span><span style="color:var(--shiki-token-function)">))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;Task 2 is run end\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            // 释放互斥锁</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            xSemaphoreGive(xMutex)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    vTaskDelete(</span><span style="color:var(--shiki-token-constant)">NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    // 创建互斥锁</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    xMutex </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> xSemaphoreCreateMutex()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    </span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> (xMutex </span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        // 创建两个任务</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        xTaskCreate(vTask1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;Task1&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        xTaskCreate(vTask2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)"> &quot;Task2&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        // 启动调度器</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        vTaskStartScheduler()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    } </span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        // 创建互斥锁失败</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;Failed to create mutex\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    </span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="二值信号量binary-semaphores"><a href="#二值信号量binary-semaphores" class="rp-header-anchor rp-link" aria-hidden="true">#</a>二值信号量(Binary Semaphores)</h2>
<p>二值信号量(xSemaphoreCreateBinary,xSemaphoreTake,xSemaphoreGive)本质上是一种简单的锁机制，可以用来同步任务或中断与任务之间的通信，控制任务间的同步。
二值信号量只有两个状态：“已获取”或“未获取”。
但二值信号量<strong>不支持优先级继承机制</strong>，适用于比较简单的同步需求。</p>
<h2 class="rp-toc-include" id="计数信号量counting-semaphores"><a href="#计数信号量counting-semaphores" class="rp-header-anchor rp-link" aria-hidden="true">#</a>计数信号量(Counting Semaphores)</h2>
<p>计数信号量可以用来控制多个任务访问共享资源的数量，通常用于限制资源的使用（例如限制同时可访问的设备数量）。
计数信号量可以有一个计数值，任务通过获取和释放信号量来减少或增加计数值。
通常用于控制对有限数量的资源（例如多个设备或缓冲区）的访问。</p>
<h2 class="rp-toc-include" id="事件组event-groups"><a href="#事件组event-groups" class="rp-header-anchor rp-link" aria-hidden="true">#</a>事件组(Event Groups)</h2>
<p>事件组用于任务之间的复杂同步和状态管理。一个事件组由多个二进制标志位组成，任务可以等待这些标志位的变化。
事件组允许多个任务等待不同的标志位或者一个组合条件（例如：多个条件满足才继续执行）。
比较适用于需要多个任务同步或触发条件的场景。
通常用于任务间的复杂同步（例如多个任务的状态变化）。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Git配置多个用户]]></title>
        <id>/blog/2024/git-multi-user</id>
        <link href="https://www.vhcffh.com/blog/2024/git-multi-user"/>
        <updated>2024-08-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了在Git中配置多个用户身份的简洁方法。通过在主配置文件`~/.gitconfig`中使用`includeIf`指令，可以根据仓库所在的目录路径，条件性地加载不同的子配置文件，从而为不同工作区自动切换用户名和邮箱。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="git配置多个用户"><a href="#git配置多个用户" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Git配置多个用户<!-- --> </h1>
<p>只需要将下面的配置放入到<code>~/.gitconfig</code>等文件</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-comment)"># ~/.gitconfig</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[user]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    name </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> korbin</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    email </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> korbin</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">zhang</span><span style="color:var(--shiki-token-keyword)">@</span><span style="color:var(--shiki-foreground)">outlook</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">com</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[includeIf </span><span style="color:var(--shiki-token-string-expression)">&quot;gitdif:~/works/&quot;</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    path </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> ~/</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">gitconfig</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">works</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[includeIf </span><span style="color:var(--shiki-token-string-expression)">&quot;gitdif:~/codes/&quot;</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    path </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> ~/</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">gitconfig</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">codes</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-comment)"># ~/.gitconfig-works</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[user]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    name </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> Works</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    email </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> works</span><span style="color:var(--shiki-token-keyword)">@</span><span style="color:var(--shiki-foreground)">outlook</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">com</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-comment)"># ~/.gitconfig-codes</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">[user]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    name </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> Codes</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    email </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> codes</span><span style="color:var(--shiki-token-keyword)">@</span><span style="color:var(--shiki-foreground)">outlook</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">com</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[腾讯云自动申请域名证书]]></title>
        <id>/blog/2024/dnspod-acme</id>
        <link href="https://www.vhcffh.com/blog/2024/dnspod-acme"/>
        <updated>2024-07-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了使用acme.sh和DNSPod API为腾讯云域名自动申请和续签SSL证书的方法。内容涵盖安装acme.sh、获取并配置DNSPod密钥、通过DNS方式签发泛域名证书，以及最后将证书安装到Nginx并配置自动重载的完整流程。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="腾讯云自动申请域名证书"><a href="#腾讯云自动申请域名证书" class="rp-header-anchor rp-link" aria-hidden="true">#</a>腾讯云自动申请域名证书<!-- --> </h1>
<h2 class="rp-toc-include" id="安装-acmesh"><a href="#安装-acmesh" class="rp-header-anchor rp-link" aria-hidden="true">#</a>安装 acme.sh</h2>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">curl</span><span style="color:var(--shiki-token-string)"> https://get.acme.sh</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sh</span><span style="color:var(--shiki-token-string)"> -s</span><span style="color:var(--shiki-token-string)"> email=my@example.com</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>会将 acme.sh 下载到 <code>~/.acme.sh/</code> 中，并且创建一个定时任务：</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-comment)"># crontab -l</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">16</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-string)"> *</span><span style="color:var(--shiki-token-string)"> *</span><span style="color:var(--shiki-token-string)"> *</span><span style="color:var(--shiki-token-string-expression)"> &quot;/root/.acme.sh&quot;</span><span style="color:var(--shiki-token-string)">/acme.sh</span><span style="color:var(--shiki-token-string)"> --cron</span><span style="color:var(--shiki-token-string)"> --home</span><span style="color:var(--shiki-token-string-expression)"> &quot;/root/.acme.sh&quot;</span><span style="color:var(--shiki-token-keyword)"> &gt;</span><span style="color:var(--shiki-token-string)"> /dev/null</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="申请证书"><a href="#申请证书" class="rp-header-anchor rp-link" aria-hidden="true">#</a>申请证书</h2>
<p>通过配置 DNS 的方式可以申请泛域名</p>
<p>在 dnspod 控制台： 我的账号 -&gt; API 密钥 -&gt; DNSPod Token -&gt; 创建密钥</p>
<p>配置环境变量，配置创建的密钥</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-foreground)"> DP_Id</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;**********&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">export</span><span style="color:var(--shiki-foreground)"> DP_Key</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;****************&quot;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>申请证书，大概 1 分钟左右，脚本会通过 DNSPod 添加 DNS TXT 记录（申请完成后会自动删除），用于验证域名</p>
<p>并且配置的密钥，会保存起来，用于自动更新</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">acme.sh</span><span style="color:var(--shiki-token-string)"> --issue</span><span style="color:var(--shiki-token-string)"> --dns</span><span style="color:var(--shiki-token-string)"> dns_dp</span><span style="color:var(--shiki-token-string)"> -d</span><span style="color:var(--shiki-token-string)"> example.com</span><span style="color:var(--shiki-token-string)"> -d</span><span style="color:var(--shiki-token-string)"> *.example.com</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 更新证书的命令</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># acme.sh --renew --dns dns_dp -d example.com -d *.example.com</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 查看证书的命令</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># acme.sh --list</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="安装证书"><a href="#安装证书" class="rp-header-anchor rp-link" aria-hidden="true">#</a>安装证书</h2>
<p>acme.sh 会将证书放到指定路径，并重启 nginx</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">acme.sh</span><span style="color:var(--shiki-token-string)"> --install-cert</span><span style="color:var(--shiki-token-string)"> -d</span><span style="color:var(--shiki-token-string)"> vhcffh.com</span><span style="color:var(--shiki-foreground)"> \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">--key-file       </span><span style="color:var(--shiki-token-string)">/etc/pki/nginx/private/example.key</span><span style="color:var(--shiki-foreground)">  \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">--fullchain-file </span><span style="color:var(--shiki-token-string)">/etc/pki/nginx/example.crt</span><span style="color:var(--shiki-foreground)"> \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">--reloadcmd     </span><span style="color:var(--shiki-token-string-expression)">&quot;service nginx force-reload&quot;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>在 nginx 中配置</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">    ssl_certificate</span><span style="color:var(--shiki-token-string-expression)"> &quot;/etc/pki/nginx/example.crt&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    ssl_certificate_key</span><span style="color:var(--shiki-token-string-expression)"> &quot;/etc/pki/nginx/private/example.key&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    ssl_session_cache</span><span style="color:var(--shiki-token-string)"> shared:SSL:1m</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    ssl_session_timeout</span><span style="color:var(--shiki-token-string)">  10m</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    ssl_ciphers</span><span style="color:var(--shiki-token-string)"> PROFILE=SYSTEM</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    ssl_prefer_server_ciphers</span><span style="color:var(--shiki-token-string)"> on</span><span style="color:var(--shiki-foreground)">;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[FreshRSS 重置密码]]></title>
        <id>/blog/2024/freshrss-reset-password</id>
        <link href="https://www.vhcffh.com/blog/2024/freshrss-reset-password"/>
        <updated>2024-07-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了如何重置FreshRSS的用户密码。由于密码Hash存储在配置文件中，可通过Python的`bcrypt`库生成一个新的Hash值，替换掉`<freshrss-root>/data/users/<user-name>/config.php`文件中的旧`passwordHash`，即可用新密码登录。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="freshrss-重置密码"><a href="#freshrss-重置密码" class="rp-header-anchor rp-link" aria-hidden="true">#</a>FreshRSS 重置密码<!-- --> </h1>
<p>FreshRSS 的用户密码没有存储在数据库中</p>
<p>存储在配置文件 <code>&lt;freshrss-root&gt;/data/users/&lt;user-name&gt;/config.php</code> 中</p>
<div class="rp-codeblock language-php"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="php"><code><span class="line"><span style="color:var(--shiki-token-keyword)">&lt;?</span><span style="color:var(--shiki-foreground)">php</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">return</span><span style="color:var(--shiki-token-function)"> array</span><span style="color:var(--shiki-foreground)"> (</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">...</span></span>
<span class="line"><span style="color:var(--shiki-token-string-expression)">  &#x27;passwordHash&#x27;</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-token-string-expression)"> &#x27;$2a$09$pXJyqN3SxOOGw7YB.0P1M.CCDtEYPhd1by5aVBQSJw5Yvr9mYXIDa&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">...</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><code>passwordHash</code>是通过<code>password_hash</code>函数生成的，不可逆</p>
<p>使用<code>python</code>模块<code>bcrypt</code>生成一个新的密码，替换旧的密码</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-foreground)"> bcrypt</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">bcrypt</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">hashpw</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">b</span><span style="color:var(--shiki-token-string-expression)">&#x27;12345678&#x27;</span><span style="color:var(--shiki-token-punctuation)">,bcrypt.</span><span style="color:var(--shiki-token-function)">gensalt</span><span style="color:var(--shiki-token-punctuation)">())</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># b&#x27;$2b$12$g5tE6HYOqJyea.TbA9jibeem9TItCDItYjqehIefQEpqomr/X0VTq&#x27;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>因为 salt 不同，每次生成的 hash 值也不一样</p>
<p>替换后，用密码 <code>12345678</code> 即可登录，登陆后不要忘了配置新的密码</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[ARM Cortex-M3 基础]]></title>
        <id>/blog/2024/arm-cortex-m3</id>
        <link href="https://www.vhcffh.com/blog/2024/arm-cortex-m3"/>
        <updated>2024-04-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文全面介绍了ARM Cortex-M3处理器的基础知识。内容涵盖其高性能、先进中断处理、低功耗等特性，并详细讲解了寄存器组、操作模式、嵌套向量中断控制器（NVIC）、存储器映射以及可选的MPU等核心概念，为嵌入式开发者提供了系统性的入门指南。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="arm-cortex-m3-基础"><a href="#arm-cortex-m3-基础" class="rp-header-anchor rp-link" aria-hidden="true">#</a>ARM Cortex-M3 基础<!-- --> </h1>
<h2 class="rp-toc-include" id="性能简介"><a href="#性能简介" class="rp-header-anchor rp-link" aria-hidden="true">#</a>性能简介</h2>
<h3 class="rp-toc-include" id="高性能"><a href="#高性能" class="rp-header-anchor rp-link" aria-hidden="true">#</a>高性能</h3>
<ul>
<li>许多指令都是<strong>单周期</strong>的——包括乘法相关指令。并且从整体性能上， Cortex-M3 比得过绝大多数其它的架构。</li>
<li><strong>指令总线和数据总线被分开</strong>，取值和访内可以并行不悖</li>
<li>Thumb-2 的到来<strong>告别了状态切换</strong>的旧世代，再也不需要花时间来切换于 32 位 ARM 状态和 16 位 Thumb 状态之间了。这简化了软件开发和代码维护，使产品面市更快。</li>
<li>Thumb-2 指令集为编程带来了更多的灵活性。许多数据操作现在能用更短的代码搞定，这意味着 Cortex-M3 的<strong>代码密度更高</strong>，也就对存储器的需求更少。</li>
<li>取指都按 32 位处理。同一周期最多可以取出两条指令，留下了更多的带宽给数据传输。</li>
<li>Cortex-M3 的设计允许单片机高频运行（现代半导体制造技术能保证 100MHz 以上的速度）。即使在相同的速度下运行， CM3 的每指令周期数(CPI)也更低，于是同样的 MHz 下可以做更多的工作；另一方面，也使同一个应用在 CM3 上需要更低的主频。</li>
</ul>
<h3 class="rp-toc-include" id="先进的中断处理功能"><a href="#先进的中断处理功能" class="rp-header-anchor rp-link" aria-hidden="true">#</a>先进的中断处理功能</h3>
<ul>
<li>内建的嵌套向量中断控制器支持多达 <strong>240 条外部中断输入</strong>。向量化的中断功能剧烈地缩短了中断延迟，因为不再需要软件去判断中断源。中断的嵌套也是在硬件水平上实现的，不需要软件代码来实现。</li>
<li>Cortex-M3 在进入异常服务例程时，<strong>自动压栈了 R0-R3, R12, LR, PSR 和 PC</strong>，并且在返回时自动弹出它们，这多清爽！既加速了中断的响应，也再不需要汇编语言代码了。</li>
<li>NVIC 支持对每一路中断设置不同的优先级，使得中断管理极富弹性。最粗线条的实现也至少要支持 8 级优先级，而且还能动态地被修改。</li>
<li>优化中断响应还有两招，它们分别是“咬尾中断机制”和“晚到中断机制”。</li>
<li>有些需要较多周期才能执行完的指令，是可以被中断－继续的——就好比它们是一串指令一样。这些指令包括加载多个寄存器（LDM），存储多个寄存器（STM），多个寄存器参与的 PUSH，以及多个寄存器参与的 POP。</li>
<li>除非系统被彻底地锁定， NMI（不可屏蔽中断）会在收到请求的第一时间予以响应。对于很多安全-关键(safety-critical)的应用， NMI 都是必不可少的。</li>
</ul>
<h3 class="rp-toc-include" id="低功耗"><a href="#低功耗" class="rp-header-anchor rp-link" aria-hidden="true">#</a>低功耗</h3>
<ul>
<li>Cortex-M3 需要的逻辑门数少，所以先天就适合低功耗要求的应用（功率低于 0.19mW/MHz）。</li>
<li>在内核水平上支持节能模式（SLEEPING 和 SLEEPDEEP 位）。通过使用“等待中断指令（WFI）”和“等待事件指令（WFE）”，内核可以进入睡眠模式，并且以不同的方式唤醒。另外，模块的时钟是尽可能地分开供应的，所以在睡眠时可以把 CM3 的大多数“官能团”给停掉。</li>
<li>CM3 的设计是全静态的、同步的、可综合的。任何低功耗的或是标准的半导体工艺均可放心饮用。</li>
</ul>
<h3 class="rp-toc-include" id="系统特性"><a href="#系统特性" class="rp-header-anchor rp-link" aria-hidden="true">#</a>系统特性</h3>
<ul>
<li>系统支持“位寻址带”操作（8051 位寻址机制的“威力大幅加强版”），字节不变的大端模式，并且支持非对齐的数据访问。</li>
<li>拥有先进的 fault 处理机制，支持多种类型的异常和 faults，使故障诊断更容易。</li>
<li>通过引入 banked 堆栈指针机制，把系统程序使用的堆栈和用户程序使用的堆栈划清界线。如果再配上可选的 MPU，处理器就能彻底满足对软件健壮性和可靠性有严格要求的应用。</li>
</ul>
<h3 class="rp-toc-include" id="调试支持"><a href="#调试支持" class="rp-header-anchor rp-link" aria-hidden="true">#</a>调试支持</h3>
<ul>
<li>在支持传统的 JTAG 基础上，还支持更新更好的串行线调试接口。</li>
<li>基于 CoreSight 调试解决方案，使得处理器哪怕是在运行时，也能访问处理器状态和存储器内容。</li>
<li>内建了对多达 6 个断点和 4 个数据观察点的支持。</li>
<li>可以选配一个 ETM，用于指令跟踪。数据的跟踪可以使用 DWT</li>
<li>在调试方面还加入了以下的新特性，包括 fault 状态寄存器，新的 fault 异常，以及闪存修补 （patch）操作，使得调试大幅简化。</li>
<li>可选 ITM 模块，测试代码可以通过它输出调试信息，而且“拎包即可入住”般地方便使用。</li>
</ul>
<h2 class="rp-toc-include" id="基于-cortex-m3-的芯片设计"><a href="#基于-cortex-m3-的芯片设计" class="rp-header-anchor rp-link" aria-hidden="true">#</a>基于 Cortex-M3 的芯片设计</h2>
<p>Cortex-M3 处理器内核是芯片的中央处理单元，完整的 MCU 还需要很多其他组件，例如存储，外设，IO 等。芯片设计商得到 CM3 核的授权后，就会把 CM3 用到自己的芯片中，做一些定制化的设计，所以不同的厂商有不同的配置，想了解具体型号的处理器需要查阅厂家提供的文档，比如 stm32，nxp，ti，Freescale。基于 ARM 低成本和高效的处理器设计方案， 得到授权的厂商生产了多种多样的的处理器、 单片机以及片上系统(SoC)。这种商业模式就是所谓的“知识产权授权”。</p>
<p><img src="https://www.vhcffh.com/api/v2/objects/icon/c4qhkpqz7o9jy2312h.png" alt="ARM"/></p>
<h3 class="rp-toc-include" id="arm-发展历史"><a href="#arm-发展历史" class="rp-header-anchor rp-link" aria-hidden="true">#</a>ARM 发展历史</h3>
<p><img src="https://www.vhcffh.com/api/v2/objects/icon/bqfspufqm1jicbx63o.png" alt="ARM处理器架构进化史"/></p>
<p>ARMv7 架构的闪亮登场。在这个版本中，内核架构首次从单一款式变成 3 种款式。</p>
<ul>
<li>ARM-A：设计用于高性能的“开放应用平台”</li>
<li>ARM-R：用于高端的嵌入式系统，尤其是那些带有实时要求的</li>
<li>ARM-M：用于深度嵌入的，单片机风格的系统中</li>
</ul>









































































































































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">处理器名字</th><th style="text-align:left">架构版本号</th><th style="text-align:left">存储器管理特性</th><th style="text-align:left">其它特性</th></tr></thead><tbody><tr><td style="text-align:left">ARM7TDMI</td><td style="text-align:left">v4T</td><td style="text-align:left"></td><td style="text-align:left"></td></tr><tr><td style="text-align:left">ARM7TDMI-S</td><td style="text-align:left">v4T</td><td style="text-align:left"></td><td style="text-align:left"></td></tr><tr><td style="text-align:left">ARM7EJ-S</td><td style="text-align:left">v5E</td><td style="text-align:left"></td><td style="text-align:left">DSP,Jazelle</td></tr><tr><td style="text-align:left">ARM920T</td><td style="text-align:left">v4T</td><td style="text-align:left">MMU</td><td style="text-align:left"></td></tr><tr><td style="text-align:left">ARM922T</td><td style="text-align:left">v4T</td><td style="text-align:left">MMU</td><td style="text-align:left"></td></tr><tr><td style="text-align:left">ARM926EJ-S</td><td style="text-align:left">v5E</td><td style="text-align:left">MMU</td><td style="text-align:left">DSP,Jazelle</td></tr><tr><td style="text-align:left">ARM946E-S</td><td style="text-align:left">v5E</td><td style="text-align:left">MPU</td><td style="text-align:left">DSP</td></tr><tr><td style="text-align:left">ARM966E-S</td><td style="text-align:left">v5E</td><td style="text-align:left"></td><td style="text-align:left">DSP</td></tr><tr><td style="text-align:left">ARM968E-S</td><td style="text-align:left">v5E</td><td style="text-align:left"></td><td style="text-align:left">DMA,DSP</td></tr><tr><td style="text-align:left">ARM966HS</td><td style="text-align:left">v5E</td><td style="text-align:left">MPU（可选）</td><td style="text-align:left">DSP</td></tr><tr><td style="text-align:left">ARM1020E</td><td style="text-align:left">v5E</td><td style="text-align:left">MMU</td><td style="text-align:left">DSP</td></tr><tr><td style="text-align:left">ARM1022E</td><td style="text-align:left">v5E</td><td style="text-align:left">MMU</td><td style="text-align:left">DSP</td></tr><tr><td style="text-align:left">ARM1026EJ-S</td><td style="text-align:left">v5E</td><td style="text-align:left">MMU 或 MPU</td><td style="text-align:left">DSP, Jazelle</td></tr><tr><td style="text-align:left">ARM1136J(F)-S</td><td style="text-align:left">v6</td><td style="text-align:left">MMU</td><td style="text-align:left">DSP, Jazelle</td></tr><tr><td style="text-align:left">ARM1176JZ(F)-S</td><td style="text-align:left">v6</td><td style="text-align:left">MMU+TrustZone</td><td style="text-align:left">DSP, Jazelle</td></tr><tr><td style="text-align:left">ARM11 MPCore</td><td style="text-align:left">v6</td><td style="text-align:left">MMU+多处理器缓存支持</td><td style="text-align:left">DSP</td></tr><tr><td style="text-align:left">ARM1156T2(F)-S</td><td style="text-align:left">v6</td><td style="text-align:left">MPU</td><td style="text-align:left">DSP</td></tr><tr><td style="text-align:left">Cortex-M3</td><td style="text-align:left">v7-M</td><td style="text-align:left">MPU（可选）</td><td style="text-align:left">NVIC</td></tr><tr><td style="text-align:left">Cortex-R4</td><td style="text-align:left">v7-R</td><td style="text-align:left">MPU</td><td style="text-align:left">DSP</td></tr><tr><td style="text-align:left">Cortex-R4F</td><td style="text-align:left">v7-R</td><td style="text-align:left">MPU</td><td style="text-align:left">DSP+浮点运算</td></tr><tr><td style="text-align:left">Cortex-A8</td><td style="text-align:left">v7-A</td><td style="text-align:left">MMU+TrustZone</td><td style="text-align:left">DSP, Jazelle</td></tr></tbody></table></div>
<ol>
<li><strong>DSP（Digital Signal Processor）</strong>：数字信号处理是一种专用的处理器，用于执行数字信号处理任务，如音频处理、图像处理、无线通信等。</li>
<li><strong>MMU（内存管理单元）</strong>：用于管理程序对内存的访问，主要负责将<strong>逻辑地址</strong>（由 CPU 生成）转换为<strong>物理地址</strong>（内存中实际存储的地址），并提供一些额外的功能，例如<strong>内存保护</strong>、<strong>虚拟内存</strong>和<strong>缓存控制</strong>等。</li>
<li><strong>Jazelle</strong>：是 ARM 处理器的硬件 Java 加速器</li>
<li><strong>DMA（Direct Memory Access）</strong>：直接内存访问是一种技术，用于实现数据在外设和内存之间的直接传输，而无需 CPU 的干预。</li>
<li><strong>MPU</strong>：可以把 MPU 认为是 MMU 的功能子集，它只支持分区保护，不支持具有“定位决定性”的虚拟内存机制</li>
<li><strong>TrustZone</strong>：是 ARM 公司提供的一种硬件支持的安全解决方案，旨在提高处理器级别的系统安全性。TrustZone 技术通过将处理器划分为两个独立的安全域（Secure World 和 Normal World）来实现安全隔离。Secure World 是一个受保护的执行环境，用于运行安全敏感的代码和数据，而 Normal World 则是普通的执行环境，用于运行一般的应用程序和操作系统。</li>
</ol>
<h3 class="rp-toc-include" id="m3-架构图"><a href="#m3-架构图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>M3 架构图</h3>
<p>Cortex-M3 是一个 32 位处理器内核。内部的数据路径是 32 位的，寄存器是 32 位的，存储器接口也是 32 位的。 CM3 采用了哈佛结构，拥有独立的指令总线和数据总线，可以让取指与数据访问并行不悖。这样一来数据访问不再占用指令总线，从而提升了性能。Both 小端模式和大端模式都是支持的。</p>
<p><img src="https://www.vhcffh.com/api/v2/objects/icon/cevhrmixr8ojmhs4ym.png" alt="Cortex-M3 的一个简化视图"/></p>
<h2 class="rp-toc-include" id="寄存器组"><a href="#寄存器组" class="rp-header-anchor rp-link" aria-hidden="true">#</a>寄存器组</h2>
<p>Cortex-M3 处理器拥有 R0-R15 的寄存器组。其中 R13 作为堆栈指针 SP。 SP 有两个，但在同一时刻只能有一个可以看到，这也就是所谓的“banked”寄存器。复位后，寄存器默认值不确定。</p>
<p><img src="https://www.vhcffh.com/api/v2/objects/icon/lge9tdl21sklhbezf3.png" alt="寄存器组"/></p>
<h3 class="rp-toc-include" id="r0-r12通用寄存器"><a href="#r0-r12通用寄存器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>R0-R12：通用寄存器</h3>
<p>R0-R12 都是 32 位通用寄存器，用于数据操作。但是注意：绝大多数 16 位 Thumb 指令只能访问 R0-R7，而 32 位 Thumb-2 指令可以访问所有寄存器。</p>
<h3 class="rp-toc-include" id="banked-r13-两个堆栈指针"><a href="#banked-r13-两个堆栈指针" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Banked R13: 两个堆栈指针</h3>
<p>Cortex-M3 拥有两个堆栈指针，然而它们是 banked，因此任一时刻只能使用其中的一个。</p>
<ul>
<li>主堆栈指针（MSP）：复位后缺省使用的堆栈指针，用于操作系统内核以及异常处理例程（包括中断服务例程）</li>
<li>进程堆栈指针（PSP）：由用户的应用程序代码使用。</li>
</ul>
<p>堆栈指针的最低两位永远是 0，这意味着堆栈总是 4 字节对齐的。</p>
<blockquote>
<p>在 ARM 编程领域中，凡是打断程序顺序执行的事件，都被称为异常(exception)。除了外部中断外，当有指令执行了“非法操作”，或者访问被禁的内存区间，因各种错误产生的 fault，以及不可屏蔽中断发生时，都会打断程序的执行，这些情况统称为异常。在不严格的上下文中，异常与中断也可以混用。另外，程序代码也可以主动请求进入异常状态的（常用于系统调用）。</p>
</blockquote>
<h3 class="rp-toc-include" id="r14连接寄存器"><a href="#r14连接寄存器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>R14：连接寄存器</h3>
<p>当呼叫一个子程序时，由 R14 存储返回地址</p>
<blockquote>
<p>不像大多数其它处理器，ARM 为了减少访问内存的次数（访问内存的操作往往要 3 个以上指令周期，带 MMU 和 cache 的就更加不确定了），把返回地址直接存储在寄存器中。这样足以使很多只有 1 级子程序调用的代码无需访问内存（堆栈内存），从而提高了子程序调用的效率。如果多于 1 级，则需要把前一级的 R14 值压到堆栈里。在 ARM 上编程时，应尽量只使用寄存器保存中间结果，迫不得以时才访问内存。在 RISC 处理器中，为了强调访内操作越过了处理器的界线，并且带来了对性能的不利影响，给它取了一个专业的术语：溅出。</p>
</blockquote>
<h3 class="rp-toc-include" id="r15程序计数寄存器"><a href="#r15程序计数寄存器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>R15：程序计数寄存器</h3>
<p>指向当前的程序地址。如果修改它的值，就能改变程序的执行流。</p>
<h3 class="rp-toc-include" id="特殊功能寄存器"><a href="#特殊功能寄存器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>特殊功能寄存器</h3>
<p>Cortex-M3 还在内核水平上搭载了若干特殊功能寄存器，包括</p>
<ul>
<li>程序状态字寄存器组（PSRs）</li>
<li>中断屏蔽寄存器组（PRIMASK, FAULTMASK, BASEPRI）</li>
<li>控制寄存器（CONTROL）</li>
</ul>





























<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">寄存器</th><th style="text-align:left">功能</th></tr></thead><tbody><tr><td style="text-align:left">xPSR</td><td style="text-align:left">记录 ALU 标志（0 标志，进位标志，负数标志，溢出标志），执行状态，以及当前正服务的中断号</td></tr><tr><td style="text-align:left">PRIMASK</td><td style="text-align:left">除能所有的中断——当然了，不可屏蔽中断（NMI）才不甩它呢。</td></tr><tr><td style="text-align:left">FAULTMASK</td><td style="text-align:left">除能所有的 fault——NMI 依然不受影响，而且被除能的 faults 会“上访”。</td></tr><tr><td style="text-align:left">BASEPRI</td><td style="text-align:left">除能所有优先级不高于某个具体数值的中断。</td></tr><tr><td style="text-align:left">CONTROL</td><td style="text-align:left">定义特权状态，并且决定使用哪一个堆栈指针</td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="操作模式和特权级别"><a href="#操作模式和特权级别" class="rp-header-anchor rp-link" aria-hidden="true">#</a>操作模式和特权级别</h2>
<p>特权级和用户级。这可以提供一种存储器访问的保护机制，使得普通的用户程序代码不能意外地，甚至是恶意地执行涉及到要害的操作。处理器支持两种特权级，这也是一个基本的安全模型。在 CM3 运行主应用程序时（线程模式），既可以使用特权级，也可以使用用户级；但是异常服务例程必须在特权级下执行。复位后，处理器默认进入线程模式，特权极访问。在特权级下，程序可以访问所有范围的存储器并且可以执行所有指令。</p>
<p><img src="https://www.vhcffh.com/api/v2/objects/icon/05lgxd5kytc4v4tgl9.png" alt="合法的操作模式转换图"/></p>
<p>在特权级下的程序可以为所欲为，但也可能会把自己给玩进去——切换到用户级。一旦进入用户级，再想回来就得走“法律程序”了——用户级的程序不能简简单单地试图改写 CONTROL 寄存器就回到特权级，它必须先“申诉”：执行一条系统调用指令(SVC)。这会触发 SVC 异常，然后由异常服务例程（通常是操作系统的一部分）接管，如果批准了进入，则异常服务例程修改 CONTROL 寄存器，才能在用户级的线程模式下重新进入特权级。</p>
<p>事实上，从用户级到特权级的唯一途径就是异常：如果在程序执行过程中触发了一个异常，处理器总是先切换入特权级，并且在异常服务例程执行完毕退出时，返回先前的状态。</p>
<h2 class="rp-toc-include" id="嵌套向量中断控制器"><a href="#嵌套向量中断控制器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>嵌套向量中断控制器</h2>
<p>Cortex-M3 在内核水平上搭载了一颗中断控制器——嵌套向量中断控制器 NVIC(Nested Vectored Interrupt Controller)。它与内核有很深的“亲密接触”——与内核是紧耦合的。
NVIC 提供如下的功能：</p>
<ul>
<li>可嵌套中断支持</li>
<li>向量中断支持</li>
<li>动态优先级调整支持</li>
<li>中断延迟大大缩短</li>
<li>中断可屏蔽</li>
</ul>
<h3 class="rp-toc-include" id="可嵌套中断支持"><a href="#可嵌套中断支持" class="rp-header-anchor rp-link" aria-hidden="true">#</a>可嵌套中断支持</h3>
<p>可嵌套中断支持的作用范围很广，覆盖了所有的外部中断和绝大多数系统异常。外在表现是，这些异常都可以被赋予不同的优先级。当前优先级被存储在 xPSR 的专用字段中。当一个异常发生时，硬件会自动比较该异常的优先级是否比当前的异常优先级更高。如果发现来了更高优先级的异常，处理器就会中断当前的中断服务例程（或者是普通程序），而服务新来的异常——即立即抢占。</p>
<h3 class="rp-toc-include" id="向量中断支持"><a href="#向量中断支持" class="rp-header-anchor rp-link" aria-hidden="true">#</a>向量中断支持</h3>
<p>当开始响应一个中断后，CM3 会自动定位一张向量表，并且根据中断号从表中找出 ISR 的入口地址，然后跳转过去执行。不需要像以前的 ARM 那样，由软件来分辨到底是哪个中断发生了，也无需半导体厂商提供私有的中断控制器来完成这种工作。这么一来，中断延迟时间大为缩短。</p>
<h3 class="rp-toc-include" id="动态优先级调整支持"><a href="#动态优先级调整支持" class="rp-header-anchor rp-link" aria-hidden="true">#</a>动态优先级调整支持</h3>
<p>软件可以在运行时期更改中断的优先级。如果在某 ISR 中修改了自己所对应中断的优先级，而且这个中断又有新的实例处于悬起中（pending），也不会自己打断自己，从而没有重入(reentry)。所谓的重入，就是指某段子程序还没有执行完，就因为中断或者是多任务操作系统的调度原因，导致该子程序在一个新的寄存器上下文中被执行（请不要把重入与递归混淆，它们有本质的区别）。这种情况常常会闹出乱子，因此有“可重入性”的研究。</p>
<h3 class="rp-toc-include" id="中断延迟大大缩短"><a href="#中断延迟大大缩短" class="rp-header-anchor rp-link" aria-hidden="true">#</a>中断延迟大大缩短</h3>
<p>Cortex-M3 为了缩短中断延迟，引入了好几个新特性。包括自动的现场保护和恢复，以及其它的措施，用于缩短中断嵌套时的 ISR 间延迟。详情请见后面关于“咬尾中断”和“晚到中断”的讲述。</p>
<blockquote>
<p><strong>咬尾中断</strong>：当处理器在响应某异常时，如果又发生其它异常，但它们优先级不够高，则被阻塞——这个我们已经知道。那么在当前的异常执行返回后，系统处理悬起的异常时，倘若还是先 POP，然后又把 POP 出来的内容 PUSH 回去，这不成了砸锅炼铁再铸锅，白白浪费 CPU 时间吗，可知还有多少紧急的事件悬而未决呀！正因此，CM3 不会傻乎乎地 POP 这些寄存器，而是继续使用上一个异常已经 PUSH 好的成果，消灭了这种铺张浪费。这么一来，看上去好像后一个异常把前一个的尾巴咬掉了，前前后后只执行了一次入栈／出栈操作。</p>
</blockquote>
<blockquote>
<p><strong>晚到中断</strong>：CM3 的中断处理还有另一个机制，它强调了优先级的作用，这就是“晚到的异常处理”。当 CM3 对某异常的响应序列还处在早期：入栈的阶段，尚未执行其服务例程时，如果此时收到了高优先级异常的请求，则本次入栈就成了为高优先级中断所做的了——入栈后，将执行高优先级异常的服务例程。</p>
</blockquote>
<h3 class="rp-toc-include" id="中断可屏蔽"><a href="#中断可屏蔽" class="rp-header-anchor rp-link" aria-hidden="true">#</a>中断可屏蔽</h3>
<p>既可以屏蔽优先级低于某个阈值的中断/异常(设置 BASEPRI 寄存器)，也可以全体封杀(设置 PRIMASK 和 FAULTMASK 寄存器)。这是为了让时间关键（time-critical）的任务能在死线(deadline，或曰最后期限)到来前完成，而不被干扰。</p>
<h2 class="rp-toc-include" id="存储器映射"><a href="#存储器映射" class="rp-header-anchor rp-link" aria-hidden="true">#</a>存储器映射</h2>
<p>总体来说，Cortex-M3 支持 4GB 存储空间：</p>
<p><img src="https://www.vhcffh.com/api/v2/objects/icon/ifi375vwfgf82nyfgq.png" alt="存储器映射"/></p>
<p>从图中可见，不像其它的 ARM 架构，它们的存储器映射由半导体厂家说了算，Cortex-M3 预先定义好了“粗线条的”存储器映射。通过把片上外设的寄存器映射到外设区，就可以简单地以访问内存的方式来访问这些外设的寄存器，从而控制外设的工作。结果，片上外设可以使用 C 语言来操作。这种预定义的映射关系，也使得对访问速度可以做高度的优化，而且对于片上系统的设计而言更易集成。</p>
<p>Cortex-M3 的内部拥有一个总线基础设施，专用于优化对这种存储器结构的使用。在此之上，CM3 甚至还允许这些区域之间“越权使用”。比如说，数据存储器也可以被放到代码区，而且代码也能够在外部 RAM 区中执行（但是会变慢不少）。</p>
<p>处于最高地址的系统级存储区，是 CM3 用于藏“私房钱”的——包括中断控制器、MPU 以及各种调试组件。所有这些设备均使用固定的地址。通过把基础设施的地址定死，就至少在内核水平上，为应用程序的移植扫清了障碍。</p>
<h2 class="rp-toc-include" id="总线接口"><a href="#总线接口" class="rp-header-anchor rp-link" aria-hidden="true">#</a>总线接口</h2>
<p>Cortex-M3 内部有若干个总线接口，以使 CM3 能同时取址和访内（访问内存），它们是：</p>
<ul>
<li>指令存储区总线（两条）</li>
<li>系统总线</li>
<li>私有外设总线</li>
</ul>
<p>有两条<strong>代码存储区总线</strong>负责对代码存储区的访问，分别是<strong>I-Code 总线和 D-Code</strong>总线。前者用于取指，后者用于查表等操作，它们按最佳执行速度进行优化。</p>
<p><strong>系统总线</strong>用于访问内存和外设，覆盖的区域包括 <strong>SRAM</strong>，片上外设，片外 <strong>RAM</strong>，片外扩展设备，以及系统级存储区的部分空间。</p>
<p><strong>私有外设总线</strong>负责一部分私有外设的访问，主要就是访问调试组件。它们也在系统级存储区。</p>
<h2 class="rp-toc-include" id="存储器保护单元mpu"><a href="#存储器保护单元mpu" class="rp-header-anchor rp-link" aria-hidden="true">#</a>存储器保护单元（MPU）</h2>
<p>Cortex-M3 有一个可选的存储器保护单元。配上它之后，就可以对特权级访问和用户级访问分别施加不同的访问限制。当检测到犯规（violated）时，MPU 就会产生一个 fault 异常，可以由 fault 异常的服务例程来分析该错误，并且在可能时改正它。</p>
<p>MPU 有很多玩法。最常见的就是由操作系统使用 MPU，以使特权级代码的数据，包括操作系统本身的数据不被其它用户程序弄坏。MPU 在保护内存时是按区（region）管理的。它可以把某些内存 region 设置成只读，从而避免了那里的内容意外
被更改；还可以在多任务系统中把不同任务之间的数据区隔离。一句话，它会使嵌入式系统变得更加健壮，更加可靠。</p>
<h2 class="rp-toc-include" id="中断和异常"><a href="#中断和异常" class="rp-header-anchor rp-link" aria-hidden="true">#</a>中断和异常</h2>
<p>ARMv7-M 开创了一个全新的异常模型，CM3 采用了它。请你一定要划清界线：这种异常模型跟传统 ARM 处理器使用的完全是两码事。新的异常模型“使能”了非常高效的异常处理。它支持 16-4-1=11 种系统异常（保留了 4+1 个档位），外加 240 个外部中断输入。在 CM3 中取消了 FIQ 的概念（v7 前的 ARM 都有这个 FIQ，快中断请求），这是因为有了更新更好的机制——中断优先级管理以及嵌套中断支持，它们被纳入 CM3 的中断管理逻辑中。因此，支持嵌套中断的系统就更容易实现 FIQ。</p>
<p>CM3 的所有中断机制都由 NVIC 实现。除了支持 240 条中断之外，NVIC 还支持 16-4-1=11 个内部异常源，可以实现 fault 管理机制。结果，CM3 就有了 256 个预定义的异常类型，如表所示。</p>

















































































































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">编号</th><th style="text-align:left">类型</th><th style="text-align:left">优先级</th><th style="text-align:left">简介</th></tr></thead><tbody><tr><td style="text-align:left">0</td><td style="text-align:left">NA</td><td style="text-align:left">NA</td><td style="text-align:left">没有异常在运行</td></tr><tr><td style="text-align:left">1</td><td style="text-align:left">复位</td><td style="text-align:left">-3（最高）</td><td style="text-align:left">复位</td></tr><tr><td style="text-align:left">2</td><td style="text-align:left">NMI</td><td style="text-align:left">-2</td><td style="text-align:left">不可屏蔽中断（来自外部 NMI 输入脚）</td></tr><tr><td style="text-align:left">3</td><td style="text-align:left">硬(hard) fault</td><td style="text-align:left">-1</td><td style="text-align:left">所有被除能的 fault，都将“上访”成硬 fault</td></tr><tr><td style="text-align:left">4</td><td style="text-align:left">MemManage fault</td><td style="text-align:left">可编程</td><td style="text-align:left">存储器管理 fault，MPU 访问犯规以及访问非法位置</td></tr><tr><td style="text-align:left">5</td><td style="text-align:left">总线 fault</td><td style="text-align:left">可编程</td><td style="text-align:left">总线错误（预取流产（Abort）或数据流产）</td></tr><tr><td style="text-align:left">6</td><td style="text-align:left">用法(usage) Fault</td><td style="text-align:left">可编程</td><td style="text-align:left">由于程序错误导致的异常</td></tr><tr><td style="text-align:left">7-10</td><td style="text-align:left">保留</td><td style="text-align:left">NA</td><td style="text-align:left">NA</td></tr><tr><td style="text-align:left">11</td><td style="text-align:left">SVCall</td><td style="text-align:left">可编程</td><td style="text-align:left">系统服务调用</td></tr><tr><td style="text-align:left">12</td><td style="text-align:left">调试监视器</td><td style="text-align:left">可编程</td><td style="text-align:left">调试监视器（断点，数据观察点，或者是外部调试请求</td></tr><tr><td style="text-align:left">13</td><td style="text-align:left">保留</td><td style="text-align:left">NA</td><td style="text-align:left">NA</td></tr><tr><td style="text-align:left">14</td><td style="text-align:left">PendSV</td><td style="text-align:left">可编程</td><td style="text-align:left">为系统设备而设的“可悬挂请求”（pendable request）</td></tr><tr><td style="text-align:left">15</td><td style="text-align:left">SysTick</td><td style="text-align:left">可编程</td><td style="text-align:left">系统滴答定时器（也就是周期性溢出的时基定时器——译注）</td></tr><tr><td style="text-align:left">16</td><td style="text-align:left">IRQ #0</td><td style="text-align:left">可编程</td><td style="text-align:left">外中断#0</td></tr><tr><td style="text-align:left">17</td><td style="text-align:left">IRQ #1</td><td style="text-align:left">可编程</td><td style="text-align:left">外中断#1</td></tr><tr><td style="text-align:left">…</td><td style="text-align:left">…</td><td style="text-align:left">…</td><td style="text-align:left">…</td></tr><tr><td style="text-align:left">255</td><td style="text-align:left">IRQ #239</td><td style="text-align:left">可编程</td><td style="text-align:left">外中断#239</td></tr></tbody></table></div>
<p>虽然 CM3 是支持 240 个外中断的，但具体使用了多少个是由芯片生产商决定。CM3 还有一个 NMI（不可屏蔽中断）输入脚。当它被置为有效（assert）时，NMI 服务例程会无条件地执行。</p>
<h2 class="rp-toc-include" id="调试支持-1"><a href="#调试支持-1" class="rp-header-anchor rp-link" aria-hidden="true">#</a>调试支持</h2>
<p>Cortex-M3 在内核水平上搭载了若干种调试相关的特性。最主要的就是程序执行控制，包括<strong>停机(halting)</strong>、<strong>单步执行(stepping)</strong>、<strong>指令断点</strong>、<strong>数据观察点</strong>、<strong>寄存器</strong>和<strong>存储器访问</strong>、<strong>性能速写（profiling）</strong> 以及各种跟踪机制。</p>
<p>Cortex-M3 的调试系统基于 ARM 最新的 CoreSight 架构。不同于以往的 ARM 处理器，内核本身不再含有 JTAG 接口。取而代之的，是 CPU 提供称为<strong>调试访问接口(DAP)的总线接口。通过这个总线接口，可以访问芯片的</strong>寄存器，也可以访问<strong>系统存储器</strong>，甚至是在内核运行的时候访问！对此总线接口的使用，是由一个调试端口(DP)设备完成的。 调试端口 DPs 不属于 CM3 内核，但它们是在芯片的内部实现的。目前可用的 DPs 包括 <strong>SWJ-DP</strong>(既支持传统的 JTAG 调试，也支持新的串行线调试协议)，另一个 <strong>SW-DP</strong> 则去掉了对 JTAG 的支持。另外，也可以使用 ARM CoreSignt 产品家族的 <strong>JTAG-DP</strong> 模块。这下就有 3 个 DPs 可以选了，芯片制造商可以从中选择一个，以提供具体的调试接口（通常都是选 SWJ-DP）。</p>
<p>此外， CM3 还能挂载一个所谓的 <strong>嵌入式跟踪宏单元（ETM）</strong> 。 ETM 可以不断地发出跟踪信息，这些信息通过一个被称为 <strong>跟踪端口接口单元（TPIU）</strong> 的模块而送到内核的外部，再在芯片外面使用一个<strong>跟踪信息分析仪</strong>，就可以把 TIPU 输出的<strong>已执行指令信息</strong>捕捉到，并且送给调试主机——也就是 PC。所有这些调试组件都可以由 DAP 总线接口来控制， CM3 内核提供 DAP 接口。此外，运行中的程序也能控制它们。所有的跟踪信息都能通过 TPIU 来访问到。</p>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<ol>
<li><a href="https://developer.arm.com/documentation" target="_blank" rel="noopener noreferrer" class="rp-link">ARM documentation</a></li>
<li><a href="https://d1.amobbs.com/bbs_upload782111/files_11/ourdev_418859.pdf" target="_blank" rel="noopener noreferrer" class="rp-link">Cortex-M3 权威指南.Joseph Yiu.著.宋岩.译</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[FreeRTOS 的任务]]></title>
        <id>/blog/2024/freertos-tasks</id>
        <link href="https://www.vhcffh.com/blog/2024/freertos-tasks"/>
        <updated>2024-04-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文深入讲解了FreeRTOS中的任务管理。内容涵盖任务的状态（运行、就绪、阻塞、挂起）、任务优先级，以及其固定优先级、抢占式和时间片轮询的调度策略。此外，还探讨了优先级继承与反转问题，并简述了在多核系统中的调度方式。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="freertos-的任务"><a href="#freertos-的任务" class="rp-header-anchor rp-link" aria-hidden="true">#</a>FreeRTOS 的任务<!-- --> </h1>
<blockquote>
<p>使用 RTOS 的实时应用程序可以被构建为一组独立的任务。每个任务在自己的上下文中执行，不依赖于系统内的其他任务或 RTOS 调度器本身。在任何时间点，应用程序中只能执行一个任务，实时 RTOS 调度器负责决定所要执行的任务。因此， RTOS 调度器可以在应用程序执行时重复启停每个任务（将任务调入或调出）。由于任务不了解 RTOS 调度器活动，因此实时 RTOS 调度器负责确保任务调入时的处理器上下文（寄存器值、堆栈内容等）与任务调出时的处理器上下文完全相同。为实现这一点，每个任务都分配有自己的堆栈。当任务调出时，执行上下文被保存到该任务的堆栈中，以便以后再调入相同的任务时可以准确地恢复其执行上下文。</p>
</blockquote>
<p>简而言之， RTOS 任务的调入与调出就是对<strong>处理器上下文的保存与恢复</strong>。任务调度主要是三个关键词：<strong>固定优先级</strong>，<strong>抢占式</strong>，<strong>时间片轮询</strong>。</p>
<h2 class="rp-toc-include" id="任务状态"><a href="#任务状态" class="rp-header-anchor rp-link" aria-hidden="true">#</a>任务状态</h2>
<ul>
<li>运行
当任务实际执行时，它被称为处于运行状态。任务当前正在使用处理器。如果运行 RTOS 的处理器只有一个内核，那么在任何给定时间内都只能有一个任务处于运行状态。</li>
<li>准备就绪
准备就绪任务指那些能够执行（它们不处于阻塞或挂起状态），但目前没有执行的任务，因为同等或更高优先级的不同任务已经处于运行状态。</li>
<li>阻塞
如果任务当前正在等待时间或外部事件，则该任务被认为处于阻塞状态。 例如，如果一个任务调用<code>vTaskDelay()</code>，它将被阻塞（被置于阻塞状态），直到延迟结束-一个时间事件。 任务也可以通过阻塞来等待<strong>队列</strong>、<strong>信号量</strong>、<strong>事件组</strong>、<strong>通知</strong>等事件。处于阻塞状态的任务通常有一个&quot;超时&quot;期， 超时后任务将被超时，并被解除阻塞，即使该任务所等待的事件没有发生。
阻塞状态下的任务不使用任何处理时间，不能被选择进入运行状态。</li>
<li>挂起
与&quot;阻塞&quot;状态下的任务一样，&quot;挂起&quot;状态下的任务不能被选择进入运行状态，但处于挂起状态的任务没有超时。相反，任务只有在分别通过 <code>vTaskSuspend()</code>和<code>xTaskResume()</code>API 调用明确命令时才会进入或退出挂起状态。</li>
</ul>
<h2 class="rp-toc-include" id="任务优先级"><a href="#任务优先级" class="rp-header-anchor rp-link" aria-hidden="true">#</a>任务优先级</h2>
<p>优先级分配从<code>0</code>到<code>configMAX_PRIORITIES - 1</code>。
数字越小优先级越低。
多个任务可以公用同一个优先级。</p>
<h2 class="rp-toc-include" id="任务调度"><a href="#任务调度" class="rp-header-anchor rp-link" aria-hidden="true">#</a>任务调度</h2>
<h3 class="rp-toc-include" id="单核默认调度"><a href="#单核默认调度" class="rp-header-anchor rp-link" aria-hidden="true">#</a>单核（默认调度）</h3>
<p>FreeRTOS 默认使用<strong>固定优先级</strong>的<strong>抢占式</strong>调度策略，对同等优先级的任务执行<strong>时间片轮询</strong>调度：</p>
<ul>
<li><strong>固定优先级</strong>：指调度器不会永久更改任务的优先级，尽管它可能会因优先级继承而暂时提高任务的优先级。</li>
<li><strong>抢占式</strong>：调度器始终运行优先级最高且可运行的 RTOS 任务，无论任务何时能够运行。</li>
<li><strong>时间片轮询</strong>：调度器会在每个 tick 中断（ RTOS 用来衡量时间的周期性中断）上在同等优先级任务之间进行切换， tick 中断之间的时间构成一个时间片。</li>
</ul>
<p>**<a href="https://www.cnblogs.com/mickey-double/p/14366803.html" target="_blank" rel="noopener noreferrer" class="rp-link">优先级继承</a>**是为了防止优先级反转现象采取的一种优化机制。
如低优先级任务获取了高优先级任务需要的资源，会提升低优先级任务的优先级。</p>
<p>**<a href="https://zhuanlan.zhihu.com/p/32175772" target="_blank" rel="noopener noreferrer" class="rp-link">优先级反转</a>**低优先级任务占据了高优先级任务的资源（信号量等），出现系统一直运行中等优先级任务的一种不合理现象。</p>
<ul>
<li><code>configUSE_PREEMPTION = 0</code>：关闭抢占</li>
<li><code>configUSE_TIME_SLICING = 0</code>：关闭时间片切换</li>
</ul>
<h3 class="rp-toc-include" id="非对称多核amp-调度"><a href="#非对称多核amp-调度" class="rp-header-anchor rp-link" aria-hidden="true">#</a>非对称多核（AMP 调度）</h3>
<blockquote>
<p>每个核心各自运行自己的 FreeRTOS，互不影响。</p>
</blockquote>
<p>使用 FreeRTOS 的非对称多处理 (AMP) 是指多核设备的每个核心都单独运行自己的 FreeRTOS 实例。这些 核心并不都需要具有相同架构，但如果 FreeRTOS 实例之间需要进行通信，则需要共享一些内存。</p>
<p>每个核心都会运行自己的 FreeRTOS 实例， 因此任何给定核心上的调度算法与上文的单核系统调度算法完全相同 。您可以使用流缓冲区或消息缓冲区作为核间通信原语， 这样一来，一个核心上的任务可以进入“阻塞”状态， 以等待另一个核心发来的数据或事件。</p>
<h3 class="rp-toc-include" id="对称多核smp-调度"><a href="#对称多核smp-调度" class="rp-header-anchor rp-link" aria-hidden="true">#</a>对称多核（SMP 调度）</h3>
<blockquote>
<p>由 FreeRTOS 来调度，将不同任务分配到不同的核心。</p>
</blockquote>
<p>使用 FreeRTOS 的对称多处理 (SMP) 是指 一个 FreeRTOS 实例可以跨多个处理器核心调度 RTOS 任务。由于只有一个 FreeRTOS 实例在运行，一次只能使用 FreeRTOS 的一个端口， 因此每个核心必须具有相同的处理器架构并共用相同的内存空间。</p>
<p>FreeRTOS SMP 调度策略使用与单核调度策略相同的算法，但与单核和 AMP 场景不同的是，SMP 在任何给定时间都会导致多个任务处于运行状态 （每个核心上都有一个运行状态的任务）。这意味着，只有缺乏可运行的高优先级任务时，才会运行低优先级任务的假设不再成立。要想了解其中的原因，请考虑一下，若起初只有一个高优先级任务和两个中等优先级任务处于”就绪“状态，SMP 调度器会如何选择在双核微控制器上运行的任务。调度器需要选择两个任务，每个核心对应一个任务。首先，高优先级任务是指可运行的最高优先级任务，因此会选择将它用于第一个核心。这样就剩下了两个中等优先级的任务作为可运行的最高优先级任务，因此会将它们用于第二个核心。结果是高优先级和中等优先级的任务同时运行。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Linux 串口挂载失败]]></title>
        <id>/blog/2023/Linux-uart</id>
        <link href="https://www.vhcffh.com/blog/2023/Linux-uart"/>
        <updated>2023-08-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文解决了在Ubuntu上CH340串口设备无法挂载为`/dev/ttyUSB0`的问题。通过查看系统日志，发现是`brltty`（盲文设备支持）服务占用了USB接口导致冲突。最终，通过卸载`brltty`软件包，成功使串口设备恢复正常挂载。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="linux-串口挂载失败"><a href="#linux-串口挂载失败" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Linux 串口挂载失败<!-- --> </h1>
<p>Ubuntu 插上 CH340 的 usb 转串口后，使用<code>lsmod</code>查看 ch341 驱动正常加载，<code>lsusb</code>也可以看到 usb 已经正常加载，但是没有<code>/dev/ttyUSB0</code></p>
<p>查看系统 log</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>kernel: usb 1-3: new full-speed USB device number 5 using ohci-pci</span></span>
<span class="line"><span>kernel: usb 1-3: New USB device found, idVendor=1a86, idProduct=7523, bcdDevice= 2.64</span></span>
<span class="line"><span>kernel: usb 1-3: New USB device strings: Mfr=0, Product=2, SerialNumber=0</span></span>
<span class="line"><span>kernel: usb 1-3: Product: USB Serial</span></span>
<span class="line"><span>kernel: ch341 1-3:1.0: ch341-uart converter detected</span></span>
<span class="line"><span>kernel: usb 1-3: ch341-uart converter now attached to ttyUSB0</span></span>
<span class="line"><span>mtp-probe[54666]: checking bus 1, device 5: &quot;/sys/devices/pci0000:00/0000:00:06.0/usb1/1-3&quot;</span></span>
<span class="line"><span>mtp-probe[54666]: bus: 1, device: 5 was not an MTP device</span></span>
<span class="line"><span>snapd[766]: udevmon.go:149: udev event error: Unable to parse uevent, err: cannot parse libudev event: invalid env data</span></span>
<span class="line"><span>systemd[1]: Starting Braille Device Support...</span></span>
<span class="line"><span>systemd-udevd[54665]: ttyUSB0: Conflicting device node &#x27;/dev/ttyUSB0&#x27; found, link to &#x27;/dev/ttyUSB0&#x27; will not be created.</span></span>
<span class="line"><span>snapd[766]: hotplug.go:200: hotplug device add event ignored, enable experimental.hotplug</span></span>
<span class="line"><span>brltty[54669]: BRLTTY 6.4 rev BRLTTY-6.4 [https://brltty.app/]</span></span>
<span class="line"><span>brltty[54669]: BRLTTY 6.4 rev BRLTTY-6.4 [https://brltty.app/]</span></span>
<span class="line"><span>brltty[54669]: executing as the invoking user: root</span></span>
<span class="line"><span>brltty[54669]: brltty: executing as the invoking user: root</span></span>
<span class="line"><span>mtp-probe[54678]: checking bus 1, device 5: &quot;/sys/devices/pci0000:00/0000:00:06.0/usb1/1-3&quot;</span></span>
<span class="line"><span>mtp-probe[54678]: bus: 1, device: 5 was not an MTP device</span></span>
<span class="line"><span>snapd[766]: udevmon.go:149: udev event error: Unable to parse uevent, err: cannot parse libudev event: invalid env data</span></span>
<span class="line"><span>brltty[54669]: BrlAPI Server: release 0.8.3</span></span>
<span class="line"><span>brltty[54669]: brltty: BrlAPI Server: release 0.8.3</span></span>
<span class="line"><span>systemd[1]: Started Braille Device Support.</span></span>
<span class="line"><span>brltty[54669]: Linux Screen Driver:</span></span>
<span class="line"><span>brltty[54669]: brltty: Linux Screen Driver:</span></span>
<span class="line"><span>kernel: input: BRLTTY 6.4 Linux Screen Driver Keyboard as /devices/virtual/input/input10</span></span>
<span class="line"><span>brltty[54669]: USB configuration set error 16: 设备或资源忙</span></span>
<span class="line"><span>brltty[54669]: brltty: USB configuration set error 16: 设备或资源忙</span></span>
<span class="line"><span>kernel: usb 1-3: usbfs: interface 0 claimed by ch341 while &#x27;brltty&#x27; sets config #1</span></span>
<span class="line"><span>systemd-logind[768]: Watching system buttons on /dev/input/event8 (BRLTTY 6.4 Linux Screen Driver Keyboard)</span></span>
<span class="line"><span>brltty[54669]: USB interface in use: 0 (ch341)</span></span>
<span class="line"><span>brltty[54669]: brltty: USB interface in use: 0 (ch341)</span></span>
<span class="line"><span>ModemManager[964]: &lt;info&gt;  [base-manager] port ttyUSB0 released by device &#x27;/sys/devices/pci0000:00/0000:00:06.0/usb1/1-3&#x27;</span></span>
<span class="line"><span>kernel: ch341-uart ttyUSB0: ch341-uart converter now disconnected from ttyUSB0</span></span>
<span class="line"><span>kernel: ch341 1-3:1.0: device disconnected</span></span>
<span class="line"><span>ModemManager[964]: &lt;info&gt;  [base-manager] couldn&#x27;t check support for device &#x27;/sys/devices/pci0000:00/0000:00:06.0/usb1/1-3&#x27;: Operation was cancelled</span></span>
<span class="line"><span>brltty[54669]: NoSpeech Speech Driver:</span></span>
<span class="line"><span>brltty[54669]: brltty: NoSpeech Speech Driver:</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>像是程序 brltty 占用了 usb，卸载 brltty 后恢复正常</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://forum.mysensors.org/topic/8871/unable-to-connect-to-dev-ttyusb0-solved" target="_blank" rel="noopener noreferrer" class="rp-link">Unable to connect to /dev/ttyUSB0 [Solved] | MySensors Forum</a></li>
<li><a href="https://askubuntu.com/questions/1403705/dev-ttyusb0-not-present-in-ubuntu-22-04" target="_blank" rel="noopener noreferrer" class="rp-link">drivers - /dev/ttyUSB0 not present in Ubuntu 22.04 - Ask Ubuntu</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[SNR 与 EVM 的关系]]></title>
        <id>/blog/2023/snr-evm</id>
        <link href="https://www.vhcffh.com/blog/2023/snr-evm"/>
        <updated>2023-08-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文探讨了信噪比（SNR）与误差向量幅度（EVM）之间的关系。文章从对数、dB、dBm等基础概念入手，详细解释了SNR和EVM的定义与计算公式，并最终推导出在信噪比较大时`SNR ≈ -20lg(EVM)`的近似关系，为理解无线信号质量提供了理论依据。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="snr-与-evm-的关系"><a href="#snr-与-evm-的关系" class="rp-header-anchor rp-link" aria-hidden="true">#</a>SNR 与 EVM 的关系<!-- --> </h1>
<h2 class="rp-toc-include" id="关系"><a href="#关系" class="rp-header-anchor rp-link" aria-hidden="true">#</a>关系</h2>
<p>当 SNR 较大（大于 10dB）时，<strong>SNR=-20lg(EVM)</strong>，其中 SNR 的单位为 dB，EVM 为正实数。</p>
<p>如果 EVM 用 dB 表示，可以简化为<strong>SNR = -2*EVM_dB</strong>。(此式在 SNR 大于 4dB 时，误差较小，不超过 1dB)</p>
<p>下面依次介绍 log、dB、dBm、evm、snr 的概念，再说明此结论的推导过程。</p>
<h2 class="rp-toc-include" id="对数公式"><a href="#对数公式" class="rp-header-anchor rp-link" aria-hidden="true">#</a>对数公式</h2>
<p>如果 a^b=N(a&gt;0,且 a≠1，则 b 叫做以 a 为底 N 的对数，公式如下，其中 a 叫做底数，N 叫做真数， b 叫对数。</p>
<p><img alt="对数" src="/static/image/index.62e06bb861.png"/></p>
<p>通常我们将以 10 为底的对数叫常用对数，以 e 为底的对数叫自然对数。</p>
<p>常用对数：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi><mi>g</mi><mo stretchy="false">(</mo><mi>b</mi><mo stretchy="false">)</mo><mo>=</mo><mi>l</mi><mi>o</mi><mi>g</mi><mi mathvariant="normal">_</mi><mn>10</mn><mo stretchy="false">(</mo><mi>b</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">lg(b) = log\_{10}(b)</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.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</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">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.06em;vertical-align:-0.31em"></span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mord" style="margin-right:0.02778em">_</span><span class="mord"><span class="mord">10</span></span><span class="mopen">(</span><span class="mord mathnormal">b</span><span class="mclose">)</span></span></span></span> (10 为底数)。</p>
<p>自然对数：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi><mi>n</mi><mo stretchy="false">(</mo><mi>b</mi><mo stretchy="false">)</mo><mo>=</mo><mi>l</mi><mi>o</mi><mi>g</mi><mi mathvariant="normal">_</mi><mi>e</mi><mo stretchy="false">(</mo><mi>b</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">ln(b) = log\_{e}(b)</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.01968em">l</span><span class="mord mathnormal">n</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">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:1.06em;vertical-align:-0.31em"></span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mord" style="margin-right:0.02778em">_</span><span class="mord"><span class="mord mathnormal">e</span></span><span class="mopen">(</span><span class="mord mathnormal">b</span><span class="mclose">)</span></span></span></span> (e 为对数)。</p>
<p>对数的基本性质中，下面的结论经常用到：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.16em" columnalign="left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>l</mi><mi>o</mi><msub><mi>g</mi><mi>a</mi></msub><msup><mi>M</mi><mi>n</mi></msup><mo>=</mo><mi>n</mi><mi>l</mi><mi>o</mi><msub><mi>g</mi><mi>a</mi></msub><mi>M</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>l</mi><mi>g</mi><mn>10</mn><mo>=</mo><mn>1</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>l</mi><mi>g</mi><mn>2</mn><mo>≈</mo><mn>0.3</mn></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>l</mi><mi>g</mi><mn>1</mn><mo>=</mo><mn>0</mn></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{array}{l}
log_{a}M^n = nlog_{a}M \cr
lg10 = 1 \cr
lg2 \approx 0.3 \cr
lg1 = 0
\end{array}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:4.8em;vertical-align:-2.15em"></span><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em"><span style="top:-4.81em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal">o</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">g</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.0359em;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">a</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.10903em">M</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.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal">o</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">g</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.0359em;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">a</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 mathnormal" style="margin-right:0.10903em">M</span></span></span><span style="top:-3.61em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</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 class="mord">1</span></span></span><span style="top:-2.41em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord">0.3</span></span></span><span style="top:-1.21em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</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 class="mord">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="信号强度"><a href="#信号强度" class="rp-header-anchor rp-link" aria-hidden="true">#</a>信号强度</h2>
<p>日常中通常使用功率来衡量一个电器做功的快慢，如一个 10W 的电灯泡，10W 功率就是电灯泡消耗能量做功的快慢。</p>
<p>在天线收发系统里，同样也需要消耗电能来转换为电磁波的能量进行传输。</p>
<p>但是电磁波的能量衰减非常快，例如一个 100mW 的能量源，传输一段距离后很快就能衰减成 1mW、0.1mW、0.01mW 甚至更小。</p>
<p>对于这种呈几何数量级的衰减，使用功率来衡量会给计数带来不便，因此引用新的概念：dB 和 dBm。</p>
<h3 class="rp-toc-include" id="db-介绍"><a href="#db-介绍" class="rp-header-anchor rp-link" aria-hidden="true">#</a>dB 介绍</h3>
<p>dB 是一个表征相对值的值，纯粹的比值，只表示<strong>两个量的相对大小关系，没有单位</strong>。公式为 dB=10lg(A/B)，<strong>一般作为（SNR）信噪比、损耗的单位</strong>。</p>
<p>当考虑甲的功率相比于乙功率大或小多少个 dB 时，按下面的计算公式：10log（甲功率/乙功率）。</p>
<p>例如 A 的功率为 100mW，B 的功率为 10mW，则 10lg（100 / 10） = 10dB，说明 A 比 B 大 10dB。</p>
<blockquote>
<p>例：如何理解：+3 dB 表示增大为两倍，-3 dB 表示下降为 1/2。
如果 A 的功率开始为 100mW，经过衰减变成了 50mw，则 10lg（50 / 100） = 10lg（1/ 2） = -10lg（2）= -3dB。
如果 A 的功率开始为 100mW，经过放大变成了 200mw，则 10lg（200 / 100） = 10lg（2） = 3dB。</p>
</blockquote>
<h3 class="rp-toc-include" id="dbm-介绍"><a href="#dbm-介绍" class="rp-header-anchor rp-link" aria-hidden="true">#</a>dBm 介绍</h3>
<p>dBm 是一个表示功率绝对值（可以认为是以 1mW 功率为基准的一个比值），计算公式为：10log（功率值/1mw）。</p>
<p>记住一个口诀： 加 3 乘 2， 加 10 乘 10； 减 3 除 2，减 10 除 10 （+3 dB，表示功率增加为 2 倍；+10 dB，表示功率增加为 10 倍。-3 dB，表示功率减小为 1/2；-10 dB，表示功率减小为 1/10）。</p>
<blockquote>
<p>例：功率 P 为 1mw，折算为 dBm 后为 0dBm。
40W 的功率，按 dBm 单位进行折算后的值应为：
10log（40W/1mw)=10log（40000）= 46dBm。 按口决： 40W = 1w _ (( 10 _ 10 _ 10)W _ 10 _ 2 _ 2) =&gt; 10 + 10 + 10 + 10 + 3 + 3 = 46dBm
那么 44dBm 是多少 W？ (25W)</p>
</blockquote>
<p>需要注意的是，对于功率的增益，我们用 10lg（Po/Pi），而对于电压和电流的增益，要用 20lg（Vo/Vi）、20lg（Io/Ii）。</p>
<p>原因是 这个 2 来源于电功率转换公式的平方上：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>P</mi><mo>=</mo><mi>U</mi><mi>I</mi><mo>=</mo><msup><mi>I</mi><mn>2</mn></msup><mi>R</mi><mo>=</mo><mfrac><msup><mi>U</mi><mn>2</mn></msup><mi>R</mi></mfrac></mrow><annotation encoding="application/x-tex">P = UI = I^2R = \frac {U^2} {R}
</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">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.6833em"></span><span class="mord mathnormal" style="margin-right:0.10903em">U</span><span class="mord mathnormal" style="margin-right:0.07847em">I</span><span 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.8641em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em">I</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">2</span></span></span></span></span></span></span></span><span class="mord mathnormal" style="margin-right:0.00773em">R</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:2.1771em;vertical-align:-0.686em"></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.4911em"><span style="top:-2.314em"><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.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em">U</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">2</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.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="snr-和-evm"><a href="#snr-和-evm" class="rp-header-anchor rp-link" aria-hidden="true">#</a>SNR 和 EVM</h2>
<h3 class="rp-toc-include" id="snr-介绍"><a href="#snr-介绍" class="rp-header-anchor rp-link" aria-hidden="true">#</a>SNR 介绍</h3>
<p>信噪比 SNR（Signal-to-noise Ratio），指的是系统中信号与噪声的比。公式为 SNR = 10lg（Ps / Pn），其中：</p>
<ul>
<li>SNR：信噪比，单位是 dB。</li>
<li>Ps：信号的有效功率。</li>
<li>Pn：噪声的有效功率。</li>
</ul>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mi>S</mi><mi>N</mi><mi>R</mi><mo stretchy="false">(</mo><mi>d</mi><mi>B</mi><mo stretchy="false">)</mo><mo>=</mo><mn>10</mn><mo>∗</mo><mi>l</mi><mi>g</mi><mfrac><mrow><mo>∫</mo><mi>s</mi><mo stretchy="false">(</mo><mi>t</mi><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow><mrow><mo>∫</mo><mi>n</mi><mo stretchy="false">(</mo><mi>t</mi><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow></mfrac><mo>=</mo><mn>10</mn><mo>∗</mo><mi>l</mi><mi>g</mi><mfrac><mrow><mo>∫</mo><mi>s</mi><mo stretchy="false">(</mo><mi>t</mi><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow><mrow><mo>∫</mo><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo>−</mo><mi>s</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow></mfrac></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(1)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">SNR(dB) = 10 *lg \frac {\int s(t)^2 \mathrm{d}t} {\int n(t)^2 \mathrm{d}t} =
10 * lg \frac {\int s(t)^2 \mathrm{d}t} {\int (x(t)-s(t))^2 \mathrm{d}t}\tag{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.00773em">SNR</span><span class="mopen">(</span><span class="mord mathnormal">d</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.6444em"></span><span class="mord">10</span><span 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:2.5113em;vertical-align:-1.0011em"></span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</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.5102em"><span style="top:-2.305em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mop op-symbol small-op" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">n</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.989em;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></span></span></span><span class="mord mathrm">d</span><span class="mord mathnormal">t</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.6961em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mop op-symbol small-op" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">s</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose"><span class="mclose">)</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">2</span></span></span></span></span></span></span></span><span class="mord mathrm">d</span><span class="mord mathnormal">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.0011em"><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">10</span><span 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:2.5113em;vertical-align:-1.0011em"></span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</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.5102em"><span style="top:-2.305em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mop op-symbol small-op" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mopen">(</span><span class="mord mathnormal">t</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 class="mord mathnormal">s</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.989em;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></span></span></span><span class="mord mathrm">d</span><span class="mord mathnormal">t</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.6961em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mop op-symbol small-op" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">s</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose"><span class="mclose">)</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">2</span></span></span></span></span></span></span></span><span class="mord mathrm">d</span><span class="mord mathnormal">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.0011em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span><span class="tag"><span class="strut" style="height:2.5113em;vertical-align:-1.0011em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">1</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>式中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x(t)</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">x</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span></span></span></span> 为矢量 reference signal，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">s(t)</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">s</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span></span></span></span> 为矢量输入信号。</p>
<h3 class="rp-toc-include" id="evm-介绍"><a href="#evm-介绍" class="rp-header-anchor rp-link" aria-hidden="true">#</a>EVM 介绍</h3>
<p><img alt="EVM" src="/static/image/EVM.0766ad39cf.png"/></p>
<p>QAM 调制信号通常用其 EVM 来衡量信号质量，EVM 是英文 Error Vector Magnitude 缩写，意为误差向量幅度。</p>
<p>误差矢量 Error Vector 的幅度与参考信号 Reference Signal 幅度的比值。通常测量的 EVM 为其 RMS 值（Root Mean Square 均方根），计算公式如：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mi>E</mi><mi>V</mi><mi>M</mi><mo>=</mo><msqrt><mfrac><mrow><mo>∫</mo><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo>−</mo><mi>s</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow><mrow><mo>∫</mo><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow></mfrac></msqrt></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(2)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">EVM=\sqrt {\frac {\int (x(t)-s(t))^2 \mathrm{d}t} {\int x(t)^2 \mathrm{d}t}}\tag{2}
</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.05764em">E</span><span class="mord mathnormal" style="margin-right:0.22222em">V</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:3.04em;vertical-align:-1.1561em"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8839em"><span class="svg-align" style="top:-5em"><span class="pstrut" style="height:5em"></span><span class="mord" style="padding-left:1em"><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.5011em"><span style="top:-2.305em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mop op-symbol small-op" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">x</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.989em;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></span></span></span><span class="mord mathrm">d</span><span class="mord mathnormal">t</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.6961em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mop op-symbol small-op" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mopen">(</span><span class="mord mathnormal">t</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 class="mord mathnormal">s</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.989em;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></span></span></span><span class="mord mathrm">d</span><span class="mord mathnormal">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.0011em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-3.8439em"><span class="pstrut" style="height:5em"></span><span class="hide-tail" style="min-width:1.02em;height:3.08em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="3.08em" viewBox="0 0 400000 3240" preserveAspectRatio="xMinYMin slice"><path d="M473,2793
c339.3,-1799.3,509.3,-2700,510,-2702 l0 -0
c3.3,-7.3,9.3,-11,18,-11 H400000v40H1017.7
s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9
c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200
c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26
s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,
606zM1001 80h400000v40H1017.7z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1561em"><span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:3.04em;vertical-align:-1.1561em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">2</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>式中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x(t)</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">x</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span></span></span></span> 为矢量 reference signal，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">s(t)</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">s</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span></span></span></span> 为矢量输入信号。</p>
<p>大多时候，EVM 用 dB 表示:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>E</mi><mi>V</mi><msub><mi>M</mi><mrow><mi>d</mi><mi>B</mi></mrow></msub><mo>=</mo><mn>10</mn><mo>∗</mo><mi>l</mi><mi>g</mi><mrow><mi>E</mi><mi>V</mi><mi>M</mi></mrow></mrow><annotation encoding="application/x-tex">EVM_{dB} = 10*lg{EVM}
</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.05764em">E</span><span class="mord mathnormal" style="margin-right:0.22222em">V</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.3361em"><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 mathnormal mtight">d</span><span class="mord mathnormal mtight" style="margin-right:0.05017em">B</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">10</span><span 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.8889em;vertical-align:-0.1944em"></span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em">E</span><span class="mord mathnormal" style="margin-right:0.22222em">V</span><span class="mord mathnormal" style="margin-right:0.10903em">M</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="snr-与-evm-关系"><a href="#snr-与-evm-关系" class="rp-header-anchor rp-link" aria-hidden="true">#</a>SNR 与 EVM 关系</h3>
<p>从（1）式 和（2）式可以看出：当矢量输入信号<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>s</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">s(t)</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">s</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span></span></span></span>越接近于矢量reference signal <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x(t)</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">x</span><span class="mopen">(</span><span class="mord mathnormal">t</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>s</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">s(t)</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">s</span><span class="mopen">(</span><span class="mord mathnormal">t</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>x</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">x(t)</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">x</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mclose">)</span></span></span></span>代替，推导如下：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.16em" columnalign="left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>S</mi><mi>N</mi><mi>R</mi><mo stretchy="false">(</mo><mi>d</mi><mi>B</mi><mo stretchy="false">)</mo><mo>=</mo><mn>10</mn><mo>∗</mo><mi>l</mi><mi>g</mi><mfrac><mrow><mo>∫</mo><mi>s</mi><mo stretchy="false">(</mo><mi>t</mi><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow><mrow><mo>∫</mo><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo>−</mo><mi>s</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>≈</mo><mn>10</mn><mo>∗</mo><mi>l</mi><mi>g</mi><mfrac><mrow><mo>∫</mo><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow><mrow><mo>∫</mo><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo>−</mo><mi>s</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>=</mo><mo>−</mo><mn>1</mn><mo>∗</mo><mn>10</mn><mo>∗</mo><mi>l</mi><mi>g</mi><mfrac><mrow><mo>∫</mo><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><mo>−</mo><mi>s</mi><mo stretchy="false">(</mo><mi>t</mi><mo stretchy="false">)</mo><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow><mrow><mo>∫</mo><mi>x</mi><mo stretchy="false">(</mo><mi>t</mi><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mi mathvariant="normal">d</mi><mi>t</mi></mrow></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>=</mo><mo>−</mo><mn>10</mn><mo>∗</mo><mi>l</mi><mi>g</mi><mo stretchy="false">(</mo><msup><mrow><mi>E</mi><mi>V</mi><mi>M</mi></mrow><mn>2</mn></msup><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>=</mo><mo>−</mo><mn>2</mn><mo>∗</mo><mn>10</mn><mo>∗</mo><mi>l</mi><mi>g</mi><mo stretchy="false">(</mo><mi>E</mi><mi>V</mi><mi>M</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><mn>2</mn><mi>E</mi><mi>V</mi><msub><mi>M</mi><mrow><mi>d</mi><mi>B</mi></mrow></msub></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{array}{l}
SNR(dB) = 10 * lg \frac {\int s(t)^2 \mathrm{d}t} {\int (x(t)-s(t))^2 \mathrm{d}t} \cr
\approx 10 * lg \frac {\int x(t)^2 \mathrm{d}t} {\int (x(t)-s(t))^2 \mathrm{d}t} \cr
= -1 * 10 * lg \frac {\int (x(t)-s(t))^2 \mathrm{d}t} {\int x(t)^2 \mathrm{d}t} \cr
= -10 * lg({EVM}^2) \cr
=-2 * 10 * lg(EVM)
=-2EVM_{dB}
\end{array}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:7.6553em;vertical-align:-3.5777em"></span><span class="mord"><span class="mtable"><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4.0777em"><span style="top:-6.0777em"><span class="pstrut" style="height:3.1482em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em">SNR</span><span class="mopen">(</span><span class="mord mathnormal">d</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 class="mord">10</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.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</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.1482em"><span style="top:-2.6265em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop op-symbol small-op mtight" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">x</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight">)</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">s</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight">)</span><span class="mclose mtight"><span class="mclose mtight">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7463em"><span style="top:-2.786em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord mathrm mtight">d</span><span class="mord mathnormal mtight">t</span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.5243em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop op-symbol small-op mtight" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mspace mtight" style="margin-right:0.1952em"></span><span class="mord mathnormal mtight">s</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight"><span class="mclose mtight">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em"><span style="top:-2.931em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord mathrm mtight">d</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.5878em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-4.3417em"><span class="pstrut" style="height:3.1482em"></span><span class="mord"><span class="mrel">≈</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord">10</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.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</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.1482em"><span style="top:-2.6265em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop op-symbol small-op mtight" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">x</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight">)</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">s</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight">)</span><span class="mclose mtight"><span class="mclose mtight">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7463em"><span style="top:-2.786em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord mathrm mtight">d</span><span class="mord mathnormal mtight">t</span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.5243em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop op-symbol small-op mtight" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mspace mtight" style="margin-right:0.1952em"></span><span class="mord mathnormal mtight">x</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight"><span class="mclose mtight">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em"><span style="top:-2.931em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord mathrm mtight">d</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.5878em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-2.6057em"><span class="pstrut" style="height:3.1482em"></span><span class="mord"><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord">−</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 class="mord">10</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.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</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.1482em"><span style="top:-2.6265em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop op-symbol small-op mtight" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mspace mtight" style="margin-right:0.1952em"></span><span class="mord mathnormal mtight">x</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight"><span class="mclose mtight">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7463em"><span style="top:-2.786em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord mathrm mtight">d</span><span class="mord mathnormal mtight">t</span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.5243em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mop op-symbol small-op mtight" style="margin-right:0.19445em;position:relative;top:-0.0006em">∫</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">x</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight">)</span><span class="mbin mtight">−</span><span class="mord mathnormal mtight">s</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight">)</span><span class="mclose mtight"><span class="mclose mtight">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em"><span style="top:-2.931em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mord mathrm mtight">d</span><span class="mord mathnormal mtight">t</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.5878em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-1.1306em"><span class="pstrut" style="height:3.1482em"></span><span class="mord"><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord">−</span><span class="mord">10</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.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mopen">(</span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em">E</span><span class="mord mathnormal" style="margin-right:0.22222em">V</span><span class="mord mathnormal" style="margin-right:0.10903em">M</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8873em"><span style="top:-3.1362em;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></span></span></span><span class="mclose">)</span></span></span><span style="top:0.0694em"><span class="pstrut" style="height:3.1482em"></span><span class="mord"><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord">−</span><span class="mord">2</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">10</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.01968em">l</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05764em">E</span><span class="mord mathnormal" style="margin-right:0.22222em">V</span><span class="mord mathnormal" style="margin-right:0.10903em">M</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 class="mord">−</span><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.05764em">E</span><span class="mord mathnormal" style="margin-right:0.22222em">V</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.3361em"><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 mathnormal mtight">d</span><span class="mord mathnormal mtight" style="margin-right:0.05017em">B</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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.5777em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C 语言必备知识]]></title>
        <id>/blog/2023/Everything-I-wish-I-knew-when-learning-C</id>
        <link href="https://www.vhcffh.com/blog/2023/Everything-I-wish-I-knew-when-learning-C"/>
        <updated>2023-07-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文总结了学习C语言时应掌握的关键知识。内容涵盖编译链接、头文件、重要编译选项、三类内存（栈、堆、静态区）的使用、命名习惯、`static`与`const`关键字，以及平台API和整数类型的注意事项，为C语言初学者提供了全面的实践指南。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="c-语言必备知识"><a href="#c-语言必备知识" class="rp-header-anchor rp-link" aria-hidden="true">#</a>C 语言必备知识<!-- --> </h1>
<p>学习 C 语言相当困难。不是因为 C 语言难学，而是因为用 C 编程需要知道很多其它类型的知识。例如</p>
<ul>
<li>C 语言没有消除平台或操作系统差异的环境；你也需要了解你的平台。</li>
<li>有许多 C 语言编译器选项和构建工具，即使是运行一个简单的程序也要做出许多决定。</li>
<li>有一些与 CPU、操作系统、一般的编译代码有关的重要概念</li>
<li>与其他语言相比，C 语言的使用方式多种多样，所以集中的&quot;社区&quot;或风格要少得多。</li>
</ul>
<h2 class="rp-toc-include" id="有用的资源"><a href="#有用的资源" class="rp-header-anchor rp-link" aria-hidden="true">#</a>有用的资源</h2>
<ul>
<li><a href="https://www.tutorialspoint.com/cprogramming/index.htm" target="_blank" rel="noopener noreferrer" class="rp-link">TutorialsPoint C</a>：基础的介绍</li>
<li><a href="https://github.com/oz123/awesome-c" target="_blank" rel="noopener noreferrer" class="rp-link">awesome-c</a>：一些有用的库和工具</li>
<li><a href="https://en.cppreference.com/w/c" target="_blank" rel="noopener noreferrer" class="rp-link">cppreference</a>：C 语言和标准库的技术参考</li>
</ul>
<h2 class="rp-toc-include" id="可以学习的好项目"><a href="#可以学习的好项目" class="rp-header-anchor rp-link" aria-hidden="true">#</a>可以学习的好项目</h2>
<p>学习一些小的，只包含 C 语言的项目是很有用的：</p>
<ul>
<li><a href="https://github.com/whymirror/bloopsaphone/blob/tree/master/c" target="_blank" rel="noopener noreferrer" class="rp-link">Bloopsaphone</a>：一个用于合成声音的 Ruby 库，它的核心是一个小型的 C 模块。有少量的概念和良好的结构。</li>
<li><a href="https://github.com/antirez/sds" target="_blank" rel="noopener noreferrer" class="rp-link">Simple Dynamic Strings (sds)</a>：一个很好的例子，只有一个.c 和.h 文件，就能实现复杂的资源管理。</li>
<li><a href="https://github.com/tmewett/BrogueCE" target="_blank" rel="noopener noreferrer" class="rp-link">Brogue CE</a>：一个 roguelinke 的视频游戏，很大单并不完美，有 30k+行，贡献它可以很好的磨砺你的 C 语言。</li>
<li><a href="https://github.com/nothings/stb" target="_blank" rel="noopener noreferrer" class="rp-link">stb single-file libraries</a>：这些是中小型的模块，旨在高度便携，包括针对嵌入式设备和游戏机。</li>
</ul>
<h2 class="rp-toc-include" id="编译链接头文件和符号表"><a href="#编译链接头文件和符号表" class="rp-header-anchor rp-link" aria-hidden="true">#</a>编译，链接，头文件和符号表</h2>
<p>这是一些关于编译 C 语言的一些基础知识，这对理解其它事情很有帮助。</p>
<p>C 代码是写在.c 源文件中的。每个源文件都被编译成一个.o 对象文件，它就像是.c 文件中编译后的功能代码的容器。它们是不可执行的。对象文件内部有一个符号表，是该文件中定义的全局函数和变量的名称。</p>
<div class="rp-codeblock language-sh"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="sh"><code><span class="line"><span style="color:var(--shiki-token-comment)"># compile to objects</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">cc</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-string)"> thing.c</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> thing.o</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">cc</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-string)"> stuff.c</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> stuff.o</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>源文件是完全独立的，可以并行地编译成对象。</p>
<p>为了跨文件使用函数和变量，我们使用头文件（.h）。这些只是以特定方式使用的普通 C 源文件。记得上面说过，对象文件只包含全局函数和变量的名称，没有类型、宏，甚至函数参数。为了跨文件使用符号，我们需要指定所有需要使用它们的额外信息。我们把这些&quot;声明&quot;放在自己的.h 文件中，这样其他的.c 文件就可以通过<code>#include</code>引用它们了。</p>
<p>为了避免重复，一个.c 文件通常不会定义自己的类型/宏等，而只是包括自己或其所属模块/组件的头文件。</p>
<p><strong>把头文件看作是一个 API 的规范</strong>，它可以在任何数量的源文件中实现。你甚至可以为不同的平台或目的，编写同一头文件的不同实现。</p>
<p>当编译一个仅被声明（例如被包含的头文件）而未被定义的符号的引用时，对象文件将标记这个符号是缺失的，需要被实现。</p>
<p>将一个或多个对象连接在一起的最后工作，匹配所有的符号引用，是由编译器的 &quot;链接器 &quot;组件完成的。链接器输出完整的可执行文件或共享库。</p>
<div class="rp-codeblock language-sh"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="sh"><code><span class="line"><span style="color:var(--shiki-token-comment)"># link objects to executable</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">cc</span><span style="color:var(--shiki-token-string)"> thing.o</span><span style="color:var(--shiki-token-string)"> stuff.o</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> gizmo</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>总之，我们在 C 语言中不像其他语言那样&quot;包含&quot;其他源文件。我们只包括声明，然后代码被链接器匹配起来。</p>
<h2 class="rp-toc-include" id="不要使用这些函数"><a href="#不要使用这些函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>不要使用这些函数</h2>
<p>C 语言已经很老了，并试图做到高度向后兼容。因此，它有一些应该被避免的功能。</p>
<ul>
<li><code>atoi()</code>,<code>atol()</code>等类似函数；发生错误时，它们返回 0，但是 0 也是一个有效的值。更好的是使用<code>strtoi()</code>等函数。</li>
<li><code>gets()</code>是不安全的，因为它没有给出目标缓冲区的界限。最好使用<code>fgets()</code>。</li>
</ul>
<h2 class="rp-toc-include" id="数组不是值"><a href="#数组不是值" class="rp-header-anchor rp-link" aria-hidden="true">#</a>数组不是值</h2>
<p>重要的是要意识到 C 语言作为一种语言，只处理已知大小的数据块。你也许可以把 C 语言概括为 &quot;复制已知大小的值的语言&quot;。</p>
<p>我可以在程序中传递一个整数或一个结构，从函数中返回它们，等等，并将它们视为适当的对象，因为 C 知道它们的大小，因此可以编译代码来复制它们的全部数据。</p>
<p>我不能用数组来做这个。当我在一个函数中声明一个<code>int[5]</code>类型的变量时，实际上我并没有得到一个<code>int[5]</code>类型的值；我得到的是一个<code>int*</code>值，其中有 5 个 int 被分配到它那里。由于这只是一个指针，应当由程序员而不是语言管理复制它后面的数据并保持其有效性。</p>
<p>然而，结构体内的数组被视为值，并与结构体一起被完全复制。</p>
<p>(从技术上讲，已知大小的数组类型是真实的类型，而不仅仅是指针；例如，sizeof 会告诉你整个数组的大小。但是你不能把它们当作自带的值）。</p>
<h2 class="rp-toc-include" id="重要的编译选项"><a href="#重要的编译选项" class="rp-header-anchor rp-link" aria-hidden="true">#</a>重要的编译选项</h2>
<p>编译器有这么多的选项，而默认的选项并不是很好。下面是你可能需要的绝对必要的标志。(它们是以 GCC/Clang 风格给出的；其他编译器的语法可能有所不同）。</p>
<ul>
<li><code>-O2</code>:为发布版本的构建优化代码</li>
<li><code>-g -Og</code>:用于调试构建；为调试器启用额外信息，并为调试进行优化。</li>
<li><code>-Wall</code>:启用所有警告；也可以通过<code>-Wno-...</code>禁用指定警告。</li>
<li><code>-Werror</code>:将所有警告转换为错误；确保至少启用<code>-Werror=implicit</code>，确保调用未声明函数时报错。</li>
<li><code>-DNAME</code>和<code>-DNAME=value</code>:生命一个宏。</li>
<li><code>-fsanitize=address,undefined</code>:用于调试构建；使能两个 sanitizer,它在整个编译后的代码中注入额外的检查以发现错误。详见<a href="https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html" target="_blank" rel="noopener noreferrer" class="rp-link">GCC 编译选项</a>。</li>
<li><code>-std=...</code>:选择一个标准。在大多数情况下，你可以省略它，使用你的编译器的默认值（通常是最新的标准）。那些对可移植性有特殊关注的人可以使用<code>-std=c89</code>来保持&quot;经典&quot;C。</li>
</ul>
<p>参考<a href="https://gcc.gnu.org/onlinedocs/gcc/Option-Summary.html" target="_blank" rel="noopener noreferrer" class="rp-link">Option Summary (Using the GNU Compiler Collection (GCC))</a>,了解更多编译选项。</p>
<h2 class="rp-toc-include" id="三种类型的内存以及何时使用"><a href="#三种类型的内存以及何时使用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>三种类型的内存以及何时使用</h2>
<ul>
<li><strong>自动存储</strong>是存储局部变量的地方。当一个函数被调用时，将为其创建一个新的自动存储区域，并在其返回时删除。只有返回值被保留；它被复制到调用它的函数的自动存储中。这意味着返回一个指向局部变量的指针是不安全的，因为底层数据会被悄悄地删除。自动存储通常被称为<strong>堆栈</strong>。</li>
<li><strong>分配的存储空间</strong>是使用<code>malloc()</code>的得到的。它一直存活到被<code>free()</code>的时候，所以可以被传递到任何地方，包括向上传递到调用函数。它通常被称为<strong>堆</strong>。</li>
<li><strong>静态存储</strong>在程序的生命周期内有效。它是在进程开始时分配的。全局变量被存储在这里。</li>
</ul>
<p>如果你想从一个函数中 &quot;返回 &quot;内存，你不必使用 malloc/分配的存储；你可以传递一个指向本地数据的指针：</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> getData</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">data) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    data[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    data[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    data[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> data[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    getData(data)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> data[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-function)">])</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="命名习惯"><a href="#命名习惯" class="rp-header-anchor rp-link" aria-hidden="true">#</a>命名习惯</h2>
<p>C 语言不支持命名空间。如果你要做一个公共库，或者希望一个&quot;模块&quot;有一个名字，你需要选择一个前缀来添加到所有公共 API 的名字中：</p>
<ul>
<li>函数</li>
<li>类型</li>
<li>枚举值</li>
<li>宏</li>
</ul>
<p>此外，你应该总是为每个枚举包括一些不同的前缀，这样你就知道这个值属于哪个枚举类型：</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">enum</span><span style="color:var(--shiki-foreground)"> color {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    COLOR_RED</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    COLOR_BLUE</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    ...</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>关于名字没有真正的标准，例如，<code>snake_case</code>或者<code>cameCase</code>。选择并保持一致,我所知道的最接近约定的东西是，有些人把类型命名为<code>my_type_t</code>，因为许多标准的 C 类型都是这样的（<code>ptrdiff_t</code>,<code>int32_t</code>, 等等）。</p>
<h2 class="rp-toc-include" id="static"><a href="#static" class="rp-header-anchor rp-link" aria-hidden="true">#</a>static</h2>
<p>在一个函数或文件内变量上使用，<code>static</code>使其成为文件本地的。它不会被导出为一个符号，供其他源文件使用。</p>
<p><code>static</code>也可以用在局部变量上，这使得变量在调用该函数时持续存在。你可以认为这就像一个全局变量，它只在一个函数的范围内。这对于计算和存储数据以便在随后的调用中重复使用是很有用的；但请记住，这也有全局/共享状态，需要在多线程或递归调用中注意他们的使用。</p>
<p>(它看起来有多重含义，因为在全局作用域中它似乎减少了变量的作用域，但在函数作用域中它又增加了变量的作用域）。实际上，在这两种情况下，它所做的是使它们与文件相联系。</p>
<h2 class="rp-toc-include" id="结构体方法参数"><a href="#结构体方法参数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>结构体方法参数</h2>
<p>如果你在 C 语言之前学过一种更有特点的语言，你可能会发现很难想象如何转化这些知识。这里有一个类似于面向对象编程的常用方法：&quot;结构体方法&quot;。你写的函数接收指向结构的指针，以改变它们或获得属性：</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">typedef</span><span style="color:var(--shiki-token-keyword)"> struct</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> x;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> y;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">} vec2;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-function)"> vec_add</span><span style="color:var(--shiki-foreground)">(vec2 </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">u</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> const</span><span style="color:var(--shiki-foreground)"> vec2 </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">v) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    u</span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-foreground)">x </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)"> v</span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-foreground)">x;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">    u</span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-foreground)">y </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)"> v</span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-foreground)">y;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> vec_dot</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-foreground)"> vec2 </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">u</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> const</span><span style="color:var(--shiki-foreground)"> vec2 </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">v) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> u</span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-foreground)">x </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> v</span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-foreground)">x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> u</span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-foreground)">y </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> v</span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-foreground)">y;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>你不能扩展结构或做任何真正类似于 OO 的事情，但这是一个有用的模式，可以用来参考。</p>
<h2 class="rp-toc-include" id="const"><a href="#const" class="rp-header-anchor rp-link" aria-hidden="true">#</a>const</h2>
<p>将一个<code>T</code>类型的变量或参数声明为<code>const T</code>，大致上意味着该变量不能被修改。这意味着它不能被赋值，如果 T 是一个指针或数组类型，它也不能被改变。</p>
<p>将类型为<code>T</code>的变量等于类型为<code>const T</code>的变量是允许的，反过来是不允许的。</p>
<p>一个好的习惯是默认将函数的指针参数声明为常数，只有在需要修改它们时才省略。</p>
<h2 class="rp-toc-include" id="平台与标准-apis"><a href="#平台与标准-apis" class="rp-header-anchor rp-link" aria-hidden="true">#</a>平台与标准 APIs</h2>
<p>当你通过<code>#include&lt;some_header.h&gt;</code>引用头文件时，一般无法确定它们依赖什么。通常来自以下情况：</p>
<ul>
<li>标准 C 库，缩写为&quot;stdlib&quot;。例如：<code>stdio.h</code>,<code>stdlib.h</code>,<code>error.h</code>
<ul>
<li>这是语言规范的一部分，应该由所有符合要求的平台和编译器来实现。非常安全的依赖。</li>
<li><a href="https://en.cppreference.com/w/c/header" target="_blank" rel="noopener noreferrer" class="rp-link">https://en.cppreference.com/w/c/header</a></li>
</ul>
</li>
<li>POSIX,一套标准的操作系统 APIs。例如：<code>unistd.h</code>,<code>sys/time.h</code>
<ul>
<li>通常由 Linux,macOS,BSDs 实现。</li>
<li>windows 默认情况下不可用。可以通过<a href="https://sourceforge.net/p/mingw-w64/mingw-w64/ci/master/tree/mingw-w64-headers/crt/" target="_blank" rel="noopener noreferrer" class="rp-link">MinGW</a>进行支持，对于更完整的支持，需要<a href="https://cygwin.com/" target="_blank" rel="noopener noreferrer" class="rp-link">Cygwin</a>库。</li>
</ul>
</li>
<li>非标准的操作系统接口
<ul>
<li>Linux 特殊 APIs,可以通知<a href="https://www.man7.org/linux/man-pages/index.html" target="_blank" rel="noopener noreferrer" class="rp-link">man 文档</a>第三章了解。</li>
<li><a href="https://docs.microsoft.com/en-us/windows/win32/api/" target="_blank" rel="noopener noreferrer" class="rp-link">Windows Win32</a></li>
<li><a href="https://developer.apple.com/documentation/technologies" target="_blank" rel="noopener noreferrer" class="rp-link">Mac&#x27;s OS APIs</a></li>
</ul>
</li>
<li>安装在标准位置的一些第三方库。</li>
</ul>
<p>通过一个平台中立的头文件与你的特定平台代码对接可能是一个好主意，这样它就可以用不同的方式来实现。很多流行的 C 语言库基本上都是统一的、精心设计的对特定平台功能的抽象。</p>
<h2 class="rp-toc-include" id="整型"><a href="#整型" class="rp-header-anchor rp-link" aria-hidden="true">#</a>整型</h2>
<p>整数在 C 语言中是经常被抱怨的，编写正确的代码需要一些小心：</p>
<h3 class="rp-toc-include" id="sizes"><a href="#sizes" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Sizes</h3>
<p><a href="https://en.cppreference.com/w/c/language/arithmetic_types" target="_blank" rel="noopener noreferrer" class="rp-link">所有的整型有一个默认的最小 size</a>.在常见的平台上，有些比它们的最小 size 更大，例如 int，尽管最小 size 是 16 位，但在 Windows、macOS 和 Linux 上是 32 位。在编写可移植代码时，你必须假设整数永远不能超过其最小 size。</p>
<p>如果你想精确控制整数大小，你可以使用<code>stdint.h</code>中的标准类型，如<code>int32_t</code>、<code>uint64_t</code>等。还有<code>_least_t</code>和<code>_fast_t</code>类型。例如: <code>uint_fast8_t</code>、<code>uint_least8_t</code>。</p>
<ul>
<li><code>_least_t</code>:表示至少保存多少字节。</li>
<li><code>_fast_t</code>:表示让编译其选择一个可以容纳多少字节并且操作最快。</li>
</ul>
<p>需要在任何地方使用这些明确的类型吗？必须承认我对这个问题很纠结，但我越想越觉得你应该这样做--没有什么坏处。你真正不应该这样做的唯一原因是在制作 API 时必须使用缺少<code>stdint.h</code>的老式 C89 编译器。使用<code>int16_fast_t</code>或其他类型而不是<code>int</code>，不会更糟，只会更清楚。</p>
<h3 class="rp-toc-include" id="算数和优化"><a href="#算数和优化" class="rp-header-anchor rp-link" aria-hidden="true">#</a>算数和优化</h3>
<p><a href="https://en.cppreference.com/w/c/language/operator_arithmetic" target="_blank" rel="noopener noreferrer" class="rp-link">C 语言中的算术受制于许多奇怪的规则</a>，这些规则可能会产生意想不到的或无法实现的结果。<a href="https://en.cppreference.com/w/c/language/conversion#Integer_promotions" target="_blank" rel="noopener noreferrer" class="rp-link">整数提升</a>尤其需要注意。</p>
<p>可以参考<a href="https://www.nayuki.io/page/summary-of-c-cpp-integer-rules" target="_blank" rel="noopener noreferrer" class="rp-link">Nayuki’s summary of C integer rules</a>。</p>
<h3 class="rp-toc-include" id="无符号-char"><a href="#无符号-char" class="rp-header-anchor rp-link" aria-hidden="true">#</a>无符号 char</h3>
<p>所有其他的整数类型都默认为有符号，但 char 可以是有符号或无符号的，这取决于平台的情况。因此，它只有在用于字符串时才是可移植的；如果你想要一个小的/最小的 8 位的数字，也要指定符号。</p>
<h2 class="rp-toc-include" id="宏与-const-变量"><a href="#宏与-const-变量" class="rp-header-anchor rp-link" aria-hidden="true">#</a>宏与 const 变量</h2>
<p>要定义简单的常数，你有两个选择：</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">static</span><span style="color:var(--shiki-token-keyword)"> const</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> my_constant </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// or</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#define</span><span style="color:var(--shiki-token-function)"> MY_CONSTANT</span><span style="color:var(--shiki-token-constant)"> 5</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>区别在于，前者是一个真正的变量，后者是一个复制粘贴的内联表达式。</p>
<ul>
<li>与变量不同，你可以在需要&quot;常量表达式&quot;的情况下使用宏，比如数组长度或开关语句的情况。</li>
<li>与宏不同，你可以得到一个变量的指针。</li>
</ul>
<p>让常量真正成为&quot;常量表达式&quot;是非常有用的，因此它们通常应该被定义为宏。变量更适合于更大或更复杂的值，如结构体实例。</p>
<p>如果你的常数是一个整数，你有第三个更好的选择，即枚举：</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">enum</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    MY_CONSTANT </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 5</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>这在 C 语言中定义了一个常量表达式，而不是在预处理程序中，所以它可以更容易被调试器等看到。</p>
<p>在 C23 中，你可以给一个枚举类型指定明确的基础类型：</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">enum</span><span style="color:var(--shiki-foreground)"> : </span><span style="color:var(--shiki-token-keyword)">size_t</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    BUFFER_LENGTH </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1024</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="宏与内联函数"><a href="#宏与内联函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>宏与内联函数</h2>
<p>宏可以有参数，然后可以扩展为 C 代码。</p>
<p>相对于函数的优势：</p>
<ul>
<li>这些代码被直接粘贴在周围的代码中，而不是编译函数调用指令。这可以使代码更快，因为函数调用有一些开销。</li>
<li>它们可以是类型通用的。例如，<code>x + y</code>是任何数字类型的有效语法。如果我们把它变成一个函数，我们就必须把它们声明为参数，并事先选择它们的类型，即大小和符号性，这将使它只能在某些情况下使用。</li>
</ul>
<p>缺点</p>
<ul>
<li>参数的重复使用。假设我们有一个宏<code>MY_MACRO(x)</code>。如果 x 在定义中被多次使用，那么表达式 x 将被多次出现，因为它被简单地复制和粘贴。而函数的参数的表达式被会被计算一次，然后传入函数。</li>
<li>它们可能容易出错，因为它们是在源码级别工作。一般来说，多使用括号是个好主意，总是对整个宏定义本身和任何参数使用括号，这样表达式就不会在无意中合并。</li>
</ul>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-comment)">// Instead of:</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#define</span><span style="color:var(--shiki-token-function)"> MY_MACRO</span><span style="color:var(--shiki-foreground)">(x) x</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">x</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// Do:</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#define</span><span style="color:var(--shiki-token-function)"> MY_MACRO</span><span style="color:var(--shiki-foreground)">(x) ((x)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">(x))</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>除非你需要类型通用，否则你可以通过将一个函数定义为静态内联来获得两方面的好处。内联向编译器提供了一个提示，即函数中的代码应该直接编译到使用它的地方，而不是被调用。你可以把静态内联函数放在头文件中，就像宏一样，没有任何问题。</p>
<p>此外，从 C11 开始，你可以使用一个特殊的宏<code>_Generic</code>为不同类型的函数提供重载：</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#define</span><span style="color:var(--shiki-token-function)"> sin</span><span style="color:var(--shiki-foreground)">(X) </span><span style="color:var(--shiki-token-function)">_Generic</span><span style="color:var(--shiki-foreground)">((X)</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> \</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">              long</span><span style="color:var(--shiki-token-keyword)"> double</span><span style="color:var(--shiki-foreground)">: sinl</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                  default: sin</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">  \</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    float</span><span style="color:var(--shiki-foreground)">: sinf  \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">              )(X)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://tmewett.com/c-tips/#essential-compiler-flags" target="_blank" rel="noopener noreferrer" class="rp-link">Everything I wish I knew when learning C - Tom Mewett (tmewett.com)[原文]</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[AT&T 汇编与 Intel 汇编区别]]></title>
        <id>/blog/2023/ATT-Intel-diff</id>
        <link href="https://www.vhcffh.com/blog/2023/ATT-Intel-diff"/>
        <updated>2023-04-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文详细对比了AT&T与Intel两种汇编语法的五大区别：操作数前缀、操作数方向、内存单元表示、寻址方式以及操作码后缀。通过具体的指令示例，清晰地展示了两者在寄存器、立即数和内存访问等方面的语法差异。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="att-汇编与-intel-汇编区别"><a href="#att-汇编与-intel-汇编区别" class="rp-header-anchor rp-link" aria-hidden="true">#</a>AT&amp;T 汇编与 Intel 汇编区别<!-- --> </h1>
<ol>
<li>前缀不同</li>
</ol>
<p>在 Intel 的语法中，寄存器和和立即数都没有前缀。
但是在 AT&amp;T 中，寄存器前需要加上&quot;％&quot;，而立即数前需要加上&quot;$&quot;。
在 Intel 的语法中，十六进制和二进制立即数后缀分别是&quot;h&quot;和&quot;b&quot;，而在 AT&amp;T 中，十六进制立即数前需要加上&quot;0x&quot;。</p>





















<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>Intel 语法</th><th>AT&amp;T 语法</th></tr></thead><tbody><tr><td>mov eax,8</td><td>movl $8,%eax</td></tr><tr><td>mov ebx,0ffffh</td><td>movl $0xffff,%ebx</td></tr><tr><td>int 80h</td><td>int $0x80</td></tr></tbody></table></div>
<ol start="2">
<li>操作数方向不同</li>
</ol>
<p>Intel 与 AT&amp;T 操作数的方向正好相反。
在 Intel 语法中，第一个操作数是目的操作数，第二个操作数源操作数。
而在 AT&amp;T 中，第一个数是源操作数，第二个数是目的操作数。</p>













<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>Intel 语法</th><th>AT&amp;T 语法</th></tr></thead><tbody><tr><td>mov eax,[ecx]</td><td>movl (%ecx),%eax</td></tr></tbody></table></div>
<ol start="3">
<li>内存单元操作数不同</li>
</ol>
<p>在 Intel 的语法中，基寄存器用&quot;[]&quot;括起来，而在 AT&amp;T 中，用&quot;()&quot;括起来。</p>













<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>Intel 语法</th><th>AT&amp;T 语法</th></tr></thead><tbody><tr><td>mov eax,[ebx+5]</td><td>movl 5(%ebx),%eax</td></tr></tbody></table></div>
<ol start="4">
<li>寻址方式不同</li>
</ol>
<p>Intel 的指令格式是 segreg:[base+index*scale+disp]，而 AT&amp;T 的格式是%segreg:disp(base,index,scale)。
其中 index/scale/disp/segreg 全部是可选的，完全可以简化掉。
如果没有指定 scale 而指定了 index，则 scale 的缺省值为 1。
当立即数用在 scale/disp 中时，不应当在其前冠以&quot;$&quot;前缀。</p>

























<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>Intel 语法</th><th>AT&amp;T 语法</th></tr></thead><tbody><tr><td>mov eax,[ebx+20h]</td><td>movl 0x20(%ebx),%eax</td></tr><tr><td>add eax,[ebx+ecx*2h</td><td>addl (%ebx,%ecx,0x2),%eax</td></tr><tr><td>lea eax,[ebx+ecx]</td><td>leal (%ebx,%ecx),%eax</td></tr><tr><td>sub eax,[ebx+ecx*4h-20h]</td><td>subl -0x20(%ebx,%ecx,0x4),%eax</td></tr></tbody></table></div>
<ol start="5">
<li>后缀不同
在 AT&amp;T 的操作码后面有一个后缀，其含义就是指出操作码的大小。
&quot;l&quot;表示长整数(32 位)，&quot;w&quot;表示字(16 位)，&quot;b&quot;表示字节(8 位)。
而在 Intel 的语法中，则要在内存单元操作数的前面加上 byte ptr, word ptr 和 dword ptr。</li>
</ol>

























<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>Intel 语法</th><th>AT&amp;T 语法</th></tr></thead><tbody><tr><td>mov al,bl</td><td>movb %bl,%al</td></tr><tr><td>mov ax,bx</td><td>movw %bx,%ax</td></tr><tr><td>mov eax,ebx</td><td>movl %ebx,%eax</td></tr><tr><td>mov eax,dword ptr [ebx]</td><td>movl (%ebx),%eax</td></tr></tbody></table></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[WSL2 启用桥接网络并开启 mDNS]]></title>
        <id>/blog/2023/WSL2-bridge-network-and-using-mDNS</id>
        <link href="https://www.vhcffh.com/blog/2023/WSL2-bridge-network-and-using-mDNS"/>
        <updated>2023-01-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了如何为WSL2启用桥接网络模式，使其获得独立的局域网IP。内容包括在Hyper-V中创建虚拟交换机、修改`.wslconfig`文件。同时，还讲解了如何在WSL2中安装并启用`avahi-daemon`服务，以实现通过mDNS（如`wsl.local`）进行主机名访问。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="wsl2-启用桥接网络并开启-mdns"><a href="#wsl2-启用桥接网络并开启-mdns" class="rp-header-anchor rp-link" aria-hidden="true">#</a>WSL2 启用桥接网络并开启 mDNS<!-- --> </h1>
<ol>
<li>WSL2 启用桥接网络</li>
</ol>
<p>首先在<code>Hyper-V管理器</code>中创建新的虚拟交换机（假设名字为 eth_switch），并选择外部网络和要桥接道德物理网卡。</p>
<p>编辑 window 主目录下.wslconfig 文件，添加两行配置</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>#C:\Users\&lt;user_name&gt;\.wslconfig</span></span>
<span class="line"><span>[wsl2]</span></span>
<span class="line"><span>#...</span></span>
<span class="line"><span>networkingMode=bridged</span></span>
<span class="line"><span>vmSwitch=eth_switch</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>重启 WSL2 后，eth0 将和物理网卡一样获取一个独立 ip</p>
<ol start="2">
<li>启用 avahi-daemon.service 服务实现 mDNS 广播</li>
</ol>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span># 安装</span></span>
<span class="line"><span>sudo apt-get install avahi-daemon</span></span>
<span class="line"><span># 启动</span></span>
<span class="line"><span>systemctl start avahi-daemon.service</span></span>
<span class="line"><span># 配置自动启动</span></span>
<span class="line"><span>systemctl enable avahi-daemon.service</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>配置 WSL2 计算机名
修改文件<code>/etc/wsl.conf</code></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>[network]</span></span>
<span class="line"><span>hostname = wsl</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>重启之后便可以在局域网内通过计算机名 wsl 访问 wsl 了</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>PS C:\Users\fly92&gt; ping wsl</span></span>
<span class="line"><span></span></span>
<span class="line"><span>正在 Ping wsl.local [192.168.10.164] 具有 32 字节的数据:</span></span>
<span class="line"><span>来自 192.168.10.164 的回复: 字节=32 时间&lt;1ms TTL=64</span></span>
<span class="line"><span>来自 192.168.10.164 的回复: 字节=32 时间&lt;1ms TTL=64</span></span>
<span class="line"><span>来自 192.168.10.164 的回复: 字节=32 时间&lt;1ms TTL=64</span></span>
<span class="line"><span>来自 192.168.10.164 的回复: 字节=32 时间&lt;1ms TTL=64</span></span>
<span class="line"><span></span></span>
<span class="line"><span>192.168.10.164 的 Ping 统计信息:</span></span>
<span class="line"><span>    数据包: 已发送 = 4，已接收 = 4，丢失 = 0 (0% 丢失)，</span></span>
<span class="line"><span>往返行程的估计时间(以毫秒为单位):</span></span>
<span class="line"><span>    最短 = 0ms，最长 = 0ms，平均 = 0ms</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h3>
<ol>
<li><a href="https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config" target="_blank" rel="noopener noreferrer" class="rp-link">WSL 中的高级设置配置</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[nmcli 配置 wifi]]></title>
        <id>/blog/2023/nmcli-config-wifi</id>
        <link href="https://www.vhcffh.com/blog/2023/nmcli-config-wifi"/>
        <updated>2023-01-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是一份使用`nmcli`命令配置WiFi的快速指南。内容涵盖了扫描、连接、断开WiFi网络，以及创建WiFi热点、设置密码等操作。此外，还简要说明了如何为创建的热点配置DHCP服务，为Linux命令行网络管理提供了实用参考。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="nmcli-配置-wifi"><a href="#nmcli-配置-wifi" class="rp-header-anchor rp-link" aria-hidden="true">#</a>nmcli 配置 wifi<!-- --> </h1>
<h2 class="rp-toc-include" id="连接-wifi"><a href="#连接-wifi" class="rp-header-anchor rp-link" aria-hidden="true">#</a>连接 wifi</h2>
<h3 class="rp-toc-include" id="扫描-wifi"><a href="#扫描-wifi" class="rp-header-anchor rp-link" aria-hidden="true">#</a>扫描 wifi</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> nmcli</span><span style="color:var(--shiki-token-string)"> dev</span><span style="color:var(--shiki-token-string)"> wifi</span><span style="color:var(--shiki-token-string)"> list</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="连接新的-wifi"><a href="#连接新的-wifi" class="rp-header-anchor rp-link" aria-hidden="true">#</a>连接新的 wifi</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> nmcli</span><span style="color:var(--shiki-token-string)"> dev</span><span style="color:var(--shiki-token-string)"> wifi</span><span style="color:var(--shiki-token-string)"> connect</span><span style="color:var(--shiki-token-string)"> NETWORK-SSID</span><span style="color:var(--shiki-token-string)"> password</span><span style="color:var(--shiki-token-string-expression)"> &quot;NETWORK-PASSWORD&quot;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="查看保存的-wifi-信息"><a href="#查看保存的-wifi-信息" class="rp-header-anchor rp-link" aria-hidden="true">#</a>查看保存的 wifi 信息</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">nmcli</span><span style="color:var(--shiki-token-string)"> con</span><span style="color:var(--shiki-token-string)"> show</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="连接保存在-wifi"><a href="#连接保存在-wifi" class="rp-header-anchor rp-link" aria-hidden="true">#</a>连接保存在 wifi</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">nmcli</span><span style="color:var(--shiki-token-string)"> con</span><span style="color:var(--shiki-token-string)"> up</span><span style="color:var(--shiki-token-string)"> NETWORK-SSID</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="断开-wifi"><a href="#断开-wifi" class="rp-header-anchor rp-link" aria-hidden="true">#</a>断开 wifi</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">nmcli</span><span style="color:var(--shiki-token-string)"> con</span><span style="color:var(--shiki-token-string)"> down</span><span style="color:var(--shiki-token-string)"> NETWORK-SSID</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="创建-wifi-热点"><a href="#创建-wifi-热点" class="rp-header-anchor rp-link" aria-hidden="true">#</a>创建 wifi 热点</h2>
<h3 class="rp-toc-include" id="创建热点"><a href="#创建热点" class="rp-header-anchor rp-link" aria-hidden="true">#</a>创建热点</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">nmcli</span><span style="color:var(--shiki-token-string)"> connection</span><span style="color:var(--shiki-token-string)"> add</span><span style="color:var(--shiki-token-string)"> type</span><span style="color:var(--shiki-token-string)"> wifi</span><span style="color:var(--shiki-token-string)"> ifname</span><span style="color:var(--shiki-token-string)"> wlan0</span><span style="color:var(--shiki-token-string)"> con-name</span><span style="color:var(--shiki-token-string)"> local-ap</span><span style="color:var(--shiki-token-string)"> autoconnect</span><span style="color:var(--shiki-token-string)"> yes</span><span style="color:var(--shiki-token-string)"> ssid</span><span style="color:var(--shiki-token-string)"> WIFI-SSID</span><span style="color:var(--shiki-token-string)"> mode</span><span style="color:var(--shiki-token-string)"> ap</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="设置密码"><a href="#设置密码" class="rp-header-anchor rp-link" aria-hidden="true">#</a>设置密码</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">nmcli</span><span style="color:var(--shiki-token-string)"> connection</span><span style="color:var(--shiki-token-string)"> modify</span><span style="color:var(--shiki-token-string)"> local-ap</span><span style="color:var(--shiki-token-string)"> 802-11-wireless.mode</span><span style="color:var(--shiki-token-string)"> ap</span><span style="color:var(--shiki-token-string)"> 802-11-wireless-security.key-mgmt</span><span style="color:var(--shiki-token-string)"> wpa-psk</span><span style="color:var(--shiki-token-string)"> ipv4.method</span><span style="color:var(--shiki-token-string)"> shared</span><span style="color:var(--shiki-token-string)"> 802-11-wireless-security.psk</span><span style="color:var(--shiki-token-string-expression)"> &quot;PASSWORD&quot;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="启动热点"><a href="#启动热点" class="rp-header-anchor rp-link" aria-hidden="true">#</a>启动热点</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">nmcli</span><span style="color:var(--shiki-token-string)"> connection</span><span style="color:var(--shiki-token-string)"> up</span><span style="color:var(--shiki-token-string)"> local-ap</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="配置-dhcp"><a href="#配置-dhcp" class="rp-header-anchor rp-link" aria-hidden="true">#</a>配置 dhcp</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-comment)"># vim /etc/dhcp/dhcpd.conf</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">option</span><span style="color:var(--shiki-token-string)"> domain-name-servers</span><span style="color:var(--shiki-token-constant)"> 8.8.8.8</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">subnet</span><span style="color:var(--shiki-token-constant)"> 192.168.44.0</span><span style="color:var(--shiki-token-string)"> netmask</span><span style="color:var(--shiki-token-constant)"> 255.255.255.0</span><span style="color:var(--shiki-token-string)"> {</span><span style="color:var(--shiki-token-comment)">       # 目标网段</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    range</span><span style="color:var(--shiki-token-constant)"> 192.168.44.128</span><span style="color:var(--shiki-token-constant)"> 192.168.44.200</span><span style="color:var(--shiki-foreground)">;          </span><span style="color:var(--shiki-token-comment)"># 具体的IP</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    option</span><span style="color:var(--shiki-token-string)"> routers</span><span style="color:var(--shiki-token-constant)"> 192.168.44.1</span><span style="color:var(--shiki-foreground)">;                  </span><span style="color:var(--shiki-token-comment)"># 网关地址</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    option</span><span style="color:var(--shiki-token-string)"> domain-name-servers</span><span style="color:var(--shiki-token-constant)"> 114.114.114.114</span><span style="color:var(--shiki-foreground)">;   </span><span style="color:var(--shiki-token-comment)"># dns解析</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="启动-dhcp-服务"><a href="#启动-dhcp-服务" class="rp-header-anchor rp-link" aria-hidden="true">#</a>启动 dhcp 服务</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">systemctl</span><span style="color:var(--shiki-token-string)"> restart</span><span style="color:var(--shiki-token-string)"> dhcpd</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[python 实现 AES 加密]]></title>
        <id>/blog/2022/python-implements-AES-encryption</id>
        <link href="https://www.vhcffh.com/blog/2022/python-implements-AES-encryption"/>
        <updated>2022-11-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了高级加密标准（AES）算法，并用Python进行了实现。内容阐述了AES作为DES替代标准的发展背景，详细讲解了其核心原理，包括密钥扩展、S盒变换、行变换、列变换等加密步骤，并提供了完整的加密和解密Python代码。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="python-实现-aes-加密"><a href="#python-实现-aes-加密" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python 实现 AES 加密<!-- --> </h1>
<p>摘要：作为新一代的加密标准，AES 旨在取代 <a href="https://blog.vhcffh.com/python-implements-des-encryption/" target="_blank" rel="noopener noreferrer" class="rp-link">DES</a>，以适应当今分布式开放网络对数据加密安全性的要求。
本文在分析了 AES 加密原理的基础上着重说明了算法实现的具体步骤，并用 python 实现了对字符串的加密和解密。</p>
<h2 class="rp-toc-include" id="aes-介绍"><a href="#aes-介绍" class="rp-header-anchor rp-link" aria-hidden="true">#</a>AES 介绍</h2>
<p>AES（高级加密标准，Advanced Encryption Standard），在密码学中又称 Rijndael 加密法，是美国联邦政府采用的一种分组加密标准。这个标准用来替代原先的 DES，目前已经广为全世界所使用，成为对称密钥算法中最流行的算法之一。</p>
<p>在 AES 出现之前，最常用的对称密钥算法是 DES 加密算法，它在 1977 年被公布成为美国政府的商用加密标准。
DES 的主要问题是密钥长度较短，渐渐不适合于分布式开放网络对数据加密安全性的要求。
因此，1998 年美国政府决定不再继续延用 DES 作为联邦加密标准，并发起了征集 AES 候选算法的活动。
征集活动对 AES 的基本要求是： 比三重 DES 快、至少与三重 DES 一样安全、数据分组长度为 128 比特、密钥长度为 128/192/256 比特。</p>
<p>经过三年多的甄选，比利时的密码学家所设计的 Rijndael 算法最终脱颖而出，成为新一代的高级加密标准，并于 2001 年由美国国家标准与技术研究院（NIST）发布于 FIPS PUB 197。</p>
<h2 class="rp-toc-include" id="aes-算法原理"><a href="#aes-算法原理" class="rp-header-anchor rp-link" aria-hidden="true">#</a>AES 算法原理</h2>
<p>AES 算法（即 Rijndael 算法）是一个对称分组密码算法。
数据分组长度必须是 128 bits，使用的密钥长度为 128，192 或 256 bits。
对于三种不同密钥长度的 AES 算法，分别称为“AES-128”、“AES-192”、“AES-256”。
（Rijndael 的设计还可以处理其它的分组长度和密钥长度，但 AES 标准中没有采用）</p>
<p>下图是 AES 加密解密的整体流程图：</p>
<p><img alt="AES" src="/static/image/AES.f7ca568a02.png"/></p>
<p>这里我们需要知道 3 个符号：</p>
<ul>
<li>Nb: 状态 State 包含的列（32-bit 字）的个数，也就是说 Nb=4；</li>
<li>Nk: 密钥包含的 32-bit 字的个数，也就是说 Nk=4，6 或 8；</li>
<li>Nr: 加密的轮数，对于不同密钥长度，轮数不一样，具体如下表所示：</li>
</ul>





























<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:center"></th><th style="text-align:center">密钥长度(Nk words)</th><th style="text-align:center">分组大小(Nb words)</th><th style="text-align:center">轮数(Nr)</th></tr></thead><tbody><tr><td style="text-align:center">AES-128</td><td style="text-align:center">4</td><td style="text-align:center">4</td><td style="text-align:center">10</td></tr><tr><td style="text-align:center">AES-192</td><td style="text-align:center">6</td><td style="text-align:center">4</td><td style="text-align:center">12</td></tr><tr><td style="text-align:center">AES-256</td><td style="text-align:center">8</td><td style="text-align:center">4</td><td style="text-align:center">14</td></tr></tbody></table></div>
<p>下面分三个部分对 AES 加密解密流程进行梳理</p>
<h3 class="rp-toc-include" id="密钥扩展"><a href="#密钥扩展" class="rp-header-anchor rp-link" aria-hidden="true">#</a>密钥扩展</h3>
<p>AES 算法通过密钥扩展程序（Key Expansion）将用户输入的密钥<code>K</code>扩展生成<code>Nb(Nr+1)</code>个字，存放在一个线性数组<code>w[Nb*(Nr+1)]</code>中。具体如下：</p>
<ol>
<li>位置变换函数<code>RotWord()</code>，接受一个字<code>[a0, a1, a2, a3]</code>作为输入，循环左移一个字节后输出<code>[a1, a2, a3, a0]</code>。</li>
<li>S 盒变换函数<code>SubWord()</code>，接受一个字<code>[a0, a1, a2, a3]</code>作为输入。S 盒是一个 16x16 的表，其中每一个元素是一个字节。对于输入的每一个字节，前四位组成十六进制数<code>x</code>作为行号，后四位组成的十六进制数<code>y</code>作为列号，查找表中对应的值。最后函数输出 4 个新字节组成的 32-bit 字。</li>
<li>轮常数<code>Rcon[]</code>，如何计算的就不说了，直接把它当做常量数组。
扩展密钥数组<code>w[]</code>的前<code>Nk</code>个元素就是外部密钥<code>K</code>,后的元素<code>w[i]</code>等于它前一个元素<code>w[i-1]</code>与前第<code>Nk</code>个元素<code>w[i-Nk]</code>的异或，即<code>w[i] = w[i-1] XOR w[i-Nk]</code>；但若<code>i</code>为<code>Nk</code>的倍数，则<code>w[i] = w[i-Nk] XOR SubWord(RotWord(w[i-1])) XOR Rcon[i/Nk-1]</code>。</li>
</ol>
<p>注意，上面的第四步说明仅适合于 AES-128 和 AES-192;</p>
<h3 class="rp-toc-include" id="加密"><a href="#加密" class="rp-header-anchor rp-link" aria-hidden="true">#</a>加密</h3>
<p>AES 加密过程涉及到 4 种变换：S 盒变换，行变换，列变换，与扩展密钥的异或</p>
<h4 class="rp-toc-include" id="s-盒变换-subbytes"><a href="#s-盒变换-subbytes" class="rp-header-anchor rp-link" aria-hidden="true">#</a>S 盒变换-SubBytes()</h4>
<p>在密钥扩展部分已经讲过了，S 盒是一个 16 行 16 列的表，表中每个元素都是一个字节。S 盒变换很简单：函数<code>SubBytes()</code>接受一个 4x4 的字节矩阵作为输入，对其中的每个字节，前四位组成十六进制数 x 作为行号，后四位组成的十六进制数 y 作为列号，查找表中对应的值替换原来位置上的字节。</p>
<p><img alt="SubBytes" src="/static/image/SubBytes.05c09d2f68.png"/></p>
<h4 class="rp-toc-include" id="行变换-shiftrows"><a href="#行变换-shiftrows" class="rp-header-anchor rp-link" aria-hidden="true">#</a>行变换-ShiftRows()</h4>
<p>行变换也很简单，它仅仅是将矩阵的每一行以字节为单位循环移位：第一行不变，第二行左移一位，第三行左移两位，第四行左移三位。如下图所示：</p>
<p><img alt="ShiftRows" src="/static/image/ShiftRows.3b8bc2d04c.png"/></p>
<h4 class="rp-toc-include" id="与扩展密钥的异或-addroundkey"><a href="#与扩展密钥的异或-addroundkey" class="rp-header-anchor rp-link" aria-hidden="true">#</a>与扩展密钥的异或-AddRoundKey()</h4>
<p>扩展密钥只参与了这一步。根据当前加密的轮数，用<code>w[]</code>中的 4 个扩展密钥与矩阵的 4 个列进行按位异或。如下图：</p>
<p><img alt="AddRoundKey" src="/static/image/AddRoundKey.ab5838499e.png"/></p>
<h3 class="rp-toc-include" id="解密"><a href="#解密" class="rp-header-anchor rp-link" aria-hidden="true">#</a>解密</h3>
<p>解密需要分别实现 S 盒变换、行变换和列变换的逆变换 InvShiftRows(),InvSubBytes(),InvMixColumns()</p>
<h2 class="rp-toc-include" id="python-实现"><a href="#python-实现" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python 实现</h2>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">S_Box </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">63</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">7C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">77</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">7B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">6B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">6F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C5</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">01</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">67</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">FE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">AB</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">76</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">CA</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">82</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">7D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">FA</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">59</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">47</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F0</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">AD</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">AF</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">72</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C0</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">B7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">FD</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">93</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">26</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">36</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">CC</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">71</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">04</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">18</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">96</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">05</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9A</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">07</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">80</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">EB</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">27</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">75</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">09</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">83</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">6E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A0</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">52</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">29</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">84</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">53</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">00</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ED</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">FC</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5B</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">6A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">CB</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">BE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">39</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">58</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">CF</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">D0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">EF</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">AA</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">FB</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">85</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">45</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">02</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">7F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A8</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">51</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">40</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">92</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">38</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F5</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">BC</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DA</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">FF</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D2</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">CD</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">EC</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">97</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">17</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">C4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">7E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">73</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">60</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">81</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DC</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">90</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">88</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">46</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">EE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DB</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">E0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">49</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">06</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5C</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">C2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">AC</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">62</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">91</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">95</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">79</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">E7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">37</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">6D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A9</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">6C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">56</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">EA</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">65</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">7A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">AE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">08</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">BA</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">78</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">25</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C6</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">E8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DD</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">74</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">BD</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8A</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">70</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">66</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">48</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">03</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0E</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">61</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">35</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">57</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">86</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9E</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">E1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">98</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">69</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">94</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">9B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">87</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">CE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">55</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DF</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">8C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">89</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">BF</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">68</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">99</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">54</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">BB</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-foreground)">]]</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">Inv_S_Box </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">52</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">09</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">6A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">36</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">38</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">BF</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">40</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">81</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">FB</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">7C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">39</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">82</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">FF</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">87</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">CB</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">54</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">7B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">94</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3D</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">EE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">95</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">FA</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4E</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">08</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">66</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B2</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">76</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">49</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">6D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">25</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">72</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">86</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">68</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">98</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">D4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">CC</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">65</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">92</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">6C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">70</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">48</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">FD</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ED</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DA</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">5E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">46</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">57</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">84</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">90</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">AB</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">00</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">BC</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0A</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">F7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">58</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">05</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">45</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">06</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">D0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">CA</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">02</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">C1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">AF</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">BD</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">03</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">01</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">6B</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">3A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">91</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">67</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DC</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">EA</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">97</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">CF</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">CE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">73</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">96</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">AC</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">74</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">AD</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">35</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">85</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">E2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">37</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">75</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DF</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">6E</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">47</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">71</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">29</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">89</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">6F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">62</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">AA</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">18</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">BE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1B</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">FC</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">56</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">79</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">20</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">9A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DB</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">FE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">78</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">CD</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F4</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">1F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">DD</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">88</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">07</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">31</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">B1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">59</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">27</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">80</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">EC</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5F</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">60</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">51</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">7F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">A9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0D</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">2D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">7A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9F</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">93</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">C9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">EF</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">A0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">E0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4D</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">AE</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">F5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">B0</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">C8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">EB</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">BB</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">83</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">53</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">99</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">61</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">04</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">7E</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">BA</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">77</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">D6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">26</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">     0x</span><span style="color:var(--shiki-token-constant)">E1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">69</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">63</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">55</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">7D</span><span style="color:var(--shiki-foreground)">]]</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 轮常数，密钥扩展中用到。（AES-128只需要10轮）</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">Rcon </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">01000000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">02000000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">04000000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">08000000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">10000000</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        0x</span><span style="color:var(--shiki-token-constant)">20000000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">40000000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">80000000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1b000000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">36000000</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 密钥扩展</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 字循环左移一个字节</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> RotWord</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">x</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> ((x </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-foreground)">)) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># S盒变换</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> SubWord</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">x</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (temp </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> S_Box</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">(x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-foreground)">[(x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (temp </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> S_Box</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">(x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-foreground)">[(x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (temp </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> S_Box</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">(x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-foreground)">[(x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (temp </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> S_Box</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">(x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-foreground)">[(x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> temp</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 加密过程</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 轮密钥加变换 - 将每一列与扩展密钥进行异或</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> AddRoundKey</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">mtx</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> ikey</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    rmtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> []</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            rmtx</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">((mtx[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-punctuation)"> i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-punctuation)"> j] </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-token-punctuation)"> ((ikey[j] </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-punctuation)"> i) </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">)) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ff</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-token-punctuation)">(rmtx)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># S盒变换 - 前4位为行号，后4位为列号</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> Subbytes</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">mtx</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    rmtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> []</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-foreground)"> mtx</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        rmtx</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(S_Box[i </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">][i </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-token-punctuation)">(rmtx)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 行变换 - 按字节循环移位</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> ShiftRows</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">mtx</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    rmtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    rmtx </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-punctuation)"> \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-punctuation)"> \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-punctuation)"> \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> rmtx</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 有限域上的乘法 GF(2^8)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> b</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    p</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> hi_bit_set </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> counter </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            p </span><span style="color:var(--shiki-token-keyword)">^=</span><span style="color:var(--shiki-foreground)"> a</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        hi_bit_set </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">80</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (a </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ff</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> hi_bit_set </span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            a </span><span style="color:var(--shiki-token-keyword)">^=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1b</span><span style="color:var(--shiki-token-comment)">  # x^8 + x^4 + x^3 + x + 1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;=</span><span style="color:var(--shiki-token-constant)"> 1</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> p </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ff</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 列变换</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> MixColumns</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">mtx</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    rmtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 16</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        arr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> []</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            arr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(mtx[i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-punctuation)"> j </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        rmtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">02</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">03</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-foreground)"> arr</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-foreground)"> arr</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        rmtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-foreground)"> arr</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">02</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">03</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-foreground)"> arr</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        rmtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-foreground)"> arr</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-foreground)"> arr</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">02</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">03</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        rmtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">03</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-foreground)"> arr</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-foreground)"> arr</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">02</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-token-punctuation)">(rmtx)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 解密过程</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 逆行变换 - 按字节循环移位</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> InvShiftRows</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">mtx</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    rmtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    rmtx </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-punctuation)"> \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-punctuation)"> \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-punctuation)"> \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> mtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> rmtx</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 逆S盒变换 - 前4位为行号，后4位为列号</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> InvSubbytes</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">mtx</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    rmtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> []</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-foreground)"> mtx</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        rmtx</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(Inv_S_Box[i </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">][i </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-token-punctuation)">(rmtx)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 逆列变换</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> InvMixColumns</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">mtx</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    rmtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 16</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        arr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> []</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            arr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(mtx[i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-punctuation)"> j </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        rmtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0e</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0b</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0d</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">09</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        rmtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">09</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0e</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0b</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0d</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        rmtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0d</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">09</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0e</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0b</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        rmtx</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0b</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0d</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">09</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">])</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> GFMul</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">0e</span><span style="color:var(--shiki-token-punctuation)">, arr[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-token-punctuation)">(rmtx)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> AES</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">object</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # AES-128</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #    Nk密钥长度(双字)，Nb分组大小(双字)，Nr轮数</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 128   4               4               10</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 192   6               4               12</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 256   8               4               14</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 128 4*4*8=128bits   4*4*8=128bits     10轮</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> __init__</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> K</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Nk</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Nb</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Nr </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 通过密钥K生成实例，密钥K位数不足补零</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">K </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> K</span><span style="color:var(--shiki-token-punctuation)">[:</span><span style="color:var(--shiki-foreground)">self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Nk </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-token-function)"> len</span><span style="color:var(--shiki-token-punctuation)">(self.K)</span><span style="color:var(--shiki-token-keyword)"> &lt;</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Nk </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">K </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;\x00&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">W </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">KeyExpansion</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> Encrypt</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> m</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 加密</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 明文不足16*8bits补零</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-token-function)"> len</span><span style="color:var(--shiki-token-punctuation)">(m)</span><span style="color:var(--shiki-token-keyword)"> %</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            m </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;\x00&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(m) </span><span style="color:var(--shiki-token-keyword)">//</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 对每一个16*8bits的块进行循环</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> m</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            ikey </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">W</span><span style="color:var(--shiki-token-punctuation)">[:</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> AddRoundKey</span><span style="color:var(--shiki-token-punctuation)">(mtx, ikey)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-token-function)"> round</span><span style="color:var(--shiki-token-keyword)"> in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">, self.Nr):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Subbytes</span><span style="color:var(--shiki-token-punctuation)">(mtx)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> ShiftRows</span><span style="color:var(--shiki-token-punctuation)">(mtx)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> MixColumns</span><span style="color:var(--shiki-token-punctuation)">(mtx)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                ikey </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">W</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">round</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">round</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> AddRoundKey</span><span style="color:var(--shiki-token-punctuation)">(mtx, ikey)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Subbytes</span><span style="color:var(--shiki-token-punctuation)">(mtx)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> ShiftRows</span><span style="color:var(--shiki-token-punctuation)">(mtx)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            ikey </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">W</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Nr</span><span style="color:var(--shiki-token-punctuation)">:]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> AddRoundKey</span><span style="color:var(--shiki-token-punctuation)">(mtx, ikey)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            c </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> mtx</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> c</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> Decrypt</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> m</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 解密</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(m) </span><span style="color:var(--shiki-token-keyword)">//</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> m</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            ikey </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">W</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Nr </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">:]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> AddRoundKey</span><span style="color:var(--shiki-token-punctuation)">(mtx, ikey)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-token-function)"> round</span><span style="color:var(--shiki-token-keyword)"> in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(self.Nr</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> InvShiftRows</span><span style="color:var(--shiki-token-punctuation)">(mtx)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> InvSubbytes</span><span style="color:var(--shiki-token-punctuation)">(mtx)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                ikey </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">W</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-function)"> round</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-function)"> round</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> AddRoundKey</span><span style="color:var(--shiki-token-punctuation)">(mtx, ikey)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> InvMixColumns</span><span style="color:var(--shiki-token-punctuation)">(mtx)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> InvShiftRows</span><span style="color:var(--shiki-token-punctuation)">(mtx)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> InvSubbytes</span><span style="color:var(--shiki-token-punctuation)">(mtx)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            ikey </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">W</span><span style="color:var(--shiki-token-punctuation)">[:</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mtx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> AddRoundKey</span><span style="color:var(--shiki-token-punctuation)">(mtx, ikey)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            c </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> mtx</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> c</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> KeyExpansion</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 密钥扩展函数，密钥 K 扩展生成 Nb(Nr+1)个字  4*4*8bits=128bits -&gt; 4*(10+1)*32bits=1408bits</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        w </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> []</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(self.Nk):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (temp </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">K</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> j</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            w</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(temp)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(self.Nk, self.Nb </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-punctuation)"> (self.Nr </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">)):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> w</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Nk </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> SubWord</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">RotWord</span><span style="color:var(--shiki-token-punctuation)">(temp))</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-foreground)"> Rcon</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i </span><span style="color:var(--shiki-token-keyword)">//</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Nk </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            elif</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Nk </span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-keyword)"> and</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Nk </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> SubWord</span><span style="color:var(--shiki-token-punctuation)">(temp)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            w</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(w[i </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-punctuation)"> self.Nk] </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-token-punctuation)"> temp)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> w</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> getK</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 返回密钥K</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">K</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> generateK</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 随机产生密钥K</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        pass</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> print_bytes_hex</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">m</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-foreground)"> m</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">hex</span><span style="color:var(--shiki-token-punctuation)">(i)[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">:].</span><span style="color:var(--shiki-token-function)">rjust</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-string-expression)">&#x27;0&#x27;</span><span style="color:var(--shiki-token-punctuation)">), end</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">if</span><span style="color:var(--shiki-token-constant)"> __name__</span><span style="color:var(--shiki-token-keyword)"> ==</span><span style="color:var(--shiki-token-string-expression)"> &#x27;__main__&#x27;</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # AES-128</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 密钥不足128bits 添零，多余128bits 截取前128bits</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # messages 不足128bits的倍数 补零</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    m </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;https://blog.vhcffh.com&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    key </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;123456&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> AES</span><span style="color:var(--shiki-token-punctuation)">(key)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    cc </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Encrypt</span><span style="color:var(--shiki-token-punctuation)">(m)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    mm </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Decrypt</span><span style="color:var(--shiki-token-punctuation)">(cc)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;明文:&quot;</span><span style="color:var(--shiki-token-punctuation)">, end</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(m)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;密钥:&quot;</span><span style="color:var(--shiki-token-punctuation)">, end</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(a.K)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;密文:&quot;</span><span style="color:var(--shiki-token-punctuation)">, end</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print_bytes_hex</span><span style="color:var(--shiki-token-punctuation)">(cc)</span><span style="color:var(--shiki-token-comment)">  # 以bytes输出</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;解密:&quot;</span><span style="color:var(--shiki-token-punctuation)">, end</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(mm)</span></span>
<span class="line"></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://github.com/FreyZhang007/python-encrypt/blob/93090b37a92005781c01bf21921c632e35f50254/aes.py" target="_blank" rel="noopener noreferrer" class="rp-link">aes 加密 python 源码</a></li>
<li><a href="https://en.wikipedia.org/wiki/Advanced_Encryption_Standard" target="_blank" rel="noopener noreferrer" class="rp-link">Advanced Encryption Standard</a></li>
<li><a href="https://songlee24.github.io/2014/12/06/des-encrypt/" target="_blank" rel="noopener noreferrer" class="rp-link">DES 加密算法的 C++实现</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[python 实现 DES 加密]]></title>
        <id>/blog/2022/python-implements-DES-encryption</id>
        <link href="https://www.vhcffh.com/blog/2022/python-implements-DES-encryption"/>
        <updated>2022-11-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了数据加密标准（DES）算法，并用Python进行了实现。内容详细讲解了DES作为一种对称密钥算法的加密原理，包括初始置换、16轮迭代中的子密钥生成、密码函数f的核心运算（扩展、S盒、P置换）以及最后的尾置换，并提供了完整的Python代码。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="python-实现-des-加密"><a href="#python-实现-des-加密" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python 实现 DES 加密<!-- --> </h1>
<h2 class="rp-toc-include" id="des-算法原理"><a href="#des-算法原理" class="rp-header-anchor rp-link" aria-hidden="true">#</a>DES 算法原理</h2>
<p>DES 算法是一种最通用的对称密钥算法，因为算法本身是公开的，所以其安全性取决于密钥的安全性。
基于密钥的算法通常有两类：对称算法和公开密钥算法。
对称算法的对称性体现在加密密钥能够从解密密钥推算出来，反之亦然。
在大多数对称算法中，加解密的密钥是相同的，DES 就是这样。
可见，对称密钥算法的加解密密钥都是保密的。
而公开密钥算法的密钥有两个（公钥和私钥），公钥是公开的，私钥是保密的。</p>
<p>下面是 DES 加密算法的整体流程图：</p>
<p><img alt="DES" src="/static/image/des.926fb03323.png"/></p>
<p>从上面的流程图可以看出，DES 加密主要由四个部分完成：</p>
<ol>
<li>初始置换 IP</li>
<li>子密钥 Ki 的获取</li>
<li>密码函数 f</li>
<li>尾置换 FP</li>
</ol>
<p>其中，第二部分和第三部分是 DES 算法的核心。
注意：DES 解密算法与加密算法完全相同，只需要将子密钥的使用顺序反过来就行了。</p>
<p>下面针对这四个步骤分别讲一下大致思路。</p>
<h3 class="rp-toc-include" id="1初始置换-ip"><a href="#1初始置换-ip" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.初始置换 IP</h3>
<p>这一部分很简单，IP（initial permutation）是一个 8x8 的置换表：</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">IP </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">58</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      60</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 52</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 36</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      62</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 54</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 46</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 38</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      64</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 56</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 48</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 40</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      57</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 49</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      59</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 51</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 35</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      61</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 53</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 45</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 37</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      63</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 55</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 47</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 39</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-foreground)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>根据表中的规定，将输入的 64 位明文重新进行排序，即将第 58 位放到第 1 位，第 50 位放到第 2 位……以此类推。
初始置换以后得到的是一个 64 位的输出。</p>
<h3 class="rp-toc-include" id="2子密钥-ki-的获取"><a href="#2子密钥-ki-的获取" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.子密钥 Ki 的获取</h3>
<p>下面是获取子密钥 Ki 的流程图：</p>
<p><img alt="Ki" src="/static/image/Ki.6cb95c683b.png"/></p>
<ul>
<li>用户输出的密钥是 64 位的，根据密钥置换表 PC-1，将 64 位变成 56 位密钥。（去掉了奇偶校验位）</li>
<li>将 PC-1 置换得到的 56 位密钥，分为前 28 位 C0 和后 28 位 D0，分别对它们进行循环左移，C0 左移得到 C1，D0 左移得到 D1。</li>
<li>将 C1 和 D1 合并成 56 位，然后通过 PC-2 表进行压缩置换，得到当前这一轮的 48 位子密钥 K1 。</li>
<li>然后对 C1 和 D1 进行左移和压缩置换，获取下一轮的子密钥……一共进行 16 轮，得到 16 个 48 位的子密钥。</li>
</ul>
<p>PC-1 和 PC-2 如下：</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">PC_1L </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">57</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 49</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 58</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 59</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 51</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 35</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 60</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 52</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 36</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">PC_1R </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">63</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 55</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 47</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 39</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 62</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 54</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 46</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 38</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 22</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 61</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 53</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 45</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 37</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">PC_2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 52</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 37</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 47</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 55</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 40</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 51</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 45</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 48</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 49</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 39</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 56</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 53</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        46</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 36</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-foreground)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="3密码函数-f"><a href="#3密码函数-f" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.密码函数 f</h3>
<p>下面是密码函数 f(R, K)的流程图：</p>
<p><img alt="f(R,K)" src="/static/image/f.39b4affed1.png"/></p>
<p>密码函数 f(R, K)接受两个输入：32 位的数据和 48 位的子密钥。然后：</p>
<ul>
<li>通过表 E 进行扩展置换，将输入的 32 位数据扩展为 48 位</li>
<li>将扩展后的 48 位数据与 48 位的子密钥进行异或运算</li>
<li>将异或得到的 48 位数据分成 8 个 6 位的块，每一个块通过对应的一个 S 表产生一个 4 位的输出。其中，每个 S 表都是 4 行 16 列。具体的置换过程如下：把 6 位输入中的第 1 位和第 6 位取出来行成一个两位的二进制数 x ，作为 Si 表中的行数（0<del>3）；把 6 位输入的中间 4 位构成另外一个二进制数 y，作为 Si 表的列数（0</del>15）；查出 Si 表中 x 行 y 列所对应的整数，将该整数转换为一个 4 位的二进制数</li>
<li>把通过 S 表置换得到的 8 个 4 位连在一起，形成一个 32 位的数据。然后将该 32 位数据通过表 P 进行置换（称为 P-置换），置换后得到一个仍然是 32 位的结果数据，这就是 f(R, K)函数的输出</li>
</ul>
<p>这部分用到了扩展置换表 E，8 个 S 表以及 P-置换表：</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">E </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">P </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     29</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">S </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [[[</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-foreground)">]]]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="4尾置换-fp"><a href="#4尾置换-fp" class="rp-header-anchor rp-link" aria-hidden="true">#</a>4.尾置换 FP</h3>
<p>合并 L16 和 R16 得到一个 64 位的数据，再经过尾置换后得到的就是 64 位的密文。
注意：要将 L16 和 R16 合并成 R16L16（即左右互换）。
尾置换表 FP 如下：</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">FP </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">40</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 48</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 56</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 64</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      39</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 47</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 55</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 63</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      38</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 46</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 54</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 62</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      37</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 45</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 53</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 61</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      36</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 52</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 60</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      35</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 51</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 59</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 58</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 49</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 57</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-foreground)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="python-实现"><a href="#python-实现" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python 实现</h2>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">IP </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">58</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      60</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 52</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 36</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      62</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 54</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 46</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 38</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      64</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 56</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 48</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 40</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      57</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 49</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      59</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 51</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 35</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      61</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 53</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 45</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 37</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      63</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 55</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 47</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 39</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">FP </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">40</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 48</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 56</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 64</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      39</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 47</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 55</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 63</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      38</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 46</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 54</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 62</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      37</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 45</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 53</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 61</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      36</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 52</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 60</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      35</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 51</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 59</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 58</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 49</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 57</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">E </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">P </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     29</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">     22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">S </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [[[</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-foreground)">]]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">     [[</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      [</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-foreground)">]]]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">PC_1L </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">57</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 49</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 25</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 58</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 59</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 51</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 35</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 60</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 52</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 36</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">PC_1R </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">63</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 55</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 47</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 39</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 62</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 54</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 46</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 38</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 22</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 61</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 53</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 45</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 37</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">         21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">PC_2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 19</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 26</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 27</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 52</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 37</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 47</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 55</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 40</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 51</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 45</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 48</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 49</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 39</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 56</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 53</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        46</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 36</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 29</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> Permute</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">block</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> b_len</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> PP</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 通过置换矩阵PP对block进行置换,b_len是块长度(位，bit)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    res </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-foreground)"> PP</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        res </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> res </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 1</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 第i-1的位置 即倒数第</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        res </span><span style="color:var(--shiki-token-keyword)">|=</span><span style="color:var(--shiki-foreground)"> (block </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-foreground)"> (b_len </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)"> i)) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">01</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> res</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> bytesToblocks</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">m</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 字节序列转换位blocks    b&#x27;\x00\x01\x02\x03\xff\xff\xff\xff&#x27; -&gt; [0x00010203,0xffffffff]</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    while</span><span style="color:var(--shiki-token-function)"> len</span><span style="color:var(--shiki-token-punctuation)">(m)</span><span style="color:var(--shiki-token-keyword)"> %</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        m </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;\x00&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    blocks </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> []</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(m) </span><span style="color:var(--shiki-token-keyword)">//</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        blocks</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">((m[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-punctuation)"> i] </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-token-punctuation)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-punctuation)"> (m[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-punctuation)"> i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">] </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">) </span><span style="color:var(--shiki-token-keyword)">|</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">                      (m[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-punctuation)"> i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">] </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-punctuation)"> (m[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-punctuation)"> i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">]))</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> blocks</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> blocksTobytes</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">blocks</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # blocks转换为字节序列    [0x00010203,0xffffffff] -&gt; b&#x27;\x00\x01\x02\x03\xff\xff\xff\xff&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    res </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-foreground)"> blocks</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        res </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">to_bytes</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">, byteorder</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;big&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-foreground)"> res</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">L </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> lambda</span><span style="color:var(--shiki-token-parameter)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> n</span><span style="color:var(--shiki-foreground)">: ((x </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> n) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">28</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-foreground)"> n))) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0fffffff</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 对一个28bits的数x进行循环左移n位</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> DES</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">object</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> F</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> block</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> subKeyid</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        &quot;&quot;&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        :param block: 32bits</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        :param subKeyid:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        :return: res: 32bits</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        &quot;&quot;&quot;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Permute</span><span style="color:var(--shiki-token-punctuation)">(block, </span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-punctuation)">, E)</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">subKs</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">subKeyid</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        res </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            res </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> res </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 4</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            yxxxxy </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (temp </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-foreground)"> i)) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3f</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            xxxx </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (yxxxxy </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1f</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            yy </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ((yxxxxy </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (yxxxxy </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">01</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            res </span><span style="color:var(--shiki-token-keyword)">|=</span><span style="color:var(--shiki-foreground)"> S</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">i</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-foreground)">[yy][xxxx]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        res </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Permute</span><span style="color:var(--shiki-token-punctuation)">(res, </span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-punctuation)">, P)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> res </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> __init__</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> K</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 通过密钥K生成实例</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">K </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> K</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">K_blocks </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> bytesToblocks</span><span style="color:var(--shiki-token-punctuation)">(K)</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 生成字密钥self.subKs[16]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">subKs </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> None</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">generate_subKs</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> Encrypt</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> m</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 加密</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        blocks </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> bytesToblocks</span><span style="color:var(--shiki-token-punctuation)">(m)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        cblocks </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> []</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(blocks) </span><span style="color:var(--shiki-token-keyword)">//</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 每个64bits的高32bits，低32bits</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            high</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> low </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> blocks</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-punctuation)">],</span><span style="color:var(--shiki-foreground)"> blocks</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 第一步：初始置换IP</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Permute</span><span style="color:var(--shiki-token-punctuation)">((high </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-punctuation)"> low, </span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">, IP)</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffffffffffff</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 第二步：获取 Li 和 Ri</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            high</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> low </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> temp </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> temp </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 第三步：共16轮迭代</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                high</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> low </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> low</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> (high </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">F</span><span style="color:var(--shiki-token-punctuation)">(low, j)</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 第四步：合并L16和R16，注意合并为 R16L16</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            high</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> low </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> low</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> high</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 第五步：末尾置换FP</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Permute</span><span style="color:var(--shiki-token-punctuation)">((high </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-punctuation)"> low, </span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">, FP)</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffffffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            high</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> low </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> temp </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> temp </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            cblocks</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(high)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            cblocks</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(low)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-token-function)"> blocksTobytes</span><span style="color:var(--shiki-token-punctuation)">(cblocks)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> Decrypt</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> e</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 解密</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        blocks </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> bytesToblocks</span><span style="color:var(--shiki-token-punctuation)">(e)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        cblocks </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> []</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(blocks) </span><span style="color:var(--shiki-token-keyword)">//</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 每个64bits的高32bits，低32bits</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            high</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> low </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> blocks</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-punctuation)">],</span><span style="color:var(--shiki-foreground)"> blocks</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 第一步：初始置换IP</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Permute</span><span style="color:var(--shiki-token-punctuation)">((high </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-punctuation)"> low, </span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">, IP)</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffffffffffff</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 第二步：获取 Li 和 Ri</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            high</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> low </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> temp </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> temp </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 第三步：共16轮迭代, 子密钥逆序</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                high</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> low </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> low</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> (high </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">F</span><span style="color:var(--shiki-token-punctuation)">(low, </span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-token-punctuation)"> j)</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 第四步：合并L16和R16，注意合并为 R16L16</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            high</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> low </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> low</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> high</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 第五步：末尾置换FP</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            temp </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Permute</span><span style="color:var(--shiki-token-punctuation)">((high </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-punctuation)"> low, </span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">, FP)</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffffffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            high</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> low </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> temp </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> temp </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            cblocks</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(high)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            cblocks</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(low)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-token-function)"> blocksTobytes</span><span style="color:var(--shiki-token-punctuation)">(cblocks)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> generate_subKs</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # print(bin((self.K_blocks[0] &lt;&lt; 32) | self.K_blocks[1])[2:].rjust(32, &#x27;0&#x27;))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        C </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Permute</span><span style="color:var(--shiki-token-punctuation)">((self.K_blocks[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">] </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-punctuation)"> self.K_blocks[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">], </span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">, PC_1L)</span><span style="color:var(--shiki-token-keyword)">  &amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0fffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        D </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Permute</span><span style="color:var(--shiki-token-punctuation)">((self.K_blocks[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">] </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-punctuation)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-punctuation)"> self.K_blocks[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">], </span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">, PC_1R)</span><span style="color:var(--shiki-token-keyword)">  &amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0fffffff</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # print(bin(C)[2:].rjust(28, &#x27;0&#x27;))</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # print(bin(D)[2:].rjust(28, &#x27;0&#x27;))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">subKs </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> []</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> D </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> L</span><span style="color:var(--shiki-token-punctuation)">(C, </span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">),</span><span style="color:var(--shiki-token-function)"> L</span><span style="color:var(--shiki-token-punctuation)">(D, </span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            else</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> D </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> L</span><span style="color:var(--shiki-token-punctuation)">(C, </span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">),</span><span style="color:var(--shiki-token-function)"> L</span><span style="color:var(--shiki-token-punctuation)">(D, </span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">subKs</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Permute</span><span style="color:var(--shiki-token-punctuation)">((C </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 28</span><span style="color:var(--shiki-token-punctuation)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-punctuation)"> D, </span><span style="color:var(--shiki-token-constant)">56</span><span style="color:var(--shiki-token-punctuation)">, PC_2))</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # print(hex(self.subKs[i]))</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> getK</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 返回密钥K</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">K</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> generateK</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 随机产生密钥K</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        pass</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> print_bytes_hex</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">m</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-foreground)"> m</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">hex</span><span style="color:var(--shiki-token-punctuation)">(i)[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">:].</span><span style="color:var(--shiki-token-function)">rjust</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-string-expression)">&#x27;0&#x27;</span><span style="color:var(--shiki-token-punctuation)">), end</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">if</span><span style="color:var(--shiki-token-constant)"> __name__</span><span style="color:var(--shiki-token-keyword)"> ==</span><span style="color:var(--shiki-token-string-expression)"> &#x27;__main__&#x27;</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 密钥不足64bits 添零，多于64bits 使用前64bits</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # messages 不足64bits的倍数 补零</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    m </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;https://blog.vhcffh.com&#x27;</span><span style="color:var(--shiki-token-comment)"> # 明文</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    k </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> b</span><span style="color:var(--shiki-token-string-expression)">&#x27;123456&#x27;</span><span style="color:var(--shiki-token-comment)"> # 密钥</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> DES</span><span style="color:var(--shiki-token-punctuation)">(k)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    cc </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Encrypt</span><span style="color:var(--shiki-token-punctuation)">(m)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    mm </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Decrypt</span><span style="color:var(--shiki-token-punctuation)">(cc)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;明文:&quot;</span><span style="color:var(--shiki-token-punctuation)">, end</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(m)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;密钥:&quot;</span><span style="color:var(--shiki-token-punctuation)">, end</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(a.K)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;密文:&quot;</span><span style="color:var(--shiki-token-punctuation)">, end</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print_bytes_hex</span><span style="color:var(--shiki-token-punctuation)">(cc)</span><span style="color:var(--shiki-token-comment)">  # 以bytes输出</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;解密:&quot;</span><span style="color:var(--shiki-token-punctuation)">, end</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(mm)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://github.com/FreyZhang007/python-encrypt/blob/93090b37a92005781c01bf21921c632e35f50254/des.py" target="_blank" rel="noopener noreferrer" class="rp-link">des 加密 python 源码</a></li>
<li><a href="http://www.hankcs.com/security/des-algorithm-illustrated.html" target="_blank" rel="noopener noreferrer" class="rp-link">DES 算法实例详解</a></li>
<li><a href="https://songlee24.github.io/2014/12/06/des-encrypt/" target="_blank" rel="noopener noreferrer" class="rp-link">DES 加密算法的 C++实现</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[树莓派文件系统只读]]></title>
        <id>/blog/2022/树莓派文件系统只读</id>
        <link href="https://www.vhcffh.com/blog/2022/树莓派文件系统只读"/>
        <updated>2022-10-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文解决了新烧录的树莓派镜像文件系统变为只读的问题。核心方法是进入单用户模式，使用`lsblk`找到根分区，卸载该分区后，通过`fsck.ext4 -y`命令对其进行检查和修复。修复完成后重启系统即可恢复文件系统的正常读写功能。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="树莓派文件系统只读"><a href="#树莓派文件系统只读" class="rp-header-anchor rp-link" aria-hidden="true">#</a>树莓派文件系统只读<!-- --> </h1>
<h3 class="rp-toc-include" id="问题原因"><a href="#问题原因" class="rp-header-anchor rp-link" aria-hidden="true">#</a>问题原因</h3>
<p>新烧录树莓派镜像后，文件系统变为只读</p>
<h3 class="rp-toc-include" id="解决方法"><a href="#解决方法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>解决方法</h3>
<p>需要进入单用户模式，使用<code>fsck</code>命令对文件系统进行修复</p>
<p>具体操作步骤</p>
<ol>
<li>进入单用户模式</li>
</ol>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-comment)"># 切换到root用户</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> su</span><span style="color:var(--shiki-token-string)"> root</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 进入单用户模式</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">init</span><span style="color:var(--shiki-token-constant)"> 1</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 可以通过此命令查看当前系统运行模式</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">runlevel</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ol start="2">
<li>使用<code>fsck</code>命令对文件系统进行修复, 主要修复根目录所在分区</li>
</ol>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-comment)"># 查看当前文件硬盘</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">lsblk</span><span style="color:var(--shiki-foreground)"> </span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># sda                 8:0    0 465.8G  0 disk</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># └─sda1              8:1    0 465.8G  0 part /mnt/disk1</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># mmcblk0             179:0    0  14.8G  0 disk</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># ├─mmcblk0p1         179:1    0 213.6M  0 part /boot</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># └─mmcblk0p2         179:2    0  14.6G  0 part /</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 卸载需要修复的分区</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">umount</span><span style="color:var(--shiki-token-string)"> /dev/mmcblk0p2</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 对文件系统修复,一路确认即可</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">fsck.ext4</span><span style="color:var(--shiki-token-string)"> -y</span><span style="color:var(--shiki-token-string)"> /dev/mmcblk0p2</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ol start="3">
<li>重启系统</li>
</ol>
<p>重启后尽量在重启一次</p>
<p>如果仍然只读，可尝试重新再修复一次</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[常见 Hash 算法]]></title>
        <id>/blog/2022/Hash-algorithm</id>
        <link href="https://www.vhcffh.com/blog/2022/Hash-algorithm"/>
        <updated>2022-10-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了常见的哈希算法，如MD5和SHA256。内容阐述了哈希算法将任意长度输入映射为固定长度输出的原理及其在安全加密、数据校验等领域的应用。文章还深入分析了MD5和SHA256的内部运算流程，并提供了完整的Python实现代码。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="常见-hash-算法"><a href="#常见-hash-算法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>常见 Hash 算法<!-- --> </h1>
<h2 class="rp-toc-include" id="什么是-hash-算法"><a href="#什么是-hash-算法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>什么是 hash 算法</h2>
<p>Hash 算法又称散列算法，特点是把任意长度的输出，通过一些列的计算后变成固定长度的输出，这个输出值即为散列值。由于散列值的空间远小于输出空间，因此存在不同输入得到相同输出的情况，这种现象称为碰撞。</p>
<h2 class="rp-toc-include" id="hash-算法的应用"><a href="#hash-算法的应用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>hash 算法的应用</h2>
<p>hash 算法应用广泛，主要有七个方面：安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储。不同的应用利用的 hash 算法不同的特性，具体的算法实现也需要根据情况设计。比较常见的实现有 md5，sha256 等。本文通过这两个算法来研究具体的实现。</p>
<h2 class="rp-toc-include" id="md5"><a href="#md5" class="rp-header-anchor rp-link" aria-hidden="true">#</a>MD5</h2>
<p>Md5 算法将输入的不定长数据分为 512bit 的块，并对每个块循环调用 MD5 运算。</p>
<p><img alt="md5" src="/static/image/md5.6665161e8d.png"/></p>
<p>一个 MD5 运算由类似的 64 次循环构成，分成 4 组 16 次。F 是一个非线性函数；一个函数运算一次。Mi 表示一个 32-bits 的输入数据，Ki 表示一个 32-bits 常数，用来完成每次不同的计算。</p>
<h2 class="rp-toc-include" id="md5-的-python-实现"><a href="#md5-的-python-实现" class="rp-header-anchor rp-link" aria-hidden="true">#</a>md5 的 python 实现</h2>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> Md5sum</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">message</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 定义常量，用于初始化128位变量，注意字节顺序，A=0x01234567，这里低值存放低字节，</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 即01 23 45 67，所以运算时A=0x67452301，其他类似。</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 用字符串的形势，是为了和hex函数的输出统一，hex(10)输出为&#x27;0xA&#x27;,注意结果为字符串。</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h0 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">67452301</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">efcdab89</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">98badcfe</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h3 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">10325476</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 定义每轮中循环左移的位数，用元组表示 4*4*4=64</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    R </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 22</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-punctuation)"> \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        (</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 4</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 定义常数K 64</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # K[i] = (int(abs(math.sin(i + 1)) * 2 ** 32)) &amp; 0xffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    K </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">d76aa478</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">e8c7b756</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">242070db</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">c1bdceee</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">f57c0faf</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4787c62a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">a8304613</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">fd469501</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">698098d8</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">8b44f7af</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffff5bb1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">895cd7be</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">6b901122</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">fd987193</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">a679438e</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">49b40821</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">f61e2562</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">c040b340</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">265e5a51</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">e9b6c7aa</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">d62f105d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">02441453</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">d8a1e681</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">e7d3fbc8</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">21e1cde6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">c33707d6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">f4d50d87</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">455a14ed</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">a9e3e905</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">fcefa3f8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">676f02d9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8d2a4c8a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">fffa3942</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8771f681</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">6d9d6122</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">fde5380c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">a4beea44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4bdecfa9</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">f6bb4b60</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">bebfbc70</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">289b7ec6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">eaa127fa</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">d4ef3085</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">04881d05</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">d9d4d039</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">e6db99e5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1fa27cf8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">c4ac5665</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">f4292244</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">432aff97</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ab9423a7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">fc93a039</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">655b59c3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8f0ccc92</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">ffeff47d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">85845dd1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">6fa87e4f</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">fe2ce6e0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">a3014314</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">4e0811a1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">f7537e82</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">bd3af235</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2ad7d2bb</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">eb86d391</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 定义每轮中用到的函数。L为循环左移，</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 左移之后可能会超过32位，所以要和0xffffffff做与运算，确保结果为32位。</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    F </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> lambda</span><span style="color:var(--shiki-token-parameter)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> y</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> z</span><span style="color:var(--shiki-foreground)">: ((x </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> y) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> ((</span><span style="color:var(--shiki-token-keyword)">~</span><span style="color:var(--shiki-foreground)">x) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> z))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    G </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> lambda</span><span style="color:var(--shiki-token-parameter)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> y</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> z</span><span style="color:var(--shiki-foreground)">: ((x </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> z) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (y </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">~</span><span style="color:var(--shiki-foreground)">z)))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    H </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> lambda</span><span style="color:var(--shiki-token-parameter)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> y</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> z</span><span style="color:var(--shiki-foreground)">: (x </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> y </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> z)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    I </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> lambda</span><span style="color:var(--shiki-token-parameter)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> y</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> z</span><span style="color:var(--shiki-foreground)">: (y </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> (x </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">~</span><span style="color:var(--shiki-foreground)">z)))</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    L </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> lambda</span><span style="color:var(--shiki-token-parameter)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> n</span><span style="color:var(--shiki-foreground)">: ((x </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> n) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-foreground)"> n))) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 小端  0x12,0x34,0x56,0x78 -&gt; 0x78563412</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 将四个8位无符号数转化为一个32位无符号数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    W </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> lambda</span><span style="color:var(--shiki-token-parameter)"> i4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> i3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> i2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> i1</span><span style="color:var(--shiki-foreground)">: (i1 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (i2 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (i3 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> i4</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 字节翻转 0x12345678 -&gt; 0x78563412 将一个32位无符号数的高位和低位进行对换</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    reverse </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> lambda</span><span style="color:var(--shiki-token-parameter)"> x</span><span style="color:var(--shiki-foreground)">: (x </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ff000000</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-foreground)"> (x </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">00ff0000</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-punctuation)"> \</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                        (x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0000ff00</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-foreground)"> (x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">000000ff</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 对每一个输入先添加一个&#x27;0x80&#x27;，即&#x27;10000000&#x27;, 即128</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    ascii_list </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> list</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">map</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">lambda</span><span style="color:var(--shiki-token-parameter)"> x</span><span style="color:var(--shiki-token-punctuation)">: x, message))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    msg_length </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> len</span><span style="color:var(--shiki-token-punctuation)">(ascii_list)</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-constant)"> 8</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    ascii_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">128</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 补充0</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    while</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(ascii_list)</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-constant)"> 64</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-token-constant)"> 512</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        ascii_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 最后64为存放消息长度，以小端数存放。</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 例如，消息为&#x27;a&#x27;，则长度是8，则添加&#x27;0x0800000000000000&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        ascii_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">((msg_length </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-punctuation)"> (</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-punctuation)"> i)) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ff</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # print(ascii_list)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # print(len(ascii_list)//64)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 对每一消息块进行迭代</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(ascii_list) </span><span style="color:var(--shiki-token-keyword)">//</span><span style="color:var(--shiki-token-constant)"> 64</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # print(ascii_list[i*64:(i+1)*64])</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 对每一个消息块进行循环，每个消息块512bits=16*32bits=64*8bits</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> h0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h3</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 64轮的主循环</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-keyword)"> &lt;=</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">&lt;=</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                f </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> F</span><span style="color:var(--shiki-token-punctuation)">(b, c, d)</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                g </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> j</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            elif</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-keyword)"> &lt;=</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">&lt;=</span><span style="color:var(--shiki-token-constant)"> 31</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                f </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> G</span><span style="color:var(--shiki-token-punctuation)">(b, c, d)</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                g </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ((</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)"> j) </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-token-constant)"> 16</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            elif</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-token-keyword)"> &lt;=</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">&lt;=</span><span style="color:var(--shiki-token-constant)"> 47</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                f </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> H</span><span style="color:var(--shiki-token-punctuation)">(b, c, d)</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                g </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ((</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)"> j) </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-token-constant)"> 16</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            else</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                f </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> I</span><span style="color:var(--shiki-token-punctuation)">(b, c, d)</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                g </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)"> j) </span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-token-constant)"> 16</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            aa</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> dd</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> cc </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> b</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # 第i个chunk，第g个32-bit</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            s </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 64</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> g </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 4</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            w </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> W</span><span style="color:var(--shiki-token-punctuation)">(ascii_list[s], ascii_list[s </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">], ascii_list[s </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">], ascii_list[s </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            bb </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">L</span><span style="color:var(--shiki-token-punctuation)">((a </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-punctuation)"> f </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-punctuation)"> K[j] </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-punctuation)"> w) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span><span style="color:var(--shiki-token-punctuation)">, R[j])</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> b) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> aa</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> bb</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> cc</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> dd</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # print(b)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h0 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h0 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> a) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h1 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> b) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h2 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> c) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h3 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h3 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> d) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h3 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> reverse</span><span style="color:var(--shiki-token-punctuation)">(h0),</span><span style="color:var(--shiki-token-function)"> reverse</span><span style="color:var(--shiki-token-punctuation)">(h1),</span><span style="color:var(--shiki-token-function)"> reverse</span><span style="color:var(--shiki-token-punctuation)">(h2),</span><span style="color:var(--shiki-token-function)"> reverse</span><span style="color:var(--shiki-token-punctuation)">(h3)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    digest </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h0 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 96</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (h1 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 64</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (h2 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> h3</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-function)"> hex</span><span style="color:var(--shiki-token-punctuation)">(digest)</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">rjust</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-string-expression)">&#x27;0&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">if</span><span style="color:var(--shiki-token-constant)"> __name__</span><span style="color:var(--shiki-token-keyword)"> ==</span><span style="color:var(--shiki-token-string-expression)"> &#x27;__main__&#x27;</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;自己实现md5(b&#x27;https://blog.vhcffh.com&#x27;)&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Md5sum</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">b</span><span style="color:var(--shiki-token-string-expression)">&quot;https://blog.vhcffh.com&quot;</span><span style="color:var(--shiki-token-punctuation)">))</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-foreground)"> hashlib</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    t </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> hashlib</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">md5</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    t</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">update</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">b</span><span style="color:var(--shiki-token-string-expression)">&quot;https://blog.vhcffh.com&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;调用hashlib库md5(b&#x27;https://blog.vhcffh.com&#x27;)&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(t.</span><span style="color:var(--shiki-token-function)">hexdigest</span><span style="color:var(--shiki-token-punctuation)">())</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="shell-命令-md5sum"><a href="#shell-命令-md5sum" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Shell 命令 md5sum</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">$</span><span style="color:var(--shiki-token-string)"> echo</span><span style="color:var(--shiki-token-string-expression)"> &quot;blog.vhcffh.com&quot;</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> md5sum</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">6f5902ac237024bdd0c176cb93063dc4</span><span style="color:var(--shiki-token-string)">  -</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">$</span><span style="color:var(--shiki-token-string)"> md5sum</span><span style="color:var(--shiki-token-string)"> test.txt</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">6f5902ac237024bdd0c176cb93063dc4</span><span style="color:var(--shiki-token-string)">  test.txt</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="sha256"><a href="#sha256" class="rp-header-anchor rp-link" aria-hidden="true">#</a>SHA256</h2>
<p>SHA256 是安全散列算法 2（SHA-2，Secure Hash Algorithm 2）中的一个算法标准，由<a href="https://zh.wikipedia.org/wiki/%E7%BE%8E%E5%9B%BD%E5%9B%BD%E5%AE%B6%E6%A0%87%E5%87%86%E4%B8%8E%E6%8A%80%E6%9C%AF%E7%A0%94%E7%A9%B6%E9%99%A2" target="_blank" rel="noopener noreferrer" class="rp-link">美国国家标准与技术研究院</a>（NIST）在 2001 年发布。</p>
<p><img alt="sha256" src="/static/image/sha256.139da200b0.png"/></p>
<p>SHA-2 的第 t 个加密循环。图中的深蓝色方块是事先定义好的非线性函数。ABCDEFGH 一开始分别是八个初始值，Kt 是第 t 个密钥，Wt 是本区块产生第 t 个 word。原消息被切成固定长度的区块，对每一个区块，产生 n 个 word（n 视算法而定），透过重复运作循环 n 次对 ABCDEFGH 这八个工作区段循环加密。最后一次循环所产生的八段字符串合起来即是此区块对应到的散列字符串。若原消息包含数个区块，则最后还要将这些区块产生的散列字符串加以混合才能产生最后的散列字符串。</p>
<h3 class="rp-toc-include" id="sha256-的-python-实现"><a href="#sha256-的-python-实现" class="rp-header-anchor rp-link" aria-hidden="true">#</a>SHA256 的 python 实现</h3>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">def</span><span style="color:var(--shiki-token-function)"> Sha256sum</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">message</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-punctuation)">-&gt;</span><span style="color:var(--shiki-token-constant)"> bytes</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 定义常量</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 前8个素数2..19的平方根的小数部分的前32位</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h0 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">6a09e667</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">bb67ae85</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3c6ef372</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h3 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">a54ff53a</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h4 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">510e527f</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h5 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9b05688c</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h6 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1f83d9ab</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    h7 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5be0cd19</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 定义常数K 64</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 前64个素数2..311的立方根的小数部分的前32位</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    K </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">0x</span><span style="color:var(--shiki-token-constant)">428a2f98</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">71374491</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">b5c0fbcf</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">e9b5dba5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">3956c25b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">59f111f1</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">923f82a4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ab1c5ed5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">d807aa98</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">12835b01</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">243185be</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">550c7dc3</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">72be5d74</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">80deb1fe</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">9bdc06a7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">c19bf174</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">e49b69c1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">efbe4786</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">0fc19dc6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">240ca1cc</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2de92c6f</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4a7484aa</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">5cb0a9dc</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">76f988da</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">983e5152</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">a831c66d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">b00327c8</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">bf597fc7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">c6e00bf3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">d5a79147</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">06ca6351</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">14292967</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">27b70a85</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2e1b2138</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4d2c6dfc</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">53380d13</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">650a7354</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">766a0abb</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">81c2c92e</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">92722c85</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">a2bfe8a1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">a81a664b</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">c24b8b70</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">c76c51a3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">d192e819</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">d6990624</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">f40e3585</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">106aa070</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">19a4c116</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">1e376c08</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">2748774c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">34b0bcb5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">391c0cb3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">4ed8aa4a</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">5b9cca4f</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">682e6ff3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">748f82ee</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">78a5636f</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">84c87814</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">8cc70208</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         0x</span><span style="color:var(--shiki-token-constant)">90befffa</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">a4506ceb</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">bef9a3f7</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">c67178f2</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # R为循环右移，</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 右移之后可能会超过32位，所以要和0xffffffff做与运算，确保结果为32位。</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    R </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> lambda</span><span style="color:var(--shiki-token-parameter)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> n</span><span style="color:var(--shiki-foreground)">: ((x </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-foreground)"> n) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (x </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-foreground)"> n))) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 大端  0x12,0x34,0x56,0x78 -&gt; 0x12345678</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    W </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> lambda</span><span style="color:var(--shiki-token-parameter)"> i1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> i2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> i3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> i4</span><span style="color:var(--shiki-foreground)">: (i1 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 24</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (i2 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (i3 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> i4</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 对每一个输入先添加一个&#x27;0x80&#x27;，即&#x27;10000000&#x27;, 即128</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    ascii_list </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> list</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">map</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">lambda</span><span style="color:var(--shiki-token-parameter)"> x</span><span style="color:var(--shiki-token-punctuation)">: x, message))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    msg_length </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> len</span><span style="color:var(--shiki-token-punctuation)">(ascii_list)</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-constant)"> 8</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    ascii_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">128</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 补充0</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    while</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(ascii_list)</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-constant)"> 64</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-token-constant)"> 512</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        ascii_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 最后64为存放消息长度，以大端数存放。</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # 例如，消息为&#x27;a&#x27;，则长度为&#x27;0x0000000000000008&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        ascii_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(msg_length </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-punctuation)"> (</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-punctuation)"> (</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-token-punctuation)"> i)) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ff</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # print(ascii_list)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # print(len(ascii_list)//64)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(ascii_list) </span><span style="color:var(--shiki-token-keyword)">//</span><span style="color:var(--shiki-token-constant)"> 64</span><span style="color:var(--shiki-token-punctuation)">):</span><span style="color:var(--shiki-token-comment)">  # 64*8=512bits</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # print(ascii_list[i*64:(i+1)*64])</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 每个512bits的块进行循环</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        w </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> []</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 将512bits扩展到64*32bits=2048bits存入32位无符号数数组</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            s </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 64</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)"> 4</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            w</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">W</span><span style="color:var(--shiki-token-punctuation)">(ascii_list[s], ascii_list[s </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-punctuation)">], ascii_list[s </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">], ascii_list[s </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-token-punctuation)">]))</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            s0 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">R</span><span style="color:var(--shiki-token-punctuation)">(w[j </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">], </span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">R</span><span style="color:var(--shiki-token-punctuation)">(w[j </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">], </span><span style="color:var(--shiki-token-constant)">18</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> (w</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">j </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> &gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 3</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            s1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">R</span><span style="color:var(--shiki-token-punctuation)">(w[j </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">], </span><span style="color:var(--shiki-token-constant)">17</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">R</span><span style="color:var(--shiki-token-punctuation)">(w[j </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">], </span><span style="color:var(--shiki-token-constant)">19</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> (w</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">j </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> &gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            w</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">((w[j </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-token-punctuation)">] </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-punctuation)"> s0 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-punctuation)"> w[j </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-token-punctuation)">] </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-punctuation)"> s1) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            # print(hex(s0)+&#x27;:&#x27;+hex(s1)+&#x27;:&#x27; + hex(R(w[j - 2], 17)))</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # 初始化</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> e</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> f</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> g</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> h0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h6</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> h7</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # for j in w:</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        #    print(hex(j)[2:])</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            s0 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> R</span><span style="color:var(--shiki-token-punctuation)">(a, </span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> R</span><span style="color:var(--shiki-token-punctuation)">(a, </span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> R</span><span style="color:var(--shiki-token-punctuation)">(a, </span><span style="color:var(--shiki-token-constant)">22</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            maj </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (a </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> b) </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> (a </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> c) </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> (b </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> c)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            t2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> s0 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> maj</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            s1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> R</span><span style="color:var(--shiki-token-punctuation)">(e, </span><span style="color:var(--shiki-token-constant)">6</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> R</span><span style="color:var(--shiki-token-punctuation)">(e, </span><span style="color:var(--shiki-token-constant)">11</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-keyword)"> ^</span><span style="color:var(--shiki-token-function)"> R</span><span style="color:var(--shiki-token-punctuation)">(e, </span><span style="color:var(--shiki-token-constant)">25</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            ch </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (e </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> f) </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> ((</span><span style="color:var(--shiki-token-keyword)">~</span><span style="color:var(--shiki-foreground)">e) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> g)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            t1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> h </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> s1 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> ch </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> K</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">j</span><span style="color:var(--shiki-token-punctuation)">]</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> w</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">j</span><span style="color:var(--shiki-token-punctuation)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            h </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> g </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            g </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> f </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            f </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> e </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            e </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (d </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> t1) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> c </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (t1 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> t2) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h0 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h0 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> a) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h1 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> b) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h2 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> c) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h3 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h3 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> d) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h4 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h4 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> e) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h5 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h5 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> f) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h6 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h6 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> g) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        h7 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h7 </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> h) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">ffffffff</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    digest </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (h0 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 224</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (h1 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 192</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (h2 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 160</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (h3 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 128</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    digest </span><span style="color:var(--shiki-token-keyword)">|=</span><span style="color:var(--shiki-foreground)"> (h4 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 96</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (h5 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 64</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (h6 </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)"> 32</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> h7</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    # print(hex(digest)[2:])  # .rjust(32, &#x27;0&#x27;))</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-function)"> hex</span><span style="color:var(--shiki-token-punctuation)">(digest)</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)">]  </span><span style="color:var(--shiki-token-comment)"># .rjust(32, &#x27;0&#x27;)</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">if</span><span style="color:var(--shiki-token-constant)"> __name__</span><span style="color:var(--shiki-token-keyword)"> ==</span><span style="color:var(--shiki-token-string-expression)"> &#x27;__main__&#x27;</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;自己实现sha256(https://blog.vhcffh.com)&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">Sha256sum</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">b</span><span style="color:var(--shiki-token-string-expression)">&quot;https://blog.vhcffh.com&quot;</span><span style="color:var(--shiki-token-punctuation)">))</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-foreground)"> hashlib</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    t </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> hashlib</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">sha256</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    t</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">update</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">b</span><span style="color:var(--shiki-token-string-expression)">&quot;https://blog.vhcffh.com&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;调用hashlib库sha256(https://blog.vhcffh.com)&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(t.</span><span style="color:var(--shiki-token-function)">hexdigest</span><span style="color:var(--shiki-token-punctuation)">())</span></span>
<span class="line"></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="shell-命令-md5sum-1"><a href="#shell-命令-md5sum-1" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Shell 命令 md5sum</h3>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">$</span><span style="color:var(--shiki-token-string)"> echo</span><span style="color:var(--shiki-token-string-expression)"> &quot;blog.vhcffh.com&quot;</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> sha256sum</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447</span><span style="color:var(--shiki-token-string)">  -</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">$</span><span style="color:var(--shiki-token-string)"> sha256sum</span><span style="color:var(--shiki-token-string)"> test.txt</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447</span><span style="color:var(--shiki-token-string)">  test.txt</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://phukety.github.io/2020/11/30/Hash-algorithm/" target="_blank" rel="noopener noreferrer" class="rp-link">Hash 算法及相关应用 | Phukety 的个人博客</a></li>
<li><a href="https://github.com/yangchong211/YCBlogs/blob/master/leetcode/12.Hash/02.%E5%93%88%E5%B8%8C%E7%AE%97%E6%B3%95%E5%BA%94%E7%94%A8.md" target="_blank" rel="noopener noreferrer" class="rp-link">YCBlogs/02.哈希算法应用.md</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[CSS flex 布局]]></title>
        <id>/blog/2022/CSS-flex-layout</id>
        <link href="https://www.vhcffh.com/blog/2022/CSS-flex-layout"/>
        <updated>2022-08-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文总结了CSS中Flex弹性布局的常用属性。内容涵盖了主轴方向（flex-direction）、换行（flex-wrap）、对齐方式（justify-content、align-items）以及项目的放大（flex-grow）和缩小（flex-shrink）比例等，为快速掌握Flex布局提供了清晰的语法参考。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="css-flex-布局"><a href="#css-flex-布局" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CSS flex 布局<!-- --> </h1>
<h2 class="rp-toc-include" id="flex-direction"><a href="#flex-direction" class="rp-header-anchor rp-link" aria-hidden="true">#</a>flex-direction</h2>
<p>决定主轴方向
<code>row</code>,<code>row-reverse</code>,<code>colum</code>,<code>colum-reverse</code></p>
<h2 class="rp-toc-include" id="flex-wrap"><a href="#flex-wrap" class="rp-header-anchor rp-link" aria-hidden="true">#</a>flex-wrap</h2>
<p>是否换行
<code>nowrap</code>,<code>wrap</code>,<code>wrap-reverse</code></p>
<h2 class="rp-toc-include" id="flex-flow"><a href="#flex-flow" class="rp-header-anchor rp-link" aria-hidden="true">#</a>flex-flow</h2>
<p>flex-direction属性和flex-wrap属性的简写形式</p>
<h2 class="rp-toc-include" id="justify-content"><a href="#justify-content" class="rp-header-anchor rp-link" aria-hidden="true">#</a>justify-content</h2>
<p>对齐方式
<code>flex-start</code>,<code>flex-end</code>,<code>center</code>,<code>space-between</code>,<code>space-around</code></p>
<h2 class="rp-toc-include" id="align-items"><a href="#align-items" class="rp-header-anchor rp-link" aria-hidden="true">#</a>align-items</h2>
<p>在交叉轴上的对齐方式
<code>flex-start</code>,<code>flex-end</code>,<code>center</code>,<code>baseline</code>,<code>stretch</code></p>
<h2 class="rp-toc-include" id="align-content"><a href="#align-content" class="rp-header-anchor rp-link" aria-hidden="true">#</a>align-content</h2>
<p>定义多根轴线的对齐方式
<code>flex-start</code>,<code>flex-end</code>,<code>center</code>,<code>space-between</code>,<code>space-around</code>,<code>stretch</code></p>
<h2 class="rp-toc-include" id="flex-basis"><a href="#flex-basis" class="rp-header-anchor rp-link" aria-hidden="true">#</a>flex-basis</h2>
<p><code>flex-basis: number|auto|initial|inherit;</code></p>
<p><code>flex-basis</code>设置弹性项目的初始长度。</p>

























<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>number</td><td>长度单位或百分百，规定弹性项目的初始长度。</td></tr><tr><td>auto</td><td>默认值。长度等于弹性项目的长度。如果该项目未规定长度，则长度将依据其内容。</td></tr><tr><td>initial</td><td>将此属性设置为其默认值。</td></tr><tr><td>inherit</td><td>从其父元素继承此属性。</td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="flex-grow"><a href="#flex-grow" class="rp-header-anchor rp-link" aria-hidden="true">#</a>flex-grow</h2>
<p><code>flex-grow: number|initial|inherit;</code>
<code>flex-grow</code>属性规定在相同的容器中，项目相对于其余弹性项目的增长量。</p>





















<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>number</td><td>一个数字，规定项目相对于其他灵活的项目进行扩展的量。默认值是 0。</td></tr><tr><td>initial</td><td>将此属性设置为其默认值。</td></tr><tr><td>inherit</td><td>从其父元素继承此属性。</td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="flex-shrink"><a href="#flex-shrink" class="rp-header-anchor rp-link" aria-hidden="true">#</a>flex-shrink</h2>
<p><code>flex-shrink: number|initial|inherit;</code>
<code>flex-shrink</code>属性规定当项目溢出时，按比例对所有项目进行空间收缩。</p>





















<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>值</th><th>描述</th></tr></thead><tbody><tr><td>number</td><td>一个数字，规定项目相对于其他灵活的项目进行扩展的量。默认值是 0。</td></tr><tr><td>initial</td><td>将此属性设置为其默认值。</td></tr><tr><td>inherit</td><td>从其父元素继承此属性。</td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<p>1.<a href="https://www.runoob.com/w3cnote/flex-grammar.html" target="_blank" rel="noopener noreferrer" class="rp-link">Flex布局语法教程|菜鸟教程</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[动态库与静态库]]></title>
        <id>/blog/2022/Static-and-Dynamic-Libraries</id>
        <link href="https://www.vhcffh.com/blog/2022/Static-and-Dynamic-Libraries"/>
        <updated>2022-08-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文总结了C/C++中静态库与动态库的使用方法。内容详细对比了两种链接方式的优缺点，并以Linux环境为例，通过具体代码和编译命令，演示了如何创建（.a和.so文件）、链接和运行使用静态库与动态库的程序，还提及了运行时加载动态库的方法。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="动态库与静态库"><a href="#动态库与静态库" class="rp-header-anchor rp-link" aria-hidden="true">#</a>动态库与静态库<!-- --> </h1>
<h3 class="rp-toc-include" id="链接库"><a href="#链接库" class="rp-header-anchor rp-link" aria-hidden="true">#</a>链接库</h3>
<p>链接库的行为是代码依赖管理的一种形式。
当任何应用程序运行时，其可执行代码都会加载到内存中。
此外，它所依赖的任何代码库也会加载到内存中。
有两种类型的链接：静态的和动态的。
两者都为开发人员提供了不同的好处，应该根据这些好处来选择合适的链接方式。
这篇博文将介绍每种方法提供的好处，然后解释如何在Linux上创建和链接您自己的库的基础知识。</p>
<hr/>
<h3 class="rp-toc-include" id="动态链接"><a href="#动态链接" class="rp-header-anchor rp-link" aria-hidden="true">#</a>动态链接</h3>
<p>链接动态库时，没有任何库代码直接包含在链接目标中。
相反，在解析符号之前，这些库会在运行时加载到内存中。
因为代码不是静态链接到可执行二进制文件中的，所以在运行时加载有一些好处。
主要是，可以使用新功能或错误修复来更新库，而无需重新编译和重新链接可执行文件。
此外，在运行时加载意味着各个代码库可以拥有自己的初始化程序，并在从内存中卸载之前在自己的任务之后进行清理。</p>
<h4 class="rp-toc-include" id="动态库"><a href="#动态库" class="rp-header-anchor rp-link" aria-hidden="true">#</a>动态库</h4>
<p>动态库是一种 Mach-O 二进制文件，在应用程序启动或运行时加载。
由于动态库中的可执行代码不是静态链接到目标可执行文件，因此在需要重用相同代码时提供了一些好处。
例如，如果您有一个应用程序和一个守护程序或扩展程序需要使用相同的代码，那么该代码只需要存在于一个位置——动态库中，而不是同时存在于可执行文件的二进制文件和守护程序的二进制文件中。
由于动态库是在运行时加载的，因此库负责告诉链接器需要哪些附加代码。
这消除了管理您使用的所有代码需要操作的负担。
接下来通过一个简单的例子演示动态库的使用。</p>
<h4 class="rp-toc-include" id="构建"><a href="#构建" class="rp-header-anchor rp-link" aria-hidden="true">#</a>构建</h4>
<p>首先构建一个libmax.so的动态库。</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-comment)">// max.c</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &quot;max.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> max</span><span style="color:var(--shiki-foreground)">( </span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> b ) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> ( a </span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)"> b ) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> a;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    } </span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> b;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-comment)">// max.h</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#ifndef</span><span style="color:var(--shiki-token-function)"> _MAX_H_</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#define</span><span style="color:var(--shiki-token-function)"> _MAX_H_</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> max</span><span style="color:var(--shiki-foreground)">( </span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> b );</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#endif</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-comment)">// main.h</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &quot;max.h&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;stdio.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;a: </span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)">, b: </span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)"> max: </span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> max(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">b))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    return</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h5 class="rp-toc-include" id="编译"><a href="#编译" class="rp-header-anchor rp-link" aria-hidden="true">#</a>编译</h5>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-comment)"># -fPIC是编译选项，PIC是 Position Independent Code 的缩写，表示要生成位置无关的代码，这是动态库需要的特性</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">gcc</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> max.o</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-string)"> max.c</span><span style="color:var(--shiki-token-string)"> -fPIC</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">gcc</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> main.o</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-string)"> main.c</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h5 class="rp-toc-include" id="生成动态库"><a href="#生成动态库" class="rp-header-anchor rp-link" aria-hidden="true">#</a>生成动态库</h5>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-comment)"># -shared是链接选项，告诉gcc生成动态库而不是可执行文件</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">gcc</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> libmax.so</span><span style="color:var(--shiki-token-string)"> max.o</span><span style="color:var(--shiki-token-string)"> -shared</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h4 class="rp-toc-include" id="链接"><a href="#链接" class="rp-header-anchor rp-link" aria-hidden="true">#</a>链接</h4>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">gcc</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> main</span><span style="color:var(--shiki-token-string)"> main.o</span><span style="color:var(--shiki-token-string)"> -L</span><span style="color:var(--shiki-token-string)"> .</span><span style="color:var(--shiki-token-string)"> -lmax</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h4 class="rp-toc-include" id="运行"><a href="#运行" class="rp-header-anchor rp-link" aria-hidden="true">#</a>运行</h4>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>$ ./main</span></span>
<span class="line"><span>./main: error while loading shared libraries: libmax.so: cannot open shared object file: No such file or directory</span></span>
<span class="line"><span>$ ldd ./main</span></span>
<span class="line"><span>        linux-vdso.so.1 (0x00007fff00bda000)</span></span>
<span class="line"><span>        libmax.so =&gt; not found</span></span>
<span class="line"><span>        libc.so.6 =&gt; /lib/x86_64-linux-gnu/libc.so.6 (0x00007efe58c48000)</span></span>
<span class="line"><span>        /lib64/ld-linux-x86-64.so.2 (0x00007efe58e21000)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>直接运行会出错，因为动态库需要在运行是加载，需要一些配置指定动态库的位置。
通过ldd命令可以查看到系统确实libmax.so的动态库。
有两种方法可以运行我们的程序</p>
<ol>
<li>添加环境变量<code>LD_LIBRARY_PATH</code>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>$ LD_LIBRARY_PATH=. ./main</span></span>
<span class="line"><span>a: 0, b: 1 max: 1</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>将libmax.so安装到系统，并通过ldconfig更新动态库，可以通过makefile文件编写安装和卸载规则。<br/>
当然<code>install</code>和<code>uninstall</code>需要root权限
<div class="rp-codeblock language-makefile"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="makefile"><code><span class="line"><span style="color:var(--shiki-foreground)">OUTPUT</span><span style="color:var(--shiki-token-keyword)">:=</span><span style="color:var(--shiki-foreground)">./build</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">LIBDIR</span><span style="color:var(--shiki-token-keyword)">:=</span><span style="color:var(--shiki-token-string-expression)">${OUTPUT}</span><span style="color:var(--shiki-foreground)">/lib</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">BINDIR</span><span style="color:var(--shiki-token-keyword)">:=</span><span style="color:var(--shiki-token-string-expression)">${OUTPUT}</span><span style="color:var(--shiki-foreground)">/bin</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">main</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> main.o libmax.so</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">	@</span><span style="color:var(--shiki-foreground)">mkdir -p </span><span style="color:var(--shiki-token-string-expression)">${BINDIR}</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	gcc -o </span><span style="color:var(--shiki-token-string-expression)">${BINDIR}</span><span style="color:var(--shiki-foreground)">/main </span><span style="color:var(--shiki-token-string-expression)">${OUTPUT}</span><span style="color:var(--shiki-foreground)">/main.o -L </span><span style="color:var(--shiki-token-string-expression)">${LIBDIR}</span><span style="color:var(--shiki-foreground)"> -lmax</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">main.o</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> main.c</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">	@</span><span style="color:var(--shiki-foreground)">mkdir -p </span><span style="color:var(--shiki-token-string-expression)">${OUTPUT}</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	gcc -o </span><span style="color:var(--shiki-token-string-expression)">${OUTPUT}</span><span style="color:var(--shiki-foreground)">/main.o -c main.c</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">max.o</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> max.c</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">	@</span><span style="color:var(--shiki-foreground)">mkdir -p </span><span style="color:var(--shiki-token-string-expression)">${OUTPUT}</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">	@</span><span style="color:var(--shiki-foreground)"># -fPIC是编译选项，PIC是 Position Independent Code 的缩写，表示要生成位置无关的代码，这是动态库需要的特性</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	gcc -o </span><span style="color:var(--shiki-token-string-expression)">${OUTPUT}</span><span style="color:var(--shiki-foreground)">/max.o -c max.c -fPIC</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">libmax.so</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> max.o</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">	@</span><span style="color:var(--shiki-foreground)">mkdir -p </span><span style="color:var(--shiki-token-string-expression)">${LIBDIR}</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">	@</span><span style="color:var(--shiki-foreground)"># -shared是链接选项，告诉gcc生成动态库而不是可执行文件</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	gcc -o </span><span style="color:var(--shiki-token-string-expression)">${LIBDIR}</span><span style="color:var(--shiki-foreground)">/libmax.so </span><span style="color:var(--shiki-token-string-expression)">${OUTPUT}</span><span style="color:var(--shiki-foreground)">/max.o -shared</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">install</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> main</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">	@</span><span style="color:var(--shiki-foreground)"># 安装文件</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	cp </span><span style="color:var(--shiki-token-string-expression)">${LIBDIR}</span><span style="color:var(--shiki-foreground)">/libmax.so /usr/lib	</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	cp </span><span style="color:var(--shiki-token-string-expression)">${BINDIR}</span><span style="color:var(--shiki-foreground)">/main /usr/bin</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">	@</span><span style="color:var(--shiki-foreground)"># ldconfg更新/etc/ld.so.cache</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	ldconfig</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">uninstall</span><span style="color:var(--shiki-token-keyword)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	rm -rf /usr/lib/libmax.so</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	rm -rf /usr/bin/main</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	ldconfig</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">clean</span><span style="color:var(--shiki-token-keyword)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">	rm -rf build</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
</ol>
<h4 class="rp-toc-include" id="运行时加载"><a href="#运行时加载" class="rp-header-anchor rp-link" aria-hidden="true">#</a>运行时加载</h4>
<p>还有一种可以直接在程序运行时指定动态库的路径，并通过系统api直接加载，这样的好处是程序可以只更新部分组件。具体的使用方法参考<a href="https://linux.die.net/man/3/dlopen" target="_blank" rel="noopener noreferrer" class="rp-link">dlopen(3) - Linux man page</a>。</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">#include</span><span style="color:var(--shiki-token-string-expression)"> &lt;dlfcn.h&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-function)">dlopen</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">const</span><span style="color:var(--shiki-token-keyword)"> char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">filename</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> flag);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-function)">dlerror</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-function)">dlsym</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">handle</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> const</span><span style="color:var(--shiki-token-keyword)"> char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">symbol);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> dlclose</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">handle);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<hr/>
<h3 class="rp-toc-include" id="静态链接"><a href="#静态链接" class="rp-header-anchor rp-link" aria-hidden="true">#</a>静态链接</h3>
<p>与动态链接不同，静态链接将库中的代码包含到目标的二进制文件中。
这会导致目标程序占用磁盘空间变大，启动时间变慢。
因为库的代码直接添加到链接目标的二进制文件中，这意味着要更新库中的任何代码，都必须重建链接目标。</p>
<h4 class="rp-toc-include" id="静态库"><a href="#静态库" class="rp-header-anchor rp-link" aria-hidden="true">#</a>静态库</h4>
<p>静态库是一组目标文件的容器。
静态库使用来自<code>ar</code>进行构建，类型的文件扩展名“.a”。
接下来通过一个简单的例子演示静态库的使用。</p>
<h4 class="rp-toc-include" id="构建-1"><a href="#构建-1" class="rp-header-anchor rp-link" aria-hidden="true">#</a>构建</h4>
<p>这里构建一个libmax.a的动态库。
(相关代码与动态库例子相同。)</p>
<h5 class="rp-toc-include" id="编译-1"><a href="#编译-1" class="rp-header-anchor rp-link" aria-hidden="true">#</a>编译</h5>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">gcc</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> max.o</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-string)"> max.c</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">gcc</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> main.o</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-string)"> main.c</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h5 class="rp-toc-include" id="生成静态库"><a href="#生成静态库" class="rp-header-anchor rp-link" aria-hidden="true">#</a>生成静态库</h5>
<p>静态库的生成使用<code>ar</code>工具，具体的使用可以参考<a href="https://linux.die.net/man/1/ar" target="_blank" rel="noopener noreferrer" class="rp-link">linux man</a></p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">ar</span><span style="color:var(--shiki-token-string)"> cr</span><span style="color:var(--shiki-token-string)"> libmax.a</span><span style="color:var(--shiki-token-string)"> max.o</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h4 class="rp-toc-include" id="链接-1"><a href="#链接-1" class="rp-header-anchor rp-link" aria-hidden="true">#</a>链接</h4>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">gcc</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> main</span><span style="color:var(--shiki-token-string)"> main.o</span><span style="color:var(--shiki-token-string)"> -L</span><span style="color:var(--shiki-token-string)"> .</span><span style="color:var(--shiki-token-string)"> -lmax</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h4 class="rp-toc-include" id="运行-1"><a href="#运行-1" class="rp-header-anchor rp-link" aria-hidden="true">#</a>运行</h4>
<p>直接运行即可，可以比较一下动态库和静态库生成的两个程序的大小，显然动态库生成的程序更小</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-comment)"># 静态链接生成的程序</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">$</span><span style="color:var(--shiki-token-string)"> ls</span><span style="color:var(--shiki-token-string)"> -all</span><span style="color:var(--shiki-token-string)"> ./main</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">-rwxr-xr-x</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-string)"> frey</span><span style="color:var(--shiki-token-string)"> frey</span><span style="color:var(--shiki-token-constant)"> 16664</span><span style="color:var(--shiki-token-string)"> Aug</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-token-string)"> 20:54</span><span style="color:var(--shiki-token-string)"> ./main</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 动态链接生成的程序</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">$</span><span style="color:var(--shiki-token-string)"> ls</span><span style="color:var(--shiki-token-string)"> -all</span><span style="color:var(--shiki-token-string)"> ./main</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">-rwxr-xr-x</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-string)"> frey</span><span style="color:var(--shiki-token-string)"> frey</span><span style="color:var(--shiki-token-constant)"> 16640</span><span style="color:var(--shiki-token-string)"> Aug</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-token-string)"> 22:54</span><span style="color:var(--shiki-token-string)"> ./main</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h3>
<ol>
<li><a href="https://pewpewthespells.com/blog/static_and_dynamic_libraries.html" target="_blank" rel="noopener noreferrer" class="rp-link">Static and Dynamic Libraries</a></li>
<li><a href="https://zhuanlan.zhihu.com/p/307640255" target="_blank" rel="noopener noreferrer" class="rp-link">C语言丨静态库与动态库的区别，你知道多少？</a></li>
<li><a href="https://www.cnblogs.com/jiqingwu/p/linux_dynamic_lib_create.html" target="_blank" rel="noopener noreferrer" class="rp-link">Linux动态库生成与使用指南</a></li>
<li><a href="https://linux.die.net/man/3/dlopen" target="_blank" rel="noopener noreferrer" class="rp-link">dlopen(3) - Linux man page</a></li>
<li><a href="https://linux.die.net/man/1/ar" target="_blank" rel="noopener noreferrer" class="rp-link">ar(1) - Linux man page</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[WSL转移后无法入网]]></title>
        <id>/blog/2022/WSL转移后无法入网</id>
        <link href="https://www.vhcffh.com/blog/2022/WSL转移后无法入网"/>
        <updated>2022-08-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了在两台Windows主机间转移WSL子系统时遇到的网络问题及解决方案。内容涵盖了系统导出导入、因IP地址段不匹配导致的网络重置、防火墙规则配置、DNS解析失败（修改resolv.conf）以及新版Windows下端口直接映射等问题的排查与解决步骤。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="wsl转移后无法入网"><a href="#wsl转移后无法入网" class="rp-header-anchor rp-link" aria-hidden="true">#</a>WSL转移后无法入网<!-- --> </h1>
<h2 class="rp-toc-include" id="缘由"><a href="#缘由" class="rp-header-anchor rp-link" aria-hidden="true">#</a>缘由</h2>
<p>新组装了一台台式机，需要将笔记本中的WSL子系统导出到新的台式机中，在转移过程中遇到了子系统DNS解析不正常和子系统与Host端口映射问题，在此进行一些记录。</p>
<h2 class="rp-toc-include" id="系统导出"><a href="#系统导出" class="rp-header-anchor rp-link" aria-hidden="true">#</a>系统导出</h2>
<div class="rp-codeblock language-powershell"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="powershell"><code><span class="line"><span style="color:var(--shiki-token-comment)"># wsl --export &lt;发行版&gt; &lt;FileName&gt; [选项]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">wsl </span><span style="color:var(--shiki-token-keyword)">--</span><span style="color:var(--shiki-foreground)">export Linux linux.tar</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="系统导入"><a href="#系统导入" class="rp-header-anchor rp-link" aria-hidden="true">#</a>系统导入</h2>
<p>导入系统时，在新系统上执行<code>wsl --help</code>命令后没有<code>--import</code>选项；查找原因后发现需要wsl进行升级，安装<a href="https://docs.microsoft.com/zh-cn/windows/wsl/basic-commands#set-wsl-version-to-1-or-2" target="_blank" rel="noopener noreferrer" class="rp-link">教程</a>对wsl进行升级；旧版wsl可能需要进行手动安装<a href="https://docs.microsoft.com/zh-cn/windows/wsl/install-manual" target="_blank" rel="noopener noreferrer" class="rp-link">教程</a>。更新后导入即可</p>
<div class="rp-codeblock language-powershell"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="powershell"><code><span class="line"><span style="color:var(--shiki-token-comment)"># wsl --import &lt;发行版&gt; &lt;InstallLocation&gt; &lt;FileName&gt; [选项]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">wsl </span><span style="color:var(--shiki-token-keyword)">--</span><span style="color:var(--shiki-foreground)">import Linux d:</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">Linux</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)"> linux.tar</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>尽量按照到非系统盘，保留系统盘空间</p>
<h2 class="rp-toc-include" id="网络重置"><a href="#网络重置" class="rp-header-anchor rp-link" aria-hidden="true">#</a>网络重置</h2>
<p>导入系统后，系统无法联网，首先查看子系统机host的ip地址情况</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">$</span><span style="color:var(--shiki-token-string)"> ifconfig</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">eth0:</span><span style="color:var(--shiki-token-string)"> flags=</span><span style="color:var(--shiki-token-constant)">4163</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-string)">UP,BROADCAST,RUNNING,MULTICAS</span><span style="color:var(--shiki-foreground)">T</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-token-string)">  mtu</span><span style="color:var(--shiki-token-constant)"> 1500</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        inet</span><span style="color:var(--shiki-token-constant)"> 172.23.202.215</span><span style="color:var(--shiki-token-string)">  netmask</span><span style="color:var(--shiki-token-constant)"> 255.255.240.0</span><span style="color:var(--shiki-token-string)">  broadcast</span><span style="color:var(--shiki-token-constant)"> 172.23.207.255</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        inet6</span><span style="color:var(--shiki-token-string)"> fe80::215:5dff:feb6:259d</span><span style="color:var(--shiki-token-string)">  prefixlen</span><span style="color:var(--shiki-token-constant)"> 64</span><span style="color:var(--shiki-token-string)">  scopeid</span><span style="color:var(--shiki-token-constant)"> 0x20</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-string)">lin</span><span style="color:var(--shiki-foreground)">k</span><span style="color:var(--shiki-token-keyword)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        ether</span><span style="color:var(--shiki-token-string)"> 00:15:5d:b6:25:9d</span><span style="color:var(--shiki-token-string)">  txqueuelen</span><span style="color:var(--shiki-token-constant)"> 1000</span><span style="color:var(--shiki-foreground)">  (Ethernet)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        RX</span><span style="color:var(--shiki-token-string)"> packets</span><span style="color:var(--shiki-token-constant)"> 19</span><span style="color:var(--shiki-token-string)">  bytes</span><span style="color:var(--shiki-token-constant)"> 4618</span><span style="color:var(--shiki-foreground)"> (4.5 </span><span style="color:var(--shiki-token-string)">KiB</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        RX</span><span style="color:var(--shiki-token-string)"> errors</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  dropped</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  overruns</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  frame</span><span style="color:var(--shiki-token-constant)"> 0</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        TX</span><span style="color:var(--shiki-token-string)"> packets</span><span style="color:var(--shiki-token-constant)"> 30</span><span style="color:var(--shiki-token-string)">  bytes</span><span style="color:var(--shiki-token-constant)"> 1692</span><span style="color:var(--shiki-foreground)"> (1.6 </span><span style="color:var(--shiki-token-string)">KiB</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        TX</span><span style="color:var(--shiki-token-string)"> errors</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  dropped</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)"> overruns</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  carrier</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  collisions</span><span style="color:var(--shiki-token-constant)"> 0</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">lo:</span><span style="color:var(--shiki-token-string)"> flags=</span><span style="color:var(--shiki-token-constant)">73</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-string)">UP,LOOPBACK,RUNNIN</span><span style="color:var(--shiki-foreground)">G</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-token-string)">  mtu</span><span style="color:var(--shiki-token-constant)"> 65536</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        inet</span><span style="color:var(--shiki-token-constant)"> 127.0.0.1</span><span style="color:var(--shiki-token-string)">  netmask</span><span style="color:var(--shiki-token-constant)"> 255.0.0.0</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        inet6</span><span style="color:var(--shiki-token-string)"> ::1</span><span style="color:var(--shiki-token-string)">  prefixlen</span><span style="color:var(--shiki-token-constant)"> 128</span><span style="color:var(--shiki-token-string)">  scopeid</span><span style="color:var(--shiki-token-constant)"> 0x10</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-string)">hos</span><span style="color:var(--shiki-foreground)">t</span><span style="color:var(--shiki-token-keyword)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        loop</span><span style="color:var(--shiki-token-string)">  txqueuelen</span><span style="color:var(--shiki-token-constant)"> 1000</span><span style="color:var(--shiki-foreground)">  (Local </span><span style="color:var(--shiki-token-string)">Loopback</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        RX</span><span style="color:var(--shiki-token-string)"> packets</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-string)">  bytes</span><span style="color:var(--shiki-token-constant)"> 1546</span><span style="color:var(--shiki-foreground)"> (1.5 </span><span style="color:var(--shiki-token-string)">KiB</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        RX</span><span style="color:var(--shiki-token-string)"> errors</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  dropped</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  overruns</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  frame</span><span style="color:var(--shiki-token-constant)"> 0</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        TX</span><span style="color:var(--shiki-token-string)"> packets</span><span style="color:var(--shiki-token-constant)"> 18</span><span style="color:var(--shiki-token-string)">  bytes</span><span style="color:var(--shiki-token-constant)"> 1546</span><span style="color:var(--shiki-foreground)"> (1.5 </span><span style="color:var(--shiki-token-string)">KiB</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        TX</span><span style="color:var(--shiki-token-string)"> errors</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  dropped</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)"> overruns</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  carrier</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-string)">  collisions</span><span style="color:var(--shiki-token-constant)"> 0</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">$</span><span style="color:var(--shiki-token-string)"> route</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">Kernel</span><span style="color:var(--shiki-token-string)"> IP</span><span style="color:var(--shiki-token-string)"> routing</span><span style="color:var(--shiki-token-string)"> table</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">Destination</span><span style="color:var(--shiki-token-string)">     Gateway</span><span style="color:var(--shiki-token-string)">         Genmask</span><span style="color:var(--shiki-token-string)">         Flags</span><span style="color:var(--shiki-token-string)"> Metric</span><span style="color:var(--shiki-token-string)"> Ref</span><span style="color:var(--shiki-token-string)">    Use</span><span style="color:var(--shiki-token-string)"> Iface</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">default</span><span style="color:var(--shiki-token-constant)">         172.23.192.1</span><span style="color:var(--shiki-token-constant)">    0.0.0.0</span><span style="color:var(--shiki-token-string)">         UG</span><span style="color:var(--shiki-token-constant)">    0</span><span style="color:var(--shiki-token-constant)">      0</span><span style="color:var(--shiki-token-constant)">        0</span><span style="color:var(--shiki-token-string)"> eth0</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">172.23.192.0</span><span style="color:var(--shiki-token-constant)">    0.0.0.0</span><span style="color:var(--shiki-token-constant)">         255.255.240.0</span><span style="color:var(--shiki-token-string)">   U</span><span style="color:var(--shiki-token-constant)">     0</span><span style="color:var(--shiki-token-constant)">      0</span><span style="color:var(--shiki-token-constant)">        0</span><span style="color:var(--shiki-token-string)"> eth0</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-cmd"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cmd"><code><span class="line"><span style="color:var(--shiki-foreground)">ipconfig</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">以太网适配器 vEthernet (WSL):</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    连接特定的 DNS 后缀 . . . . . . . :</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    本地链接 IPv6 地址. . . . . . . . : fe80::6dfb:</span><span style="color:var(--shiki-token-constant)">1789</span><span style="color:var(--shiki-foreground)">:</span><span style="color:var(--shiki-token-constant)">6e91</span><span style="color:var(--shiki-foreground)">:f5dd</span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-token-constant)">48</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    自动配置 IPv4 地址  . . . . . . . : </span><span style="color:var(--shiki-token-constant)">169.254.245.221</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    子网掩码  . . . . . . . . . . . . : </span><span style="color:var(--shiki-token-constant)">255.255.0.0</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    默认网关. . . . . . . . . . . . . :</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>主机WSL虚拟网卡地址与wsl子系统地址不在一个网段，需要重置主机网络</p>
<div class="rp-codeblock language-cmd"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cmd"><code><span class="line"><span style="color:var(--shiki-foreground)">wsl </span><span style="color:var(--shiki-token-keyword)">--</span><span style="color:var(--shiki-foreground)">shutdown</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">netsh winsock reset</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">netsh </span><span style="color:var(--shiki-token-function)">int</span><span style="color:var(--shiki-foreground)"> ip reset all</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">netsh winhttp reset proxy</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">ipconfig /flushdns</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="防火墙配置"><a href="#防火墙配置" class="rp-header-anchor rp-link" aria-hidden="true">#</a>防火墙配置</h2>
<p>经过网络重置后，子系统应该可以ping通主机ip，如果无法ping通，可能是windows防火墙配置问题，对windows防火墙添加一条规则</p>
<div class="rp-codeblock language-powershell"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="powershell"><code><span class="line"><span style="color:var(--shiki-token-function)">New-NetFirewallRule</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-foreground)">DisplayName </span><span style="color:var(--shiki-token-string-expression)">&quot;WSL&quot;</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-foreground)">Direction Inbound  </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">InterfaceAlias </span><span style="color:var(--shiki-token-string-expression)">&quot;vEthernet (WSL)&quot;</span><span style="color:var(--shiki-token-keyword)">  -</span><span style="color:var(--shiki-foreground)">Action Allow</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="dns解析问题"><a href="#dns解析问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>DNS解析问题</h2>
<p>如果仅仅可以ping通ip，而不能ping通域名，那是域名解析出现了问题
应该是在导入后域名解析出现了问题，一般是由于文件&#x27;/etc/resolv.conf&#x27;引起的，有两种方式可以处理</p>
<ol>
<li>配置此文件自动生成</li>
</ol>
<p>在文件<code>/etc/wsl.conf</code>中注释掉下面一行，这样在wsl重启后会自动生成文件<code>/etc/resolv.conf</code></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>[network]</span></span>
<span class="line"><span>#generateResolvConf = false</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ol start="2">
<li><a href="https://blog.vhcffh.com/wp-675/" target="_blank" rel="noopener noreferrer" class="rp-link">自己创建此文件</a></li>
</ol>
<p>建议用这种方式，可以在子系统中自定义域名解析服务器</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> rm</span><span style="color:var(--shiki-token-string)"> /etc/resolv.conf</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> bash</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-string-expression)"> &#x27;echo &quot;nameserver 8.8.8.8&quot; &gt; /etc/resolv.conf&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> bash</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-string-expression)"> &#x27;echo &quot;[network]&quot; &gt; /etc/wsl.conf&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> bash</span><span style="color:var(--shiki-token-string)"> -c</span><span style="color:var(--shiki-token-string-expression)"> &#x27;echo &quot;generateResolvConf = false&quot; &gt;&gt; /etc/wsl.conf&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> chattr</span><span style="color:var(--shiki-token-string)"> +i</span><span style="color:var(--shiki-token-string)"> /etc/resolv.conf</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>首先删除文件，然后新建此文件并重新配置wsl.conf文件，最后chattr命令是更改此文件属性（没有这一句wsl重启后resolv.conf文件会消失）</p>
<h2 class="rp-toc-include" id="端口直接映射问题"><a href="#端口直接映射问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>端口直接映射问题</h2>
<p>在原本的笔记本中，子系统开启的端口（不论是127.0.0.1还是0.0.0.0）都可以在windows中的127.0.0.1直接访问，但在新系统中无法实现</p>
<p>经排查是进程wslhost.exe的问题，主要是window系统版本不同引起的
在windows更新中加入预览版体验，跟新系统版本到22H2后wsl的端口直接映射功能就有了，而且增加了子系统的窗口组件，可以直接运行子系统的窗口应用了
并且要更新wsl</p>
<div class="rp-codeblock language-cmd"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="cmd"><code><span class="line"><span style="color:var(--shiki-foreground)">wsl </span><span style="color:var(--shiki-token-keyword)">--</span><span style="color:var(--shiki-foreground)">update</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>但经测试wsl中端口大于2610的仍无法直接映射，原因不明</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://docs.microsoft.com/zh-cn/windows/wsl/basic-commands" target="_blank" rel="noopener noreferrer" class="rp-link">WSL基本命令</a></li>
<li><a href="https://docs.microsoft.com/zh-cn/windows/wsl/install-manual" target="_blank" rel="noopener noreferrer" class="rp-link">旧版 WSL 的手动安装步骤</a></li>
<li><a href="https://blog.vhcffh.com/wp-675/" target="_blank" rel="noopener noreferrer" class="rp-link">WSL2联网问题</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[一些不常用C语言关键字]]></title>
        <id>/blog/2022/wp-765</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-765"/>
        <updated>2022-05-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文简要介绍了一些不常用的C语言关键字。内容涵盖了`volatile`（防止编译器优化）、`typedef`（创建类型别名）、`register`（建议变量存储于寄存器）、`__attribute__`（设置编译器属性）以及`inline`（建议函数内联），有助于深入理解C语言的底层特性。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="一些不常用c语言关键字"><a href="#一些不常用c语言关键字" class="rp-header-anchor rp-link" aria-hidden="true">#</a>一些不常用C语言关键字<!-- --> </h1>
<h2 class="rp-toc-include" id="volatile"><a href="#volatile" class="rp-header-anchor rp-link" aria-hidden="true">#</a>volatile</h2>
<p>该关键字是一个类型修饰符，提醒编译器它后面所定义的变量随时有可能改变，因此编译后的程序每次需要存储或读取这个变量的时候，都会直接从变量地址中读取数据</p>
<h2 class="rp-toc-include" id="typedef"><a href="#typedef" class="rp-header-anchor rp-link" aria-hidden="true">#</a>typedef</h2>
<p><code>typedef int myint;</code></p>
<p>声明类型:<code>int a;</code>等价于<code>myint a;</code></p>
<p><code>typedef void （*fun)(void);</code></p>
<p>声明函数指针:<code>void （*p)(void);</code>等价于<code>fun p;</code></p>
<h2 class="rp-toc-include" id="register"><a href="#register" class="rp-header-anchor rp-link" aria-hidden="true">#</a>register</h2>
<p>register将数据存储在寄存器中</p>
<p><code>register type var_name __asm(reg)</code></p>
<p>声明一个命名寄存器的变量，reg为寄存器名</p>
<h2 class="rp-toc-include" id="attribute"><a href="#attribute" class="rp-header-anchor rp-link" aria-hidden="true">#</a>attribute</h2>
<p><code>__attribute__ ((attribute-list))</code></p>
<p>编译器优化配置</p>
<p>设置函数属性，类型属性，变量属性</p>
<h2 class="rp-toc-include" id="inline"><a href="#inline" class="rp-header-anchor rp-link" aria-hidden="true">#</a>inline</h2>
<p>将被调用函数以内联的方式嵌入到调用函数内</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[树莓派4B运行docker错误]]></title>
        <id>/blog/2022/wp-760</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-760"/>
        <updated>2022-04-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文解决了在树莓派4B上因`libseccomp2`库版本过旧而导致Docker容器运行报错的问题。在尝试更新库失败后，最终通过卸载系统源安装的旧版Docker，并使用官方`get.docker.com`脚本重新安装最新版本，成功修复了该问题。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="树莓派4b运行docker错误"><a href="#树莓派4b运行docker错误" class="rp-header-anchor rp-link" aria-hidden="true">#</a>树莓派4B运行docker错误<!-- --> </h1>
<p>树莓派4B安装raspberrypi系统后，用自带的源安装docker，在涉及到libseccomp这个库时会报错</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">-------------------------------------</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">          _</span><span style="color:var(--shiki-token-punctuation)">         ()</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         |</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)">  ___</span><span style="color:var(--shiki-token-string)">   _</span><span style="color:var(--shiki-token-string)">    __</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         |</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> /</span><span style="color:var(--shiki-token-string)"> __</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)">  /</span><span style="color:var(--shiki-foreground)">  \</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         |</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> \__</span><span style="color:var(--shiki-foreground)"> \ </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> |</span><span style="color:var(--shiki-token-punctuation)"> ()</span><span style="color:var(--shiki-token-keyword)"> |</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">         |</span><span style="color:var(--shiki-token-function)">_</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)">___/</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)">_</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-function)">  \__/</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">Brought</span><span style="color:var(--shiki-token-string)"> to</span><span style="color:var(--shiki-token-string)"> you</span><span style="color:var(--shiki-token-string)"> by</span><span style="color:var(--shiki-token-string)"> linuxserver.io</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">-------------------------------------</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">To</span><span style="color:var(--shiki-token-string)"> support</span><span style="color:var(--shiki-token-string)"> LSIO</span><span style="color:var(--shiki-token-string)"> projects</span><span style="color:var(--shiki-token-string)"> visit:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">https://www.linuxserver.io/donate/</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">-------------------------------------</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">GID/UID</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">-------------------------------------</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">User</span><span style="color:var(--shiki-token-string)"> uid:</span><span style="color:var(--shiki-token-constant)">    1000</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">User</span><span style="color:var(--shiki-token-string)"> gid:</span><span style="color:var(--shiki-token-constant)">    1000</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">-------------------------------------</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">Your</span><span style="color:var(--shiki-token-string)"> DockerHost</span><span style="color:var(--shiki-token-string)"> is</span><span style="color:var(--shiki-token-string)"> running</span><span style="color:var(--shiki-token-string)"> an</span><span style="color:var(--shiki-token-string)"> outdated</span><span style="color:var(--shiki-token-string)"> version</span><span style="color:var(--shiki-token-string)"> of</span><span style="color:var(--shiki-token-string)"> libseccomp</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">To</span><span style="color:var(--shiki-token-string)"> fix</span><span style="color:var(--shiki-token-string)"> this,</span><span style="color:var(--shiki-token-string)"> please</span><span style="color:var(--shiki-token-string)"> visit</span><span style="color:var(--shiki-token-string)"> https://docs.linuxserver.io/faq#libseccomp</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">Apps</span><span style="color:var(--shiki-token-string)"> will</span><span style="color:var(--shiki-token-string)"> not</span><span style="color:var(--shiki-token-string)"> behave</span><span style="color:var(--shiki-token-string)"> correctly</span><span style="color:var(--shiki-token-string)"> without</span><span style="color:var(--shiki-token-string)"> this</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>具体原因是由于libseccomp2库的一些bug，已经修复但没有被推送到所有仓库，在<a href="https://docs.linuxserver.io/faq#libseccomp" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>有一些解释。也介绍了一些措施去修复。</p>
<p>尝试后并没有用，可能是某些步骤错了。</p>
<p>最后通过通过docker官方脚本重新安装解决了</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> apt</span><span style="color:var(--shiki-token-string)"> remove</span><span style="color:var(--shiki-token-string)"> docker.io</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> apt</span><span style="color:var(--shiki-token-string)"> autoremove</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> apt</span><span style="color:var(--shiki-token-string)"> update</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> apt</span><span style="color:var(--shiki-token-string)"> upgrade</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">curl</span><span style="color:var(--shiki-token-string)"> -fsSL</span><span style="color:var(--shiki-token-string)"> https://get.docker.com</span><span style="color:var(--shiki-token-string)"> -o</span><span style="color:var(--shiki-token-string)"> get-docker.sh</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">sudo</span><span style="color:var(--shiki-token-string)"> sh</span><span style="color:var(--shiki-token-string)"> get-docker.sh</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">systemctl</span><span style="color:var(--shiki-token-string)"> start</span><span style="color:var(--shiki-token-string)"> docker</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>docker官方下载的安装脚本<code>get-docker.sh</code>会给apt添加一个新的源，并从docker的官方源重新安装docker的最新版本。</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://docs.linuxserver.io/faq#libseccomp" target="_blank" rel="noopener noreferrer" class="rp-link">FAQ - LinuxServer.io</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[树莓派4B wlan0消失]]></title>
        <id>/blog/2022/wp-756</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-756"/>
        <updated>2022-04-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文提供了解决树莓派4B上`wlan0`无线网络接口消失问题的两种快速方法。第一种是当接口未启动时，使用`sudo ifconfig wlan0 up`命令手动启用。第二种是当接口被软件锁定时，使用`sudo rfkill unblock all`命令进行解锁。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="树莓派4b-wlan0消失"><a href="#树莓派4b-wlan0消失" class="rp-header-anchor rp-link" aria-hidden="true">#</a>树莓派4B wlan0消失<!-- --> </h1>
<ol>
<li>wlan0 没有启动，使用<code>sudo ifconfig wlan0 up</code>启用即可</li>
<li>wlan0被blocked，使用<code>sudo rfkill unblock all</code>解锁即可</li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Yew框架实现秒表]]></title>
        <id>/blog/2022/wp-721</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-721"/>
        <updated>2022-04-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了如何使用Rust的Yew框架实现一个Web秒表应用。内容从一个简单的定时计数器开始，逐步增加了开始、停止、继续、计次和重置等功能。文章详细讲解了如何通过`gloo::timers::Interval`管理定时器，以及如何利用组件的状态和消息（Msg）来处理用户交互和更新UI。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="yew框架实现秒表"><a href="#yew框架实现秒表" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Yew框架实现秒表<!-- --> </h1>
<h2 class="rp-toc-include" id="实现计数器"><a href="#实现计数器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>实现计数器</h2>
<p>用Yew框架实现一个web定时器，首先Interval实现一个简单的计数器，每10ms发送Msg
UpdateTime并组件的update方法中调用tick方法，更新时间。</p>
<div class="rp-codeblock language-rust"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--shiki-token-keyword)">use</span><span style="color:var(--shiki-foreground)"> gloo</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-foreground)">timers</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-foreground)">callback</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">Interval</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">use</span><span style="color:var(--shiki-foreground)"> yew</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-foreground)">{html, </span><span style="color:var(--shiki-token-function)">Component</span><span style="color:var(--shiki-foreground)">, </span><span style="color:var(--shiki-token-function)">Context</span><span style="color:var(--shiki-foreground)">, </span><span style="color:var(--shiki-token-function)">Html</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">pub</span><span style="color:var(--shiki-token-keyword)"> enum</span><span style="color:var(--shiki-token-function)"> Msg</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    UpdateTime</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">pub</span><span style="color:var(--shiki-token-keyword)"> struct</span><span style="color:var(--shiki-token-function)"> MyTimer</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    timer_min</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> u32</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    timer_sec</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> u32</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    timer_csec</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> u32</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    timer_handle</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> Option</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-function)">Interval</span><span style="color:var(--shiki-foreground)">&gt;,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">impl</span><span style="color:var(--shiki-token-function)"> MyTimer</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> tick</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;mut</span><span style="color:var(--shiki-foreground)"> self) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec </span><span style="color:var(--shiki-token-keyword)">&gt;=</span><span style="color:var(--shiki-token-constant)"> 100</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_sec </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_sec </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 60</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_sec </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_min </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">impl</span><span style="color:var(--shiki-token-function)"> Component</span><span style="color:var(--shiki-token-keyword)"> for</span><span style="color:var(--shiki-token-function)"> MyTimer</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    type</span><span style="color:var(--shiki-token-function)"> Message</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-function)"> Msg</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    type</span><span style="color:var(--shiki-token-function)"> Properties</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-foreground)"> ();</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> create</span><span style="color:var(--shiki-foreground)">(ctx</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">Context</span><span style="color:var(--shiki-foreground)">&lt;Self&gt;) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-foreground)"> Self {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        let</span><span style="color:var(--shiki-foreground)"> timer_handle </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            let</span><span style="color:var(--shiki-foreground)"> link </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ctx</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">link</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">clone</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            Interval</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">new</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-foreground)">, </span><span style="color:var(--shiki-token-keyword)">move</span><span style="color:var(--shiki-token-keyword)"> ||</span><span style="color:var(--shiki-foreground)"> link</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">send_message</span><span style="color:var(--shiki-foreground)">(Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">UpdateTime</span><span style="color:var(--shiki-foreground)">))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        };</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        let</span><span style="color:var(--shiki-foreground)"> timer_handle </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Some</span><span style="color:var(--shiki-foreground)">(timer_handle);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        Self {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            timer_min</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            timer_sec</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            timer_csec</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            timer_handle,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> update</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;mut</span><span style="color:var(--shiki-foreground)"> self, _ctx</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">Context</span><span style="color:var(--shiki-foreground)">&lt;Self&gt;, msg</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> Self</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">Message</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-token-function)"> bool</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        match</span><span style="color:var(--shiki-foreground)"> msg {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">UpdateTime</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">tick</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> view</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">self, _ctx</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">Context</span><span style="color:var(--shiki-foreground)">&lt;Self&gt;) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-token-function)"> Html</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        html!</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            &lt;&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;div id</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;time&quot;</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    { </span><span style="color:var(--shiki-token-function)">format!</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;{:0&gt;2}:{:0&gt;2}:{:0&gt;2}&quot;</span><span style="color:var(--shiki-foreground)">,</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_min,</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_sec,</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec) }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">div&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            &lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="实现秒表功能"><a href="#实现秒表功能" class="rp-header-anchor rp-link" aria-hidden="true">#</a>实现秒表功能</h2>
<p>秒表需要实现<strong>开始</strong>、<strong>停止</strong>、<strong>继续</strong>、<strong>计次</strong>、<strong>重置</strong>五个功能。因为开始和继续都是初始化定时器，因此可以用同一个Msg表示，在<code>Msg</code>中添加这4个消息。</p>
<div class="rp-codeblock language-rust"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--shiki-token-keyword)">pub</span><span style="color:var(--shiki-token-keyword)"> enum</span><span style="color:var(--shiki-token-function)"> Msg</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    StartTime</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    StopTime</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    CountTime</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    ResetTime</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    UpdateTime</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="开始"><a href="#开始" class="rp-header-anchor rp-link" aria-hidden="true">#</a>开始</h3>
<p>默认秒表应该处于停止状态，点击开始按钮，发送<code>StartTime</code>消息后，开始计数。因此需要将<code>Interval</code>的初始化放到<code>update</code>方法中。在<code>create</code>方法中用<code>None</code>初始化<code>timer_handle</code>，在<code>update</code>中接收到<code>StartTime</code>消息后进行初始化。</p>
<div class="rp-codeblock language-rust"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--shiki-token-keyword)">        match</span><span style="color:var(--shiki-foreground)"> msg {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">StartTime</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                let</span><span style="color:var(--shiki-foreground)"> timer_handle </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    let</span><span style="color:var(--shiki-foreground)"> link </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ctx</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">link</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">clone</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                    Interval</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">new</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-foreground)">, </span><span style="color:var(--shiki-token-keyword)">move</span><span style="color:var(--shiki-token-keyword)"> ||</span><span style="color:var(--shiki-foreground)"> link</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">send_message</span><span style="color:var(--shiki-foreground)">(Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">UpdateTime</span><span style="color:var(--shiki-foreground)">))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_handle </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Some</span><span style="color:var(--shiki-foreground)">(timer_handle);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            // ...</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="停止"><a href="#停止" class="rp-header-anchor rp-link" aria-hidden="true">#</a>停止</h3>
<p>停止秒表直接将timer_handle重新赋值为None即可，这样就删除了定时器。</p>
<div class="rp-codeblock language-rust"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--shiki-token-function)">            Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">StopTime</span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_handle </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> None</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="继续"><a href="#继续" class="rp-header-anchor rp-link" aria-hidden="true">#</a>继续</h3>
<p>继续与开始的逻辑相同。</p>
<h3 class="rp-toc-include" id="计次"><a href="#计次" class="rp-header-anchor rp-link" aria-hidden="true">#</a>计次</h3>
<p>计次需要一个变量来保存当前的时间，因此在结构体中增加一个可变数组用于保存当前时间。</p>
<div class="rp-codeblock language-rust"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--shiki-token-function)">            Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">CountTime</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">message</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">push</span><span style="color:var(--shiki-foreground)">(</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                    format!</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;{:0&gt;2}:{:0&gt;2}:{:0&gt;2}&quot;</span><span style="color:var(--shiki-foreground)">,</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_min,</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_sec,</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec) }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                );</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="重置"><a href="#重置" class="rp-header-anchor rp-link" aria-hidden="true">#</a>重置</h3>
<p>重置需要将所有计时器归零，并清空message中的计数。</p>
<div class="rp-codeblock language-rust"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--shiki-token-function)">            Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">ResetTime</span><span style="color:var(--shiki-token-keyword)">=&gt;</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_sec </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_min </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">message</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">clear</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>到这里，秒表的基本功基本完全实现了，接下来将update方法中的代码整理到结构体为结构体的方法，添加一些变量来记录秒表的状态，另外添加一些css来优化界面。</p>
<h2 class="rp-toc-include" id="代码整理"><a href="#代码整理" class="rp-header-anchor rp-link" aria-hidden="true">#</a>代码整理</h2>
<p>将代码逻辑进行一些整理优化</p>
<div class="rp-codeblock language-rust"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--shiki-token-keyword)">use</span><span style="color:var(--shiki-foreground)"> gloo</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-foreground)">timers</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-foreground)">callback</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">Interval</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">use</span><span style="color:var(--shiki-foreground)"> yew</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-foreground)">{html, </span><span style="color:var(--shiki-token-function)">Component</span><span style="color:var(--shiki-foreground)">, </span><span style="color:var(--shiki-token-function)">Context</span><span style="color:var(--shiki-foreground)">, </span><span style="color:var(--shiki-token-function)">Html</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">pub</span><span style="color:var(--shiki-token-keyword)"> enum</span><span style="color:var(--shiki-token-function)"> Msg</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    StartTime</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    StopTime</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    CountTime</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    ResetTime</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    UpdateTime</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">pub</span><span style="color:var(--shiki-token-keyword)"> struct</span><span style="color:var(--shiki-token-function)"> MyTimer</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    timer_csec</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> u32</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    last_timer_csec</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> u32</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    timer_handle</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> Option</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-function)">Interval</span><span style="color:var(--shiki-foreground)">&gt;,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    message</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> Vec</span><span style="color:var(--shiki-foreground)">&lt;(</span><span style="color:var(--shiki-token-function)">u32</span><span style="color:var(--shiki-foreground)">, </span><span style="color:var(--shiki-token-function)">u32</span><span style="color:var(--shiki-foreground)">)&gt;,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    state</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> u8</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">impl</span><span style="color:var(--shiki-token-function)"> MyTimer</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> new</span><span style="color:var(--shiki-foreground)">(_ctx</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">Context</span><span style="color:var(--shiki-foreground)">&lt;Self&gt;) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-foreground)"> Self {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        Self {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            timer_csec</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            last_timer_csec</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            timer_handle</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> None</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            message</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-function)"> vec!</span><span style="color:var(--shiki-foreground)">[],</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            state</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> start_time</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;mut</span><span style="color:var(--shiki-foreground)"> self, ctx</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">Context</span><span style="color:var(--shiki-foreground)">&lt;Self&gt;) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-token-function)"> bool</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">state </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-keyword)"> ||</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">state </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            let</span><span style="color:var(--shiki-foreground)"> timer_handle </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                let</span><span style="color:var(--shiki-foreground)"> link </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ctx</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">link</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">clone</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                Interval</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">new</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-foreground)">, </span><span style="color:var(--shiki-token-keyword)">move</span><span style="color:var(--shiki-token-keyword)"> ||</span><span style="color:var(--shiki-foreground)"> link</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">send_message</span><span style="color:var(--shiki-foreground)">(Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">UpdateTime</span><span style="color:var(--shiki-foreground)">))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_handle </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Some</span><span style="color:var(--shiki-foreground)">(timer_handle);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">state </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> stop_time</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;mut</span><span style="color:var(--shiki-foreground)"> self) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-token-function)"> bool</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">state </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_handle </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> None</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">state </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> conut_time</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;mut</span><span style="color:var(--shiki-foreground)"> self) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-token-function)"> bool</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">state </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">message</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                .</span><span style="color:var(--shiki-token-function)">push</span><span style="color:var(--shiki-foreground)">((self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec, self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">last_timer_csec));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">last_timer_csec </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> reset_time</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;mut</span><span style="color:var(--shiki-foreground)"> self) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-token-function)"> bool</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">state </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">last_timer_csec </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">message</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">clear</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">state </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> tick</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;mut</span><span style="color:var(--shiki-foreground)"> self) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-token-function)"> bool</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">impl</span><span style="color:var(--shiki-token-function)"> Component</span><span style="color:var(--shiki-token-keyword)"> for</span><span style="color:var(--shiki-token-function)"> MyTimer</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    type</span><span style="color:var(--shiki-token-function)"> Message</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-token-function)"> Msg</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    type</span><span style="color:var(--shiki-token-function)"> Properties</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-foreground)"> ();</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> create</span><span style="color:var(--shiki-foreground)">(ctx</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">Context</span><span style="color:var(--shiki-foreground)">&lt;Self&gt;) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-foreground)"> Self {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        MyTimer</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">new</span><span style="color:var(--shiki-foreground)">(ctx)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> update</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;mut</span><span style="color:var(--shiki-foreground)"> self, ctx</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">Context</span><span style="color:var(--shiki-foreground)">&lt;Self&gt;, msg</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> Self</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">Message</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-token-function)"> bool</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        match</span><span style="color:var(--shiki-foreground)"> msg {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">StartTime</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">start_time</span><span style="color:var(--shiki-foreground)">(ctx),</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">StopTime</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">stop_time</span><span style="color:var(--shiki-foreground)">(),</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">CountTime</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">conut_time</span><span style="color:var(--shiki-foreground)">(),</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">ResetTime</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">reset_time</span><span style="color:var(--shiki-foreground)">(),</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">UpdateTime</span><span style="color:var(--shiki-token-keyword)"> =&gt;</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">tick</span><span style="color:var(--shiki-foreground)">(),</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    fn</span><span style="color:var(--shiki-token-function)"> view</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">self, ctx</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">Context</span><span style="color:var(--shiki-foreground)">&lt;Self&gt;) </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-token-function)"> Html</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        let</span><span style="color:var(--shiki-token-keyword)"> mut</span><span style="color:var(--shiki-foreground)"> button1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> html!</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            &lt;button onclick</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{ctx</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">link</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">callback</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)">_</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">CountTime</span><span style="color:var(--shiki-foreground)">)}&gt;{</span><span style="color:var(--shiki-token-string-expression)">&quot;计次-&quot;</span><span style="color:var(--shiki-foreground)">}&lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">button&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        };</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        let</span><span style="color:var(--shiki-token-keyword)"> mut</span><span style="color:var(--shiki-foreground)"> button2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> html!</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            &lt;button onclick</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{ctx</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">link</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">callback</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)">_</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">StartTime</span><span style="color:var(--shiki-foreground)">)}&gt;{</span><span style="color:var(--shiki-token-string-expression)">&quot;开始&quot;</span><span style="color:var(--shiki-foreground)">}&lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">button&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        };</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">state </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            button1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> html!</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;button onclick</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{ctx</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">link</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">callback</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)">_</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">CountTime</span><span style="color:var(--shiki-foreground)">)}&gt;{</span><span style="color:var(--shiki-token-string-expression)">&quot;计次&quot;</span><span style="color:var(--shiki-foreground)">}&lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">button&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            button2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> html!</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;button onclick</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{ctx</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">link</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">callback</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)">_</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">StopTime</span><span style="color:var(--shiki-foreground)">)}&gt;{</span><span style="color:var(--shiki-token-string-expression)">&quot;停止&quot;</span><span style="color:var(--shiki-foreground)">}&lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">button&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        } </span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-token-keyword)"> if</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">state </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            button1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> html!</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;button onclick</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{ctx</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">link</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">callback</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)">_</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">ResetTime</span><span style="color:var(--shiki-foreground)">)}&gt;{</span><span style="color:var(--shiki-token-string-expression)">&quot;重置&quot;</span><span style="color:var(--shiki-foreground)">}&lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">button&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            button2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> html!</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;button onclick</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{ctx</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">link</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">callback</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)">_</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> Msg</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">StartTime</span><span style="color:var(--shiki-foreground)">)}&gt;{</span><span style="color:var(--shiki-token-string-expression)">&quot;继续&quot;</span><span style="color:var(--shiki-foreground)">}&lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">button&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        html!</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            &lt;&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;div id</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;time&quot;</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    { </span><span style="color:var(--shiki-token-function)">format!</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;{:0&gt;2}:{:0&gt;2}.{:0&gt;2}&quot;</span><span style="color:var(--shiki-foreground)">,</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-token-constant)">6000</span><span style="color:var(--shiki-foreground)">,(</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec</span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-token-constant)">6000</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">,</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)">self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">timer_csec</span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">) }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">div&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;div id</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;buttons&quot;</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    { button1 }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    { button2 }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">div&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;div id</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;message&quot;</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    { </span><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-foreground)">message</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">iter</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-keyword)">.</span><span style="color:var(--shiki-token-function)">map</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)">m</span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-token-function)"> html!</span><span style="color:var(--shiki-foreground)">{ &lt;li&gt; {</span><span style="color:var(--shiki-token-function)">format!</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;{:#?}&quot;</span><span style="color:var(--shiki-foreground)">,m)} &lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">li&gt; })}</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                &lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">div&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            &lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[从CNF到DPLL算法]]></title>
        <id>/blog/2022/wp-734</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-734"/>
        <updated>2022-03-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了布尔可满足性（SAT）问题中的合取范式（CNF）和求解该问题的DPLL算法。内容首先解释了CNF的定义，然后通过四个步骤详细说明了如何将任意逻辑表达式转换为CNF。最后，概述了基于回溯搜索的DPLL算法如何解决CNF-SAT问题。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="从cnf到dpll算法"><a href="#从cnf到dpll算法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>从CNF到DPLL算法<!-- --> </h1>
<p>从三个问题出发：</p>
<ol>
<li>什么是CNF？</li>
<li>如何将逻辑表达式转化为CNF？</li>
<li>什么是DPLL算法？</li>
</ol>
<h2 class="rp-toc-include" id="合取范式cnfconjunctive-normal-form"><a href="#合取范式cnfconjunctive-normal-form" class="rp-header-anchor rp-link" aria-hidden="true">#</a>合取范式（CNF，conjunctive normal form）</h2>
<p>CNF是指一系列逻辑表达式的合取，每一个子逻辑表达式都为下列类型之一：</p>
<ul>
<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 mathvariant="normal">¬</mi><mi>p</mi></mrow><annotation encoding="application/x-tex"> \lnot 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>）</li>
<li>为原子表达式的逻辑或（逻辑析取）（例如：<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><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>q</mi></mrow><annotation encoding="application/x-tex">p \lor \lnot 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">¬</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 mathvariant="normal">¬</mi><mi>p</mi></mrow><annotation encoding="application/x-tex">\lnot 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>）</li>
<li>为原子表达式的逻辑或（逻辑析取）（例如：<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><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>q</mi></mrow><annotation encoding="application/x-tex">p \lor \lnot 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">¬</span><span class="mord mathnormal" style="margin-right:0.03588em">q</span></span></span></span>）</li>
</ul>
<h2 class="rp-toc-include" id="转化为cnf"><a href="#转化为cnf" class="rp-header-anchor rp-link" aria-hidden="true">#</a>转化为CNF</h2>
<p>将普通的逻辑表达式转化为CNF需要按一下四个步骤对现有表达式进行转换：</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><mi>α</mi><mo>→</mo><mi>β</mi><mo stretchy="false">)</mo><mo>∧</mo><mo stretchy="false">(</mo><mi>β</mi><mo>→</mo><mi>α</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\alpha \rightarrow \beta) \land (\beta \rightarrow \alpha)</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.0037em">α</span><span 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.05278em">β</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.05278em">β</span><span 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.0037em">α</span><span class="mclose">)</span></span></span></span>替换<span class="katex-error" title="ParseError: KaTeX parse error: Unexpected character: &#x27;\&#x27; at position 30: …ightarrow \beta\̲" style="color:#cc0000"> \alpha \leftrightarrow \beta\</span></li>
<li>用<span class="katex-error" title="ParseError: KaTeX parse error: Unexpected character: &#x27;\&#x27; at position 25: …lpha \lor \beta\̲" style="color:#cc0000"> \lnot \alpha \lor \beta\</span>替换<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi><mo>→</mo><mi>β</mi></mrow><annotation encoding="application/x-tex">\alpha \rightarrow \beta</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.0037em">α</span><span 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.8889em;vertical-align:-0.1944em"></span><span class="mord mathnormal" style="margin-right:0.05278em">β</span></span></span></span></li>
<li>替换
<ol>
<li>用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">¬</mi><mi>α</mi><mo>∧</mo><mi mathvariant="normal">¬</mi><mi>β</mi></mrow><annotation encoding="application/x-tex">\lnot \alpha \land \lnot \beta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5556em"></span><span class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span 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.8889em;vertical-align:-0.1944em"></span><span class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.05278em">β</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><mo stretchy="false">(</mo><mi>α</mi><mo>∨</mo><mi>β</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\lnot (\alpha \lor \beta)</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><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span 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.05278em">β</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 mathvariant="normal">¬</mi><mi>α</mi><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>β</mi></mrow><annotation encoding="application/x-tex">\lnot \alpha \lor \lnot \beta</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5556em"></span><span class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span 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.8889em;vertical-align:-0.1944em"></span><span class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.05278em">β</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><mo stretchy="false">(</mo><mi>α</mi><mo>∧</mo><mi>β</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\lnot (\alpha \land \beta)</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><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span 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.05278em">β</span><span class="mclose">)</span></span></span></span></li>
<li>用<span class="katex-error" title="ParseError: KaTeX parse error: Unexpected character: &#x27;\&#x27; at position 8:  \alpha\̲" style="color:#cc0000"> \alpha\</span>替换<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">¬</mi><mi mathvariant="normal">¬</mi><mi>α</mi></mrow><annotation encoding="application/x-tex">\lnot \lnot \alpha</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 class="mord mathnormal" style="margin-right:0.0037em">α</span></span></span></span></li>
</ol>
</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>α</mi><mo>∨</mo><mi>β</mi><mo stretchy="false">)</mo><mo>∧</mo><mo stretchy="false">(</mo><mi>α</mi><mo>∨</mo><mi>γ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(\alpha \lor \beta) \land (\alpha \lor \gamma)</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.0037em">α</span><span 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.05278em">β</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.0037em">α</span><span 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.05556em">γ</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>α</mi><mo>∨</mo><mo stretchy="false">(</mo><mi>β</mi><mo>∧</mo><mi>γ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\alpha \lor (\beta \land \gamma)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5556em"></span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span 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.05278em">β</span><span 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.05556em">γ</span><span class="mclose">)</span></span></span></span></li>
</ol>
<h3 class="rp-toc-include" id="例子"><a href="#例子" class="rp-header-anchor rp-link" aria-hidden="true">#</a>例子</h3>
<p>下面利用上面的步骤将一个逻辑表达式转化为CNF</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left right" columnspacing="0em 1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mspace width="2em"></mspace><mo stretchy="false">(</mo><mi>p</mi><mo>⇔</mo><mi>q</mi><mo stretchy="false">)</mo><mo>⇒</mo><mi mathvariant="normal">¬</mi><mi>r</mi><mtext> </mtext></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">→</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mspace width="2em"></mspace><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>p</mi><mo>⇒</mo><mi>q</mi><mo stretchy="false">)</mo><mo>∧</mo><mo stretchy="false">(</mo><mi>q</mi><mo>⇒</mo><mi>p</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>⇒</mo><mi mathvariant="normal">¬</mi><mi>r</mi></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">→</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mspace width="2em"></mspace><mi mathvariant="normal">¬</mi><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>p</mi><mo>∨</mo><mi>q</mi><mo stretchy="false">)</mo><mo>∧</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>q</mi><mo>∨</mo><mi>p</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>r</mi></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">→</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mspace width="2em"></mspace><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>p</mi><mo>∨</mo><mi>q</mi><mo stretchy="false">)</mo><mo>∨</mo><mi mathvariant="normal">¬</mi><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>q</mi><mo>∨</mo><mi>p</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>r</mi></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mo stretchy="false">(</mo><mn>3.1</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">→</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mspace width="2em"></mspace><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi mathvariant="normal">¬</mi><mi>p</mi><mo>∧</mo><mi mathvariant="normal">¬</mi><mi>q</mi><mo stretchy="false">)</mo><mo>∨</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi mathvariant="normal">¬</mi><mi>q</mi><mo>∧</mo><mi mathvariant="normal">¬</mi><mi>p</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>r</mi></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mo stretchy="false">(</mo><mn>3.2</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">→</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mspace width="2em"></mspace><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mi>p</mi><mo>∧</mo><mi mathvariant="normal">¬</mi><mi>q</mi><mo stretchy="false">)</mo><mo>∨</mo><mo stretchy="false">(</mo><mi>q</mi><mo>∧</mo><mi mathvariant="normal">¬</mi><mi>p</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>r</mi></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mo stretchy="false">(</mo><mn>3.3</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mo lspace="0em" rspace="0em">→</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mspace width="2em"></mspace><mo stretchy="false">(</mo><mi>p</mi><mo>∨</mo><mi>q</mi><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>r</mi><mo stretchy="false">)</mo><mo>∧</mo><mo stretchy="false">(</mo><mi>p</mi><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>p</mi><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>r</mi><mo stretchy="false">)</mo><mo>∧</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>q</mi><mo>∨</mo><mi>q</mi><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>r</mi><mo stretchy="false">)</mo><mo>∧</mo><mo stretchy="false">(</mo><mi mathvariant="normal">¬</mi><mi>q</mi><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>p</mi><mo>∨</mo><mi mathvariant="normal">¬</mi><mi>r</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mo stretchy="false">(</mo><mn>4</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{align*}
    &amp; \qquad(p \Leftrightarrow q)\Rightarrow \lnot r\ \cr
    \rightarrow &amp; \qquad ((p\Rightarrow q)\land (q\Rightarrow p))
        \Rightarrow \lnot r &amp;(1)\cr
    \rightarrow &amp;\qquad \lnot ((\lnot p \lor q)\land (\lnot q\lor p))\lor \lnot r &amp;(2)\cr
    \rightarrow &amp;\qquad (\lnot(\lnot p \lor q)\lor \lnot(\lnot q\lor p))\lor \lnot r &amp;(3.1)\cr
    \rightarrow &amp;\qquad ((\lnot \lnot p\land \lnot q)\lor(\lnot \lnot q\land \lnot p)) \lor \lnot r &amp;(3.2)\cr
    \rightarrow &amp;\qquad ((p\land \lnot q)\lor(q\land \lnot p)) \lor \lnot r &amp;(3.3)\cr
    \rightarrow &amp;\qquad (p\lor q\lor \lnot r)\land(p\lor \lnot p\lor \lnot r)
        \land(\lnot q\lor q\lor \lnot r)\land(\lnot q\lor\lnot p\lor\lnot r) &amp;(4) 
\end{align*}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:10.5em;vertical-align:-5em"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:5.5em"><span style="top:-7.66em"><span class="pstrut" style="height:3em"></span><span class="mord"></span></span><span style="top:-6.16em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mrel">→</span></span></span><span style="top:-4.66em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mrel">→</span></span></span><span style="top:-3.16em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mrel">→</span></span></span><span style="top:-1.66em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mrel">→</span></span></span><span style="top:-0.16em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mrel">→</span></span></span><span style="top:1.34em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mrel">→</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:5em"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:5.5em"><span style="top:-7.66em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:2em"></span><span class="mopen">(</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 class="mord mathnormal" style="margin-right:0.03588em">q</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 class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span><span class="mspace"> </span></span></span><span style="top:-6.16em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:2em"></span><span class="mopen">((</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 class="mord mathnormal" style="margin-right:0.03588em">q</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 class="mopen">(</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 class="mord mathnormal">p</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 class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span></span></span><span style="top:-4.66em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:2em"></span><span class="mord">¬</span><span class="mopen">((</span><span class="mord">¬</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 class="mord mathnormal" style="margin-right:0.03588em">q</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 class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.03588em">q</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">p</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 class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span></span></span><span style="top:-3.16em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:2em"></span><span class="mopen">(</span><span class="mord">¬</span><span class="mopen">(</span><span class="mord">¬</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 class="mord mathnormal" style="margin-right:0.03588em">q</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 class="mord">¬</span><span class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.03588em">q</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">p</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 class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span></span></span><span style="top:-1.66em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:2em"></span><span class="mopen">((</span><span class="mord">¬¬</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 class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.03588em">q</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 class="mopen">(</span><span class="mord">¬¬</span><span class="mord mathnormal" style="margin-right:0.03588em">q</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 class="mord mathnormal">p</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 class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span></span></span><span style="top:-0.16em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:2em"></span><span class="mopen">((</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 class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.03588em">q</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 class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em">q</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 class="mord mathnormal">p</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 class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span></span></span><span style="top:1.34em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:2em"></span><span class="mopen">(</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 class="mord mathnormal" style="margin-right:0.03588em">q</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 class="mord mathnormal" style="margin-right:0.02778em">r</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 class="mopen">(</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 class="mord">¬</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 class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.02778em">r</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 class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.03588em">q</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.03588em">q</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 class="mord mathnormal" style="margin-right:0.02778em">r</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 class="mopen">(</span><span class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.03588em">q</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 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 class="mord">¬</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:5em"><span></span></span></span></span></span><span class="arraycolsep" style="width:1em"></span><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:4em"><span style="top:-6.16em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span></span></span><span style="top:-4.66em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mopen">(</span><span class="mord">2</span><span class="mclose">)</span></span></span><span style="top:-3.16em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mopen">(</span><span class="mord">3.1</span><span class="mclose">)</span></span></span><span style="top:-1.66em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mopen">(</span><span class="mord">3.2</span><span class="mclose">)</span></span></span><span style="top:-0.16em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mopen">(</span><span class="mord">3.3</span><span class="mclose">)</span></span></span><span style="top:1.34em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mopen">(</span><span class="mord">4</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:5em"><span></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="dpll算法"><a href="#dpll算法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>DPLL算法</h2>
<p><strong>DPLL</strong>（Davis-Putnam-Logemann-Loveland）<strong>算法</strong>，是一种完备的、以<a href="https://zh.wikipedia.org/wiki/%E5%9B%9E%E6%BA%AF" target="_blank" rel="noopener noreferrer" class="rp-link">回溯</a>为基础的<a href="https://zh.wikipedia.org/wiki/%E7%AE%97%E6%B3%95" target="_blank" rel="noopener noreferrer" class="rp-link">算法</a>，用于解决在<a href="https://zh.wikipedia.org/wiki/%E5%90%88%E5%8F%96%E8%8C%83%E5%BC%8F" target="_blank" rel="noopener noreferrer" class="rp-link">合取范式</a>（CNF）中<a href="https://zh.wikipedia.org/wiki/%E5%91%BD%E9%A2%98%E9%80%BB%E8%BE%91" target="_blank" rel="noopener noreferrer" class="rp-link">命题逻辑</a>的<a href="https://zh.wikipedia.org/wiki/%E5%B8%83%E7%88%BE%E5%8F%AF%E6%BB%BF%E8%B6%B3%E6%80%A7%E5%95%8F%E9%A1%8C" target="_blank" rel="noopener noreferrer" class="rp-link">布尔可满足性问题</a>；也就是解决CNF-SAT问题。</p>
<h3 class="rp-toc-include" id="sat问题"><a href="#sat问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>SAT问题</h3>
<p>布尔可满足性问题（<strong>Boolean satisfiability
problem</strong>；**SAT **）属于<a href="https://zh.wikipedia.org/wiki/%E6%B1%BA%E5%AE%9A%E6%80%A7%E5%95%8F%E9%A1%8C" target="_blank" rel="noopener noreferrer" class="rp-link">决定性问题</a>，也是第一个被证明属于<a href="https://zh.wikipedia.org/wiki/NP%E5%AE%8C%E5%85%A8" target="_blank" rel="noopener noreferrer" class="rp-link">NP完全</a>的问题。此问题在<a href="https://zh.wikipedia.org/wiki/%E9%9B%BB%E8%85%A6%E7%A7%91%E5%AD%B8" target="_blank" rel="noopener noreferrer" class="rp-link">计算机科学</a>上许多的领域皆相当重要，包括<a href="https://zh.wikipedia.org/w/index.php?title=%E9%9B%BB%E8%85%A6%E7%A7%91%E5%AD%B8%E5%9F%BA%E7%A4%8E%E7%90%86%E8%AB%96&amp;action=edit&amp;redlink=1" target="_blank" rel="noopener noreferrer" class="rp-link">计算机科学基础理论</a>、<a href="https://zh.wikipedia.org/wiki/%E6%BC%94%E7%AE%97%E6%B3%95" target="_blank" rel="noopener noreferrer" class="rp-link">算法</a>、<a href="https://zh.wikipedia.org/wiki/%E4%BA%BA%E5%B7%A5%E6%99%BA%E6%85%A7" target="_blank" rel="noopener noreferrer" class="rp-link">人工智能</a>、<a href="https://zh.wikipedia.org/w/index.php?title=%E7%A1%AC%E9%AB%94%E8%A8%AD%E8%A8%88&amp;action=edit&amp;redlink=1" target="_blank" rel="noopener noreferrer" class="rp-link">硬件设计</a>等等。</p>
<p>SAT问题，也叫作Boolean satisfiability
problem（布尔可满足性问题），属于<a href="https://zh.wikipedia.org/wiki/%E6%B1%BA%E5%AE%9A%E6%80%A7%E5%95%8F%E9%A1%8C" target="_blank" rel="noopener noreferrer" class="rp-link">决定性问题</a>。具体指给定一组布尔表达式，指定其中每个布尔变量的取值，使得布尔表达式的值为TRUE。</p>
<h3 class="rp-toc-include" id="算法概述"><a href="#算法概述" class="rp-header-anchor rp-link" aria-hidden="true">#</a>算法概述</h3>
<p>SAT问题是无法再多项式时间复杂度内解决的，DPLL算法也不例外。</p>
<p>DPLL算法是一种搜索算法，思想与DFS十分相似，也可以说DPLL是DFS在SAT问题上的一种实现，具体实现方法就是，算法总公式中会选择一个变量，将其赋值为True,化简赋值后的表达式，如果简化的公式是可能满足的（递归），那么原公式也是可满足的；否则就将变量复制为False，重新执行一遍递归判定，若不满足，那么原公式便是不可满足的。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>dpll(CS,B) { % CS==set of clauses. B=Bindings of atoms to truth values</span></span>
<span class="line"><span>    loop {</span></span>
<span class="line"><span>        if (empty(CS)) return B;</span></span>
<span class="line"><span>        if (emptyClause in CS) return Fail;</span></span>
<span class="line"><span>        if (easyCaseIn(CS,B)) [CS,B] = easyCase(CS,B);</span></span>
<span class="line"><span>    } % No easy cases</span></span>
<span class="line"><span>    CSCopy = copy(CS); BCopy=Copy(B);</span></span>
<span class="line"><span>    P = choose an unbound atom;</span></span>
<span class="line"><span>    [CSCopy, BCopy] = propagate(CSCopy, BCopy, P, True);</span></span>
<span class="line"><span>    answer = dpll(CSCopy,BCopy);</span></span>
<span class="line"><span>    if (answer != Fail) return answer;</span></span>
<span class="line"><span>    [CS, B] = propagate(CS, B, P, False);</span></span>
<span class="line"><span>    return dpll(CS,B)</span></span>
<span class="line"><span>}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Rust框架Yew支持CSS]]></title>
        <id>/blog/2022/wp-707</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-707"/>
        <updated>2022-03-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文探讨了Rust的Yew框架中对CSS的支持方案。由于Yew核心未内置CSS支持，文章盘点并介绍了几款社区开发的样式库，如yew_styles、yew-mdc、muicss-yew和stylist-rs等，它们通过不同方式为Yew应用提供了CSS样式和布局能力。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="rust框架yew支持css"><a href="#rust框架yew支持css" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Rust框架Yew支持CSS<!-- --> </h1>
<p>Yew主框架并未开始支持CSS，但在<a href="https://github.com/yewstack/yew/issues/533" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>统计了关于CSS支持的一些建议。</p>
<p>为了支持CSS，最直接的方法是在html!宏中直接添加class和id属性，然后在静态的index.html导入一个实现的CSS文件。其次可以使用一些其它的库来支持CSS。目前有5个库实现了Yew的CSS支持。</p>
<h2 class="rp-toc-include" id="yew"><a href="#yew" class="rp-header-anchor rp-link" aria-hidden="true">#</a>yew</h2>
<p><a href="https://github.com/dancespiele/yew_styles" target="_blank" rel="noopener noreferrer" class="rp-link"><img src="https://gh-card.dev/repos/dancespiele/yew_styles.svg" alt=""/></a></p>
<p>styles是一个完全不依赖js的Yew样式库，但官网的教程中要用npm来进行安装，其支持的样式及布局可以参考<a href="https://yewstyles.spielrs.tech/layouts" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>。此项目的目的是为Yew提供一个无需任何js依赖的样式框架，并实现一个类似于flexbox的布局系统。最近的更新在3个月前。</p>
<p><a href="https://github.com/dungeonfog/yew-mdc" target="_blank" rel="noopener noreferrer" class="rp-link"><img src="https://gh-card.dev/repos/dungeonfog/yew-mdc.svg" alt=""/></a></p>
<p>yew-mdc是一个为Yew框架实现的<a href="https://material.io/design" target="_blank" rel="noopener noreferrer" class="rp-link">Material Design</a>组件。最近更新在16个月前。</p>
<p><a href="https://github.com/AlephAlpha/muicss-yew" target="_blank" rel="noopener noreferrer" class="rp-link"><img src="https://gh-card.dev/repos/AlephAlpha/muicss-yew.svg" alt=""/></a></p>
<p>MUICSS-yew
是基于 <a href="https://www.muicss.com/" target="_blank" rel="noopener noreferrer" class="rp-link">MUI</a> 的CSS框架，<a href="https://alephalpha.github.io/muicss-yew/" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>是它支持的样式布局。最近更新是11个月前。</p>
<p><a href="https://github.com/yewstack/yewtify" target="_blank" rel="noopener noreferrer" class="rp-link"><img src="https://gh-card.dev/repos/yewstack/yewtify.svg" alt=""/></a></p>
<p><a href="https://vuetifyjs.com/en/" target="_blank" rel="noopener noreferrer" class="rp-link">Vuetify</a>组件的Yew框架的实现。两年前更新的。</p>
<p><a href="https://github.com/futursolo/stylist-rs" target="_blank" rel="noopener noreferrer" class="rp-link"><img src="https://gh-card.dev/repos/futursolo/stylist-rs.svg" alt=""/></a></p>
<p>stylist-rs通过css!和style!等宏直接将css写到rust中，两个月前更新。</p>
<p>另外<a href="https://github.com/jetli/awesome-yew#component-libraries" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>总结了yew的一些项目和组件等。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[联想小新pro 13 windows11 bug记录（2022）]]></title>
        <id>/blog/2022/wp-717</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-717"/>
        <updated>2022-03-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了联想小新Pro 13笔记本在Windows 11系统上遇到的两个Bug。第一个是Windows Hello人脸识别无法录入，通过在设备管理器中卸载并重装摄像头驱动解决。第二个是使用Win+X快捷键导致资源管理器崩溃重启的问题，该问题已通过系统更新修复。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="联想小新pro-13-windows11-bug记录2022"><a href="#联想小新pro-13-windows11-bug记录2022" class="rp-header-anchor rp-link" aria-hidden="true">#</a>联想小新pro 13 windows11 bug记录（2022）<!-- --> </h1>
<h2 class="rp-toc-include" id="人脸识别无法正常工作"><a href="#人脸识别无法正常工作" class="rp-header-anchor rp-link" aria-hidden="true">#</a>人脸识别无法正常工作</h2>
<p>具体现象：windows Hello 无法录入人脸，一直卡在请确保你的面孔剧中。</p>
<p>解决方法：在设备管理器中卸载IR
Camera（勾选删除此设备的驱动程序）和Camera，重启之后就可以录入人脸了。</p>
<h2 class="rp-toc-include" id="windowx导致资源管理器重启"><a href="#windowx导致资源管理器重启" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Window+X导致资源管理器重启</h2>
<p><a href="https://www.ithome.com/0/604/913.htm" target="_blank" rel="noopener noreferrer" class="rp-link">微软 Win11 预览版 22563 出现重大 Bug：Win + X 导致资源管理器崩溃，解决方案出炉 - IT之家 (ithome.com)</a>这里是关于此bug的具体详情及处理方案</p>
<p>更新后bug已解决</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Rust框架Yew的使用]]></title>
        <id>/blog/2022/wp-709</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-709"/>
        <updated>2022-02-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了如何开始使用Rust的Yew框架来构建WebAssembly应用。内容涵盖了环境搭建，包括添加Wasm编译目标和安装构建工具`trunk`。通过一个“Hello World”示例，文章演示了如何创建项目、添加Yew依赖、编写基本组件，并最终使用`trunk serve`启动Web应用。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="rust框架yew的使用"><a href="#rust框架yew的使用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Rust框架Yew的使用<!-- --> </h1>
<h2 class="rp-toc-include" id="环境搭建"><a href="#环境搭建" class="rp-header-anchor rp-link" aria-hidden="true">#</a>环境搭建</h2>
<p>Yew框架也是将rust代码编译成WebAssembly，添加target</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>rustup target add wasm32-unknown-unknown</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>安装<code>trunk</code>，他与<a href="https://rustwasm.github.io/wasm-pack/installer/" target="_blank" rel="noopener noreferrer" class="rp-link">wasm-pack</a>类似，是将rust编译成wasm的重要工具。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>cargo install trunk</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="实现hello-world"><a href="#实现hello-world" class="rp-header-anchor rp-link" aria-hidden="true">#</a>实现Hello World</h2>
<p>1.创建项目，用cargo创建一个新的project</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>cargo new yew-app</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2. 添加依赖，在Cargo.toml中添加yew依赖</p>
<div class="rp-codeblock language-toml"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="toml"><code><span class="line"><span style="color:var(--shiki-foreground)">[dependencies]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">yew </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> { git </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)"> &quot;https://github.com/yewstack/yew/&quot;</span><span style="color:var(--shiki-foreground)"> }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>3.实现Hello World</p>
<div class="rp-codeblock language-rust"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="rust"><code><span class="line"><span style="color:var(--shiki-token-keyword)">use</span><span style="color:var(--shiki-foreground)"> yew</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-foreground)">prelude</span><span style="color:var(--shiki-token-keyword)">::*</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">#[function_component(</span><span style="color:var(--shiki-token-function)">App</span><span style="color:var(--shiki-foreground)">)]</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">fn</span><span style="color:var(--shiki-token-function)"> app</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">-&gt;</span><span style="color:var(--shiki-token-function)"> Html</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    html!</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        &lt;h1&gt;{ </span><span style="color:var(--shiki-token-string-expression)">&quot;Hello World&quot;</span><span style="color:var(--shiki-foreground)"> }&lt;</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">h1&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">fn</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    yew</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-token-function)">start_app</span><span style="color:var(--shiki-token-keyword)">::</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-function)">App</span><span style="color:var(--shiki-foreground)">&gt;();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>4.在项目根目录下创建index.html</p>
<div class="rp-codeblock language-html"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="html"><code><span class="line"><span style="color:var(--shiki-foreground)">&lt;!</span><span style="color:var(--shiki-token-string-expression)">DOCTYPE</span><span style="color:var(--shiki-token-function)"> html</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">html</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">head</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">&lt;/</span><span style="color:var(--shiki-token-string-expression)">head</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-string-expression)">body</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">&lt;/</span><span style="color:var(--shiki-token-string-expression)">body</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">&lt;/</span><span style="color:var(--shiki-token-string-expression)">html</span><span style="color:var(--shiki-foreground)">&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="启动web应用"><a href="#启动web应用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>启动Web应用</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>trunk serve</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[将Rust程序编译成WebAssembly]]></title>
        <id>/blog/2022/wp-697</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-697"/>
        <updated>2022-02-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了将Rust程序编译成WebAssembly的完整流程。内容涵盖了所需工具链的安装，包括rustup、wasm-pack和cargo-generate。通过一个“Hello World”示例，文章详细演示了如何从模板创建项目、添加Wasm编译目标、构建Wasm包，并最终通过npm在Web服务器上运行。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="将rust程序编译成webassembly"><a href="#将rust程序编译成webassembly" class="rp-header-anchor rp-link" aria-hidden="true">#</a>将Rust程序编译成WebAssembly<!-- --> </h1>
<h2 class="rp-toc-include" id="环境搭建"><a href="#环境搭建" class="rp-header-anchor rp-link" aria-hidden="true">#</a>环境搭建</h2>
<ol>
<li>从<a href="https://www.rust-lang.org/tools/install" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>安装Rust工具链，rustup(Rust版本管理)，rustc(Rust编译器)，cargo(Rust包管理)</li>
<li>安装<a href="https://rustwasm.github.io/wasm-pack/installer/" target="_blank" rel="noopener noreferrer" class="rp-link">wasm-pack</a>，用于构建、测试发布Rust生成的WebAssembly</li>
<li>安装cargo-generate，用于从模板快速启动一个Rsut项目，<code>cargo install cargo-generate</code></li>
<li>安装<a href="https://www.npmjs.com/" target="_blank" rel="noopener noreferrer" class="rp-link">npm</a>，用于运行JavaScript
bundler和开发服务器</li>
</ol>
<h2 class="rp-toc-include" id="实现hello-world"><a href="#实现hello-world" class="rp-header-anchor rp-link" aria-hidden="true">#</a>实现Hello World</h2>
<p>1.克隆基础模板项目</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>cargo generate --git https://github.com/rustwasm/wasm-pack-template</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.添加一个新的rust编译器</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>rustup target add wasm32-unknown-unknown</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>3.编译</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>wasm-pack build</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="启动web服务器"><a href="#启动web服务器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>启动Web服务器</h2>
<p>1.初始化web项目</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>npm init wasm-app www</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.进入目录www，初始化依赖</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>npm install</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>3.在www项目中加载本地依赖wasm-app包</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>{</span></span>
<span class="line"><span>  // ...</span></span>
<span class="line"><span>  &quot;dependencies&quot;: {                     // Add this three lines block!</span></span>
<span class="line"><span>    &quot;wasm-app&quot;: &quot;file:../pkg&quot;</span></span>
<span class="line"><span>  },</span></span>
<span class="line"><span>  &quot;devDependencies&quot;: {</span></span>
<span class="line"><span>    //...</span></span>
<span class="line"><span>  }</span></span>
<span class="line"><span>}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>4.运行<code>npm install</code>在www项目中安装wasm-app依赖</p>
<p>5.修改文件<code>wasm-game-of-life/www/index.js</code>导入生成的库</p>
<p>6.启动服务器</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>npm run start</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[struct timespec转化为struct tm]]></title>
        <id>/blog/2022/wp-698</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-698"/>
        <updated>2022-02-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文总结了C语言中三种时间类型`time_t`、`struct timespec`和`struct tm`之间的相互转换方法。内容讲解了如何通过`mktime`、`localtime`和`gmtime`等标准库函数在`time_t`和`struct tm`之间转换，并说明了`struct timespec`可通过`time_t`作为中间桥梁进行转换。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="struct-timespec转化为struct-tm"><a href="#struct-timespec转化为struct-tm" class="rp-header-anchor rp-link" aria-hidden="true">#</a>struct timespec转化为struct tm<!-- --> </h1>
<p>C语言中遇到了三种时间类型：</p>
<ol>
<li>time_t</li>
<li>struct timespec</li>
<li>struct tm</li>
</ol>
<p>这里总结一下它们之间的相互转化</p>
<p>time_t 和 struct timespec</p>
<p>time_t 只存储秒而struct timespec存储了纳秒，直接将秒转化即可：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>time_t time = (time_t)ut_tv.tv_sec;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>time_t 和 struct tm</p>
<ol>
<li><a href="https://www.cplusplus.com/reference/ctime/mktime/" target="_blank" rel="noopener noreferrer" class="rp-link"><strong>mktime</strong></a>
将tm转化为time_t</li>
<li><a href="https://www.cplusplus.com/reference/ctime/localtime/" target="_blank" rel="noopener noreferrer" class="rp-link"><strong>localtime</strong></a>
将time_t转化为tm（本地时区）</li>
<li><a href="https://www.cplusplus.com/reference/ctime/gmtime/" target="_blank" rel="noopener noreferrer" class="rp-link"><strong>gmtime</strong></a>
将time_t转化为tm（UTC时区）</li>
</ol>
<p>timespec 和 tm 可以通过time_t 间接转换</p>
<h3 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h3>
<ol>
<li><a href="http://ostack.cn/qa/?qa=1049564/" target="_blank" rel="noopener noreferrer" class="rp-link"></a><a href="https://stackoverflow.com/questions/9252849/convert-timeval-to-time-t/9252913" target="_blank" rel="noopener noreferrer" class="rp-link">c - Convert timeval to
time_t - Stack
Overflow</a></li>
<li><a href="https://www.cplusplus.com/reference/ctime/tm/" target="_blank" rel="noopener noreferrer" class="rp-link">struct tm - C++ Reference
(cplusplus.com)</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C语言红黑树实现]]></title>
        <id>/blog/2022/wp-691</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-691"/>
        <updated>2022-02-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文详细介绍了红黑树的C语言实现。内容涵盖了红黑树的节点结构定义，以及创建、销毁、左旋、右旋、插入和删除等核心操作。文章对插入和删除后用于维持红黑树性质的修正（fixup）过程，根据不同情况进行了分类讨论，并提供了相应的代码实现。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="c语言红黑树实现"><a href="#c语言红黑树实现" class="rp-header-anchor rp-link" aria-hidden="true">#</a>C语言红黑树实现<!-- --> </h1>
<h2 class="rp-toc-include" id="红黑树的结构"><a href="#红黑树的结构" class="rp-header-anchor rp-link" aria-hidden="true">#</a>红黑树的结构</h2>
<p>类型定义包括两个部分：一个root节点和多个树节点</p>
<h3 class="rp-toc-include" id="root节点"><a href="#root节点" class="rp-header-anchor rp-link" aria-hidden="true">#</a><strong>root节点</strong></h3>
<p>root节点保存红黑树的树根节点</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>typedef struct rb_tree() {</span></span>
<span class="line"><span>    Node* node;</span></span>
<span class="line"><span>} RBRoot;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="树节点"><a href="#树节点" class="rp-header-anchor rp-link" aria-hidden="true">#</a><strong>树节点</strong></h3>
<p>树节点用于保存红黑树节点中的信息包括</p>
<ul>
<li>节点的颜色~ <del>color</del> ~</li>
<li>节点存储的有效信息~ <del>key</del> ~</li>
<li>以及节点的左孩子节点~ <del>left</del> <del>,右孩子节点</del> <del>right</del> <del>和父节点</del> <del>parent</del> ~</li>
</ul>
<!-- -->
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>typedef struct RBTreeNode {</span></span>
<span class="line"><span>    unsigned char color;</span></span>
<span class="line"><span>    Type key;</span></span>
<span class="line"><span>    struct RBTreeNode* left;</span></span>
<span class="line"><span>    struct RBtreeNode* right;</span></span>
<span class="line"><span>    struct RBtreeNode* parent;</span></span>
<span class="line"><span>} Node, *RBTree;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>主要有六个函数用于实现红黑树：红黑树的<strong>创建</strong>与<strong>销毁</strong>，<strong>左旋</strong>，<strong>右旋</strong>，<strong>插入节点</strong>，<strong>删除节点</strong></p>
<h2 class="rp-toc-include" id="创建"><a href="#创建" class="rp-header-anchor rp-link" aria-hidden="true">#</a><strong>创建</strong></h2>
<p>分配一个root节点</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>RBRoot* create_rbtree() {</span></span>
<span class="line"><span>    RBRoot* root = (RBRoot*) malloc( sizeof( RBRoot ) );</span></span>
<span class="line"><span>    root-&gt;node   = NULL;</span></span>
<span class="line"><span>    return root;</span></span>
<span class="line"><span>}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="销毁"><a href="#销毁" class="rp-header-anchor rp-link" aria-hidden="true">#</a><strong>销毁</strong></h2>
<p>销毁主要分四个步骤：</p>
<ol>
<li>销毁左子树</li>
<li>销毁右子树</li>
<li>释放树根节点空间</li>
<li>释放root节点空间</li>
</ol>
<!-- -->
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>static void rbtree_destroy( RBTree tree ) {</span></span>
<span class="line"><span>    if ( tree == NULL ) return;</span></span>
<span class="line"><span>    if ( tree-&gt;left != NULL ) rbtree_destroy( tree-&gt;left );</span></span>
<span class="line"><span>    if ( tree-&gt;right != NULL ) rbtree_destroy( tree-&gt;right );</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    free( tree );</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>void destroy_rbtree( RBRoot* root ) {</span></span>
<span class="line"><span>    if ( root != NULL ) rbtree_destroy( root-&gt;node );</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    free( root );</span></span>
<span class="line"><span>}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>为了实现在红黑树的插入与删除后，并且保持红黑树的性质不变，需要用到下面两个对树的基本操作左旋和右旋</p>
<h2 class="rp-toc-include" id="左旋"><a href="#左旋" class="rp-header-anchor rp-link" aria-hidden="true">#</a><strong>左旋</strong></h2>
<div>
</div>
<p>左旋操作</p>
<p>对节点b进行左旋操作，进行左旋后减少了左子树的深度，增大了右子树的深度</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>static void rbtree_left_rotate( RBRoot* root, Node* x ) {</span></span>
<span class="line"><span>    Node* y = x-&gt;right;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    x-&gt;right = y-&gt;left;</span></span>
<span class="line"><span>    if ( y-&gt;left != NULL ) y-&gt;left-&gt;parent = x;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    y-&gt;parent = x-&gt;parent;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    if ( x-&gt;parent == NULL ) {</span></span>
<span class="line"><span>        root-&gt;node = y;</span></span>
<span class="line"><span>    } else {</span></span>
<span class="line"><span>        if ( x-&gt;parent-&gt;left == x )</span></span>
<span class="line"><span>            x-&gt;parent-&gt;left = y;</span></span>
<span class="line"><span>        else</span></span>
<span class="line"><span>            x-&gt;parent-&gt;right = y;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    y-&gt;left   = x;</span></span>
<span class="line"><span>    x-&gt;parent = y;</span></span>
<span class="line"><span>}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="右旋"><a href="#右旋" class="rp-header-anchor rp-link" aria-hidden="true">#</a><strong>右旋</strong></h2>
<div>
</div>
<p>右旋操作</p>
<p>右旋操作与左旋操作相反，上图对节点a进行右旋操作，减少了右子树的深度，增大了左子树的深度</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>static void rbtree_right_rotate( RBRoot* root, Node* y ) {</span></span>
<span class="line"><span>    Node* x = y-&gt;left;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    y-&gt;left = x-&gt;right;</span></span>
<span class="line"><span>    if ( x-&gt;right != NULL ) x-&gt;right-&gt;parent = y;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    x-&gt;parent = y-&gt;parent;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    if ( y-&gt;parent == NULL ) {</span></span>
<span class="line"><span>        root-&gt;node = x;</span></span>
<span class="line"><span>    } else {</span></span>
<span class="line"><span>        if ( y == y-&gt;parent-&gt;right )</span></span>
<span class="line"><span>            y-&gt;parent-&gt;right = x;</span></span>
<span class="line"><span>        else</span></span>
<span class="line"><span>            y-&gt;parent-&gt;left = x;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    x-&gt;right = y;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    y-&gt;parent = x;</span></span>
<span class="line"><span>}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="插入节点"><a href="#插入节点" class="rp-header-anchor rp-link" aria-hidden="true">#</a><strong>插入节点</strong></h2>
<p>红黑树的插入分为两步：首先将待插入节点标记为红色并安装二叉查找树的方法插入；第二步对红黑树进行调整，使其保持红黑树的特性。根据不同的情况需要做出不同的调整：</p>
<ol>
<li>情况一：新节点N位于树的根上，没有父节点
<ol>
<li>直接将其标记为黑色即可</li>
</ol>
</li>
<li>情况二：新节点N的父节点P是黑色
<ol>
<li>直接插入，无需修正</li>
</ol>
</li>
<li>情况三：父节点P与叔父节点U都为红色
<ol>
<li>将父节点P与叔父节点U标记为黑色</li>
<li>将祖父节点G标记为红色</li>
<li>将祖父节点G作为新插入节点重新进行修正（重新执行修正）</li>
</ol>
</li>
<li>情况四：父节点P为红色，叔父节点U不为红色（新节点与父节点不同侧）
<ul>
<li>父节点P为祖父节点G的左子节点<strong>且</strong>新节点N为父节点P的右子节点
<ol>
<li>对节点N进行左旋操作</li>
<li>对节点N的左子树（左旋操作前的父节点P）执行情况5</li>
</ol>
</li>
<li>父节点P为祖父节点G的右子节点<strong>且</strong>新节点N为父节点P的左子节点
a.  对节点N进行右旋操作
b.  对节点N的右子树（右旋操作前的父节点P）执行情况5</li>
</ul>
</li>
<li>情况五：父节点P为红色，叔父节点U不为红色
<ol>
<li>将父节点P标记为黑色</li>
<li>将祖父节点G标记为红色</li>
<li>父节点P为祖父节点G的右子节点<strong>且</strong>新节点N为父节点P的右子节点
<ol>
<li>对父节点P进行右旋操作</li>
</ol>
</li>
<li>父节点P为祖父节点G的左子节点<strong>且</strong>新节点N为父节点P的左子节点
<ol>
<li>对父节点P进行左旋操作</li>
</ol>
</li>
</ol>
</li>
</ol>
<!-- -->
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>static void rbtree_insert_fixup( RBRoot* root, Node* node ) {</span></span>
<span class="line"><span>    Node *parent, *gparent;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    while ( ( parent = rb_parent( node ) ) &amp;&amp; rb_is_red( parent ) ) {</span></span>
<span class="line"><span>        gparent = rb_parent( parent );</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        if ( parent == gparent-&gt;left ) {</span></span>
<span class="line"><span>            {</span></span>
<span class="line"><span>                Node* uncle = gparent-&gt;right;</span></span>
<span class="line"><span>                if ( uncle &amp;&amp; rb_is_red( uncle ) ) {</span></span>
<span class="line"><span>                    rb_set_black( uncle );</span></span>
<span class="line"><span>                    rb_set_black( parent );</span></span>
<span class="line"><span>                    rb_set_red( gparent );</span></span>
<span class="line"><span>                    node = gparent;</span></span>
<span class="line"><span>                    continue;</span></span>
<span class="line"><span>                }</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>            if ( parent-&gt;right == node ) {</span></span>
<span class="line"><span>                Node* tmp;</span></span>
<span class="line"><span>                rbtree_left_rotate( root, parent );</span></span>
<span class="line"><span>                tmp    = parent;</span></span>
<span class="line"><span>                parent = node;</span></span>
<span class="line"><span>                node   = tmp;</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>            rb_set_black( parent );</span></span>
<span class="line"><span>            rb_set_red( gparent );</span></span>
<span class="line"><span>            rbtree_right_rotate( root, gparent );</span></span>
<span class="line"><span>        } else {</span></span>
<span class="line"><span>            {</span></span>
<span class="line"><span>                Node* uncle = gparent-&gt;left;</span></span>
<span class="line"><span>                if ( uncle &amp;&amp; rb_is_red( uncle ) ) {</span></span>
<span class="line"><span>                    rb_set_black( uncle );</span></span>
<span class="line"><span>                    rb_set_black( parent );</span></span>
<span class="line"><span>                    rb_set_red( gparent );</span></span>
<span class="line"><span>                    node = gparent;</span></span>
<span class="line"><span>                    continue;</span></span>
<span class="line"><span>                }</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>            if ( parent-&gt;left == node ) {</span></span>
<span class="line"><span>                Node* tmp;</span></span>
<span class="line"><span>                rbtree_right_rotate( root, parent );</span></span>
<span class="line"><span>                tmp    = parent;</span></span>
<span class="line"><span>                parent = node;</span></span>
<span class="line"><span>                node   = tmp;</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>            rb_set_black( parent );</span></span>
<span class="line"><span>            rb_set_red( gparent );</span></span>
<span class="line"><span>            rbtree_left_rotate( root, gparent );</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    rb_set_black( root-&gt;node );</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>static void rbtree_insert( RBRoot* root, Node* node ) {</span></span>
<span class="line"><span>    Node* y = NULL;</span></span>
<span class="line"><span>    Node* x = root-&gt;node;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    while ( x != NULL ) {</span></span>
<span class="line"><span>        y = x;</span></span>
<span class="line"><span>        if ( node-&gt;key &lt; x-&gt;key )</span></span>
<span class="line"><span>            x = x-&gt;left;</span></span>
<span class="line"><span>        else</span></span>
<span class="line"><span>            x = x-&gt;right;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    rb_parent( node ) = y;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    if ( y != NULL ) {</span></span>
<span class="line"><span>        if ( node-&gt;key &lt; y-&gt;key )</span></span>
<span class="line"><span>            y-&gt;left = node;</span></span>
<span class="line"><span>        else</span></span>
<span class="line"><span>            y-&gt;right = node;</span></span>
<span class="line"><span>    } else {</span></span>
<span class="line"><span>        root-&gt;node = node;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    node-&gt;color = RED;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    rbtree_insert_fixup( root, node );</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>int insert_rbtree( RBRoot* root, Type key ) {</span></span>
<span class="line"><span>    Node* node;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    if ( search( root-&gt;node, key ) != NULL ) return -1;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    if ( ( node = create_rbtree_node( key, NULL, NULL, NULL ) ) == NULL )</span></span>
<span class="line"><span>        return -1;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    rbtree_insert( root, node );</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    return 0;</span></span>
<span class="line"><span>}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="删除节点"><a href="#删除节点" class="rp-header-anchor rp-link" aria-hidden="true">#</a><strong>删除节点</strong></h2>
<p>节点的删除也分为两个步骤：<strong>节点的删除</strong>与<strong>删除后的修正</strong></p>
<p><strong>节点的删除</strong>分为三种情况：</p>
<ol>
<li>节点没有子树，直接删除</li>
<li>节点只有一个子树，用子节点替代此节点，在子节点上进行修正</li>
<li>节点有两个子树，用右子树最小值节点替代此节点，在新节点上进行修正</li>
</ol>
<p>对于<strong>删除后的修正</strong>，如果删除节点是红色，则无需修正，否则需要修正，分多种情况：</p>
<ol>
<li>情况一：N是新的根
<ol>
<li>无需修正</li>
</ol>
</li>
<li>情况二：兄弟节点S是红色
<ol>
<li>对父节点P进行左旋，交换N的父节点P与祖父节点G的颜色</li>
<li>进入情况三</li>
</ol>
</li>
<li>情况三：N的父节点G，兄弟节点S和S的儿子都是黑色
<ol>
<li>将兄弟节点S设置为红色</li>
<li>对父节点P从<strong>情况一</strong>开始重新修正</li>
</ol>
</li>
<li>情况四：N的父节点G为红色，兄弟节点S和S的儿子都是黑色
<ol>
<li>交换N的兄弟和父亲的颜色</li>
</ol>
</li>
<li>情况五：N的父节点G为红色，兄弟节点S为红色，S的右儿子为黑色，N为其父节点的左儿子
<ol>
<li>在S上做右旋</li>
<li>交换S和它的父节点颜色</li>
<li>进入情况六</li>
</ol>
</li>
<li>情况六：S是黑色，S的右儿子是红色，N为其父节点的左儿子
<ol>
<li>在N的父节点P上做左旋</li>
<li>交换N和父节点的颜色</li>
<li>将S的右子树设置为黑色</li>
</ol>
</li>
</ol>
<!-- -->
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>static void rbtree_delete_fixup( RBRoot* root, Node* node, Node* parent ) {</span></span>
<span class="line"><span>    Node* other;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    while ( ( !node || rb_is_black( node ) ) &amp;&amp; node != root-&gt;node ) {</span></span>
<span class="line"><span>        if ( parent-&gt;left == node ) {</span></span>
<span class="line"><span>            other = parent-&gt;right;</span></span>
<span class="line"><span>            if ( rb_is_red( other ) ) {</span></span>
<span class="line"><span>                rb_set_black( other );</span></span>
<span class="line"><span>                rb_set_red( parent );</span></span>
<span class="line"><span>                rbtree_left_rotate( root, parent );</span></span>
<span class="line"><span>                other = parent-&gt;right;</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>            if ( ( !other-&gt;left || rb_is_black( other-&gt;left ) ) &amp;&amp;</span></span>
<span class="line"><span>                 ( !other-&gt;right || rb_is_black( other-&gt;right ) ) ) {</span></span>
<span class="line"><span>                rb_set_red( other );</span></span>
<span class="line"><span>                node   = parent;</span></span>
<span class="line"><span>                parent = rb_parent( node );</span></span>
<span class="line"><span>            } else {</span></span>
<span class="line"><span>                if ( !other-&gt;right || rb_is_black( other-&gt;right ) ) {</span></span>
<span class="line"><span>                    rb_set_black( other-&gt;left );</span></span>
<span class="line"><span>                    rb_set_red( other );</span></span>
<span class="line"><span>                    rbtree_right_rotate( root, other );</span></span>
<span class="line"><span>                    other = parent-&gt;right;</span></span>
<span class="line"><span>                }</span></span>
<span class="line"><span>                rb_set_color( other, rb_color( parent ) );</span></span>
<span class="line"><span>                rb_set_black( parent );</span></span>
<span class="line"><span>                rb_set_black( other-&gt;right );</span></span>
<span class="line"><span>                rbtree_left_rotate( root, parent );</span></span>
<span class="line"><span>                node = root-&gt;node;</span></span>
<span class="line"><span>                break;</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>        } else {</span></span>
<span class="line"><span>            other = parent-&gt;left;</span></span>
<span class="line"><span>            if ( rb_is_red( other ) ) {</span></span>
<span class="line"><span>                rb_set_black( other );</span></span>
<span class="line"><span>                rb_set_red( parent );</span></span>
<span class="line"><span>                rbtree_right_rotate( root, parent );</span></span>
<span class="line"><span>                other = parent-&gt;left;</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>            if ( ( !other-&gt;left || rb_is_black( other-&gt;left ) ) &amp;&amp;</span></span>
<span class="line"><span>                 ( !other-&gt;right || rb_is_black( other-&gt;right ) ) ) {</span></span>
<span class="line"><span>                rb_set_red( other );</span></span>
<span class="line"><span>                node   = parent;</span></span>
<span class="line"><span>                parent = rb_parent( node );</span></span>
<span class="line"><span>            } else {</span></span>
<span class="line"><span>                if ( !other-&gt;left || rb_is_black( other-&gt;left ) ) {</span></span>
<span class="line"><span>                    rb_set_black( other-&gt;right );</span></span>
<span class="line"><span>                    rb_set_red( other );</span></span>
<span class="line"><span>                    rbtree_left_rotate( root, other );</span></span>
<span class="line"><span>                    other = parent-&gt;left;</span></span>
<span class="line"><span>                }</span></span>
<span class="line"><span>                rb_set_color( other, rb_color( parent ) );</span></span>
<span class="line"><span>                rb_set_black( parent );</span></span>
<span class="line"><span>                rb_set_black( other-&gt;left );</span></span>
<span class="line"><span>                rbtree_right_rotate( root, parent );</span></span>
<span class="line"><span>                node = root-&gt;node;</span></span>
<span class="line"><span>                break;</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    if ( node ) rb_set_black( node );</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>void rbtree_delete( RBRoot* root, Node* node ) {</span></span>
<span class="line"><span>    Node *child, *parent;</span></span>
<span class="line"><span>    int   color;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    if ( ( node-&gt;left != NULL ) &amp;&amp; ( node-&gt;right != NULL ) ) {</span></span>
<span class="line"><span>        Node* replace = node;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        replace = replace-&gt;right;</span></span>
<span class="line"><span>        while ( replace-&gt;left != NULL ) {</span></span>
<span class="line"><span>            replace = replace-&gt;left;</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        if ( rb_parent( node ) ) {</span></span>
<span class="line"><span>            if ( rb_parent( node )-&gt;left == node ) {</span></span>
<span class="line"><span>                rb_parent( node )-&gt;left = replace;</span></span>
<span class="line"><span>            } else {</span></span>
<span class="line"><span>                rb_parent( node )-&gt;right = replace;</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>        } else {</span></span>
<span class="line"><span>            root-&gt;node = replace;</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        child  = replace-&gt;right;</span></span>
<span class="line"><span>        parent = rb_parent( replace );</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        color = rb_color( replace );</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        if ( parent == node ) {</span></span>
<span class="line"><span>            parent = replace;</span></span>
<span class="line"><span>        } else {</span></span>
<span class="line"><span>            if ( child ) rb_set_parent( child, parent );</span></span>
<span class="line"><span>            parent-&gt;left = child;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>            replace-&gt;right = node-&gt;right;</span></span>
<span class="line"><span>            rb_set_parent( node-&gt;right, replace );</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        replace-&gt;parent    = node-&gt;parent;</span></span>
<span class="line"><span>        replace-&gt;color     = node-&gt;color;</span></span>
<span class="line"><span>        replace-&gt;left      = node-&gt;left;</span></span>
<span class="line"><span>        node-&gt;left-&gt;parent = replace;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        if ( color == BLACK ) rbtree_delete_fixup( root, child, parent );</span></span>
<span class="line"><span>        free( node );</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        return;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    if ( node-&gt;left != NULL ) {</span></span>
<span class="line"><span>        child = node-&gt;left;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    } else {</span></span>
<span class="line"><span>        child = node-&gt;right;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    parent = node-&gt;parent;</span></span>
<span class="line"><span>    color  = node-&gt;color;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    if ( child ) child-&gt;parent = parent;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    if ( parent ) {</span></span>
<span class="line"><span>        if ( parent-&gt;left == node ) {</span></span>
<span class="line"><span>            parent-&gt;left = child;</span></span>
<span class="line"><span>        } else {</span></span>
<span class="line"><span>            parent-&gt;right = child;</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    } else {</span></span>
<span class="line"><span>        root-&gt;node = child;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    if ( color == BLACK ) rbtree_delete_fixup( root, child, parent );</span></span>
<span class="line"><span>    free( node );</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>void delete_rbtree( RBRoot* root, Type key ) {</span></span>
<span class="line"><span>    Node *z, *node;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    if ( ( z = search( root-&gt;node, key ) ) != NULL ) rbtree_delete( root, z );</span></span>
<span class="line"><span>}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://github.com/torvalds/linux/blob/5bfc75d92efd494db37f5c4c173d3639d4772966/tools/include/linux/rbtree.h" target="_blank" rel="noopener noreferrer" class="rp-link">linux/rbtree.h at 5bfc75d92efd494db37f5c4c173d3639d4772966 ·
torvalds/linux
(github.com)</a></li>
<li><a href="https://github.com/torvalds/linux/blob/5bfc75d92efd494db37f5c4c173d3639d4772966/lib/rbtree.c" target="_blank" rel="noopener noreferrer" class="rp-link">linux/rbtree.c at 5bfc75d92efd494db37f5c4c173d3639d4772966 ·
torvalds/linux
(github.com)</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[nginx ssl配置问题（curl 60错误）]]></title>
        <id>/blog/2022/wp-677</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-677"/>
        <updated>2022-01-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了一次因Nginx SSL配置不当导致`curl (60)`证书错误的排查过程。问题根源在于`acme.sh`安装证书时，仅配置了cert.pem而未使用包含完整证书链的fullchain.pem。通过在Nginx配置中改用fullchain文件，成功解决了本地签发机构证书无法验证的问题。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="nginx-ssl配置问题curl-60错误"><a href="#nginx-ssl配置问题curl-60错误" class="rp-header-anchor rp-link" aria-hidden="true">#</a>nginx ssl配置问题（curl 60错误）<!-- --> </h1>
<p>通过<a href="https://github.com/acmesh-official/acme.sh" target="_blank" rel="noopener noreferrer" class="rp-link">acme.sh</a>工具给网站配置了ssl，按照流程配置成功后，使用浏览器可以正常访问，但使用curl进行访问时，出现如下错误：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>curl: (60) SSL certificate problem: unable to get local issuer certificate</span></span>
<span class="line"><span>More details here: https://curl.haxx.se/docs/sslcerts.html</span></span>
<span class="line"><span></span></span>
<span class="line"><span>curl failed to verify the legitimacy of the server and therefore could not</span></span>
<span class="line"><span>establish a secure connection to it. To learn more about this situation and</span></span>
<span class="line"><span>how to fix it, please visit the web page mentioned above.</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>由于浏览器能够访问成功，就主观认为是系统curl和系统证书的问题。</p>
<p>找到了<a href="https://stackoverflow.com/questions/24611640/curl-60-ssl-certificate-problem-unable-to-get-local-issuer-certificate" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>，尝试了各种方法都不行。</p>
<p>最终找到这个<a href="https://whatsmychaincert.com/" target="_blank" rel="noopener noreferrer" class="rp-link">网站</a>对自己网站的ssl进行测试，结果是：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>****.com is misconfigured. This is the chain it should be using.</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>于是怀疑是自己nginx配置有问题，查看网站给出的证书文件（chain），比自己配置的多了一部分。</p>
<p>网站上的有两个<code>CERTIFICATE</code>段，而acme.sh生成的只有一个。直接从<code>whatsmychaincert</code>网站下载fallchain证书。</p>
<p>在服务器上重新配置，并重启nginx，curl就可以访问了。</p>
<p>对比nginx和apache的配置：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>acme.sh --install-cert -d example.com \</span></span>
<span class="line"><span>--cert-file /path/to/certfile/in/apache/cert.pem \</span></span>
<span class="line"><span>--key-file /path/to/keyfile/in/apache/key.pem \</span></span>
<span class="line"><span>--fullchain-file /path/to/fullchain/certfile/apache/fullchain.pem \</span></span>
<span class="line"><span>--reloadcmd &quot;service apache2 force-reload&quot;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>acme.sh --install-cert -d example.com \</span></span>
<span class="line"><span>--key-file       /path/to/keyfile/in/nginx/key.pem  \</span></span>
<span class="line"><span>--fullchain-file /path/to/fullchain/nginx/cert.pem \</span></span>
<span class="line"><span>--reloadcmd     &quot;service nginx force-reload&quot;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>可以看到apache多配置了一个 --cert-file 参数，而nginx只配置了
--fullchain-file
，仔细看了一下nginx的证书安装命令，原来是安装了cert文件，忘记安装fullchain文件了。</p>
<p>大意了。。。</p>
<p>明明参数是<code>--fullchain-file</code>为啥文件名要是<code>cert.pem</code></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[WSL2联网问题]]></title>
        <id>/blog/2022/wp-675</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-675"/>
        <updated>2022-01-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文解决了WSL2中因`/etc/resolv.conf`文件被自动覆盖而导致的域名解析失败问题。方法是通过在`/etc/wsl.conf`中设置`generateResolvConf = false`来禁止自动生成该文件，并使用`chattr +i`命令锁定自定义的`resolv.conf`，从而实现永久性的DNS配置。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="wsl2联网问题"><a href="#wsl2联网问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>WSL2联网问题<!-- --> </h1>
<p>使用wsl做开发有一段时间了，最近突然遇到在wsl中无法联网，查找原因发现是因为无法解析域名。</p>
<p>查看文件<code>/etc/resolv.conf</code>，里面解释文件是wsl启动时生成的，将文件里的<code>namespace</code>更改为8.8.8.8后，可以正常访问网络，但是重启之后，文件<code>/etc/resolv.conf</code>恢复成原来的了。</p>
<p>经过一番查找，按如下方法修改后，文件/etc/resolv.conf不在会改变。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>sudo rm /etc/resolv.conf</span></span>
<span class="line"><span>sudo bash -c &#x27;echo &quot;nameserver 8.8.8.8&quot; &gt; /etc/resolv.conf&#x27;</span></span>
<span class="line"><span>sudo bash -c &#x27;echo &quot;[network]&quot; &gt; /etc/wsl.conf&#x27;</span></span>
<span class="line"><span>sudo bash -c &#x27;echo &quot;generateResolvConf = false&quot; &gt;&gt; /etc/wsl.conf&#x27;</span></span>
<span class="line"><span>sudo chattr +i /etc/resolv.conf</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://github.com/microsoft/WSL/issues/5420" target="_blank" rel="noopener noreferrer" class="rp-link">WSL 2 keeps overwriting resolv.conf · Issue #5420 · microsoft/WSL
(github.com)</a></li>
<li><a href="https://github.com/microsoft/WSL/issues/1908#issuecomment-641396913" target="_blank" rel="noopener noreferrer" class="rp-link">Custom resolv.conf being replaced by generated file, even with
comment removed. · Issue #1908 · microsoft/WSL
(github.com)</a></li>
<li><a href="https://docs.microsoft.com/zh-cn/windows/wsl/wsl-config" target="_blank" rel="noopener noreferrer" class="rp-link">WSL 中的高级设置配置 | Microsoft
Docs</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[docker 交叉编译]]></title>
        <id>/blog/2022/wp-667</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-667"/>
        <updated>2022-01-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文简要介绍了如何使用Docker进行交叉编译。核心步骤是利用`docker buildx`命令，通过创建和使用一个新的builder，并指定`--platform`参数（如`linux/arm64/v7`），即可为不同的CPU架构构建镜像。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="docker-交叉编译"><a href="#docker-交叉编译" class="rp-header-anchor rp-link" aria-hidden="true">#</a>docker 交叉编译<!-- --> </h1>
<ol>
<li>查看存在的builder：~ ~<code>docker buildx ls</code></li>
<li>创建一个新的builder：<code>docker buildx create --name mybuilder</code></li>
<li>使用新的builder：<code>docker buildx use mybuilder &amp;&amp; docker buildx inspect --bootstrap</code><br/>
<code>docker buildx inspect --bootstrap</code>命令出错：<br/>
<code>Error:error getting credentials - err: exit status 1, out: `Failed to execute child process “dbus-launch” (No such file or directory)</code><br/>
根据<a href="https://github.com/moby/moby/issues/34175" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>提示，安装了两个软件包：<br/>
<code>apt install dbus-x11</code><br/>
<code>apt install gnupg2 pass</code></li>
<li>构建镜像：<code>docker buildx build --platform linux/arm64/v7 -t name:proxy_pool .</code><br/>
平台可以选择<code>linux/amd64</code>,<code>linux/arm64</code>,<code>linux/arm/v7</code>等</li>
</ol>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a><strong>参考</strong></h2>
<ol>
<li><a href="https://docs.docker.com/desktop/multi-arch/" target="_blank" rel="noopener noreferrer" class="rp-link">Leverage multi-CPU architecture support | Docker
Documentation</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[docker 镜像 alpine 无法联网]]></title>
        <id>/blog/2022/wp-665</id>
        <link href="https://www.vhcffh.com/blog/2022/wp-665"/>
        <updated>2022-01-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了解决Docker中Alpine镜像无法联网的问题。在构建过程中遇到证书验证失败和域名解析错误，通过排查发现是`libseccomp`库版本过旧导致。最终，通过添加`--security-opt seccomp=unconfined`选项成功解决，并探讨了跨平台构建镜像的方案。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="docker-镜像-alpine-无法联网"><a href="#docker-镜像-alpine-无法联网" class="rp-header-anchor rp-link" aria-hidden="true">#</a>docker 镜像 alpine 无法联网<!-- --> </h1>
<p>alpine docker 镜像无法联网出现如下错误：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>ERROR: https://mirrors.ustc.edu.cn/alpine/v3.15/main: temporary error (try again later) WARNING: Ignoring https://mirrors.ustc.edu.cn/alpine/v3.15/main: No such file or directory 3069277072:error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed:ssl/statem/statem_clnt.c:1914:</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>基础的 docker 镜像是~ <del>python:3.6-alpine</del> ~</p>
<p><strong>stack overflow 上看到一个解答</strong></p>
<p><a href="https://stackoverflow.com/questions/53710206/docker-cant-build-because-of-alpine-error" target="_blank" rel="noopener noreferrer" class="rp-link">docker can&#x27;t build because of alpine error - Stack
Overflow</a></p>
<ol>
<li>使用~ ~<code>docker build . --network local </code>进行构建--错误仍在</li>
<li>添加~ <del>8.8.8.8</del> ~到文件<code> /etc/resolv.conf </code>并重启 docker--错误仍在</li>
</ol>
<p><strong>思路：启动一个基础 docker 容器，并进入查找错误原因</strong></p>
<ol>
<li>启动并进入容器<br/>
<code>docker run -it python:3.6-alpine /bin/sh </code></li>
<li>执行 Dockerfile 文件里的命令<br/>
apk 安装及更新时出错<br/>
使用~ <del>ping</del> <del>命令测试网络连通性，出错</del> <del>ping:
clock_gettime(MONOTONIC) failed</del> <del><br/>
使用</del> <del>nc</del> ~命令连接外部服务器，可以连接 ip，不能连接域名<br/>
猜想应该是域名解析的问题</li>
</ol>
<p><strong>对 alpine 不熟，换一个其他的基础容器</strong></p>
<p>使用镜像~ <del>python:3.6</del> ~，启动镜像后使用 pip 时报错</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>Fatal Python error: Py_Initialize: can&#x27;t initialize time</span></span>
<span class="line"><span>PermissionError: [Errno 1] Operation not permitted</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Current thread 0xb6fda010 (most recent call first):</span></span>
<span class="line"><span>Aborted (core dumped)</span></span>
<span class="line"><span># pip</span></span>
<span class="line"><span>Fatal Python error: Py_Initialize: can&#x27;t initialize time</span></span>
<span class="line"><span>PermissionError: [Errno 1] Operation not permitted</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Current thread 0xb6f12010 (most recent call first):</span></span>
<span class="line"><span>Aborted (core dumped)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>比较了一下两个 python 镜像的大小</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>python                   3.6                 a3bba401d788        2 weeks ago         696MB</span></span>
<span class="line"><span>python                   3.6-alpine          dc8c4f7b64b7        2 weeks ago         34.8MB</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>还是用~ <del>alpine</del> ~版本的吧</p>
<p><strong>域名解析问题</strong></p>
<p>搜到<a href="https://www.sudops.com/kubernetes-alpine-image-resolve-ext-dns.html" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>，说要将~ <del>/etc/resolv.conf</del> <del>文件中的</del> <del>ndots</del> ~注释掉</p>
<p>进入容器查看~ <del>/etc/resolv.conf</del> <del>文件，并没有字符</del> <del>ndots</del> ~</p>
<p>搜索 ping 的错误~ <del>ping: clock_gettime(MONOTONIC) failed</del> ~</p>
<p>找到了<a href="https://docs.linuxserver.io/faq#libseccomp" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>，有三种解决方法</p>
<ol>
<li>安装一个软件包<br/>
<code>wget http://ftp.us.debian.org/debian/pool/main/libs/libseccomp/libseccomp2_2.4.4-1~bpo10+1_armhf.deb &amp;&amp; sudo dpkg -i libseccomp2_2.4.4-1~bpo10+1_armhf.deb</code><br/>
下载时发现 2.4.4 版本已经没了，于是下载 2.5.1 版本<br/>
安装后仍然时间还不对，安装前是 1970 年，安装后变成了 2071 年</li>
<li>第二个方法一样，不过是添加源安装软件</li>
<li>方法三要更新树莓派的系统</li>
</ol>
<p>方法 2 和方法 3 需要添加源或更新系统，不想搞太多源，也懒得重新安装</p>
<p>又搜了一下，看到<a href="https://gitlab.alpinelinux.org/alpine/aports/-/issues/12091" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>，有人提示添加~ <del>--security-opt
seccomp=unconfined</del> ~</p>
<p>测试一下</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>❯ docker run -it --rm --security-opt seccomp=unconfined python:3.6-alpine ping baidu.com</span></span>
<span class="line"><span>PING baidu.com (220.181.38.148): 56 data bytes</span></span>
<span class="line"><span>64 bytes from 220.181.38.148: seq=0 ttl=48 time=45.827 ms</span></span>
<span class="line"><span>64 bytes from 220.181.38.148: seq=1 ttl=48 time=47.090 ms</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>网络可以 ping 通了，应该可行</p>
<p>但是使用~ <del>docker build</del> ~时，出现了问题</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>❯ docker build . --security-opt seccomp=unconfined</span></span>
<span class="line"><span>Error response from daemon: The daemon on this platform does not support setting security options on build</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>系统无法使用此选项</p>
<p><strong>从其它系统构建镜像后导出</strong></p>
<p>docker 镜像保存：</p>
<p>~ <del>docker save 0d33 &gt; proxy_pool.tar</del> ~</p>
<p>docker 镜像导入：</p>
<p>~ <del>docker load &lt; proxy_pool.tar</del> ~</p>
<p>两个机器架构不同</p>
<p>按照<a href="https://blog.vhcffh.com/667.html" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>进行跨平台构建即可</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[cargo报错]]></title>
        <id>/blog/2021/wp-661</id>
        <link href="https://www.vhcffh.com/blog/2021/wp-661"/>
        <updated>2021-12-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了一个cargo命令报错的解决方法。当遇到“error: no override and no default toolchain set”错误时，可以通过`rustup`工具重新安装并设置默认的stable工具链（`rustup install stable`和`rustup default stable`）来解决此问题。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="cargo报错"><a href="#cargo报错" class="rp-header-anchor rp-link" aria-hidden="true">#</a>cargo报错<!-- --> </h1>
<p>遇到一个cargo错误</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>error: no override and no default toolchain set</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>用rustup重新下载并设置默认版本</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>rustup install stable</span></span>
<span class="line"><span>rustup default stable </span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>下载更新完成后就无错误了</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="http://hongouru.blogspot.com/2018/11/solved-arch-linux-error-no-default.html?m=0" target="_blank" rel="noopener noreferrer" class="rp-link">HELP GRANTED : [ SOLVED ] Arch Linux error: no default toolchain
configured
(hongouru.blogspot.com)</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[WIFI通信]]></title>
        <id>/blog/2021/wp-600</id>
        <link href="https://www.vhcffh.com/blog/2021/wp-600"/>
        <updated>2021-12-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文概述了基于IEEE 802.11标准的WiFi通信技术。内容涵盖了WiFi各代标准的发展、网络成员与结构（如BSS, ESS, AP），以及定义的九种服务。文章还详细解析了802.11的帧结构，对帧控制、地址、序列控制等各个字段的功能和含义进行了深入说明。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="wifi通信"><a href="#wifi通信" class="rp-header-anchor rp-link" aria-hidden="true">#</a>WIFI通信<!-- --> </h1>
<p>WIFi是以<a href="https://zh.wikipedia.org/wiki/IEEE_802.11" target="_blank" rel="noopener noreferrer" class="rp-link">IEEE
802.11</a>（一种无线局域网标准）为标准的一种实现。随着标准的不断修订，其传输速度在不断增加。现今第六代的传输速率可达9.6Gbit/s。下表为第一代到第六代的相关信息。对每一代仅列出了比较常见的标准，另外也有一些不常见的<a href="https://zh.wikipedia.org/wiki/IEEE_802.11_(%E5%8E%9F%E5%A7%8B%E6%A0%87%E5%87%86)" target="_blank" rel="noopener noreferrer" class="rp-link">标准</a>。在多个厂商兼容802.11b后，802.11网络才开始大规模流行。</p>
<h2 class="rp-toc-include" id="网络成员和结构"><a href="#网络成员和结构" class="rp-header-anchor rp-link" aria-hidden="true">#</a>网络成员和结构</h2>
<ul>
<li>站点（Station），网络最基本的组成部分。</li>
<li>基本服务单元（Basic Service
Set，BSS）。网络最基本的服务单元。最简单的服务单元可以只由两个站点组成。站点可动态连结（associate）到基本服务单元中。</li>
<li>分配系统（Distribution
System，DS）。分配系统用于连结不同的基本服务单元。逻辑上，分配系统使用的介质（Medium）和基本服务单元使用的介质完全不同，尽管物理上它们可能会是同一个介质，例如同一个无线频段。</li>
<li>接入点（Access
Point，AP）。接入点即有普通站点的身份，又有连接到分配系统的功能。</li>
<li>扩展服务单元（Extended Service
Set，ESS）。由分配系统和基本服务单元组合而成。这种组合是逻辑上，并非物理上。不同的基本服务单元物有可能在地理位置相去甚远。分配系统也可以使用各种各样的技术。</li>
<li>关口（Portal）。也是一个逻辑成分，用于将无线局域网和有线<a href="https://zh.wikipedia.org/wiki/%E5%B1%80%E5%9F%9F%E7%BD%91" target="_blank" rel="noopener noreferrer" class="rp-link">局域网</a>或其它网络联系起来。</li>
</ul>
<p>这里有3种介质，站点使用的无线介质，分配系统使用的介质，以及和无线局域网集成一起的其它<a href="https://zh.wikipedia.org/wiki/%E5%B1%80%E5%9F%9F%E7%BD%91" target="_blank" rel="noopener noreferrer" class="rp-link">局域网</a>使用的介质。物理上它们可能互相重叠。<a href="https://zh.wikipedia.org/wiki/IEEE_802.11" target="_blank" rel="noopener noreferrer" class="rp-link">IEEE
802.11</a>只负责在站点使用的无线的介质上的寻址（Addressing）。分配系统和其它局域网的寻址不属无线局域网的范围。</p>
<p>IEEE802.11没有具体定义分配系统，只是定义了分配系统应该提供的服务（Service）。整个无线局域网定义了9种服务：</p>
<ul>
<li>5种服务属于分配系统的任务，分别为，连接（Association）、结束连接（Diassociation）、分配（Distribution）、集成（Integration）、再连接（Reassociation）。</li>
<li>4种服务属于站点的任务，分别为，鉴权（Authentication）、结束鉴权（Deauthentication）、隐私（Privacy）、MAC数据传输（MSDU
delivery）。</li>
</ul>
<h2 class="rp-toc-include" id="帧结构"><a href="#帧结构" class="rp-header-anchor rp-link" aria-hidden="true">#</a>帧结构</h2>
<p>一般802.11的帧结构由9个字段构成。</p>
<p>802.11帧结构</p>
<h3 class="rp-toc-include" id="Frame-Control"><a href="#Frame-Control" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Frame Control</h3>
<p>Frame control</p>
<p>所有的802.11帧都是由2字节的帧控制字段开始的，包括如下的字段：</p>
<ul>
<li>Protocol([0:1]):表示该帧所使用的MAC版本，目前只有一个版本协议编号为0。</li>
<li>Type([2:3]):表示帧类型。在802.11中定义了三种帧分别是：管理帧(Type=00b)、控制帧(Type=01b)、数据帧(Type=10b)。</li>
<li>Subtype([4:7]):对于Type定义的三种帧，进行了进一步的细化，详细参见表1。</li>
<li>ToDs([8]):表示该帧是BSS向DS发送的帧。</li>
<li>FromDs([9]):表示该帧是DS向BSS发送的帧。</li>
<li>More
Frag([10]):说明了长帧分包发送的情况，为1表示该帧之后还有其它帧，为0表示该帧为最后一帧。</li>
<li>Retry([11]):任何重传的帧都会将此位设定为1，以协助接收端剔除重复的帧。</li>
<li>Pwr
Mgmt([12]):只是该帧传送结束之后，Station应采用的电源管理模式。1表示Station即将进入省电(power-save)模式，
0表示将进入激活(active)模式。</li>
<li>More
Data([13]):针对处于省电模式的Station，AP会将从分布系统中接收来的帧加以缓存。AP将此位置1表示至少还有一帧需要传给休眠中的Station。</li>
<li>Protected Frame([14]):如果该帧经过WEP(Wired Equivalent
Privacy)加密处理则置1，否则置0。</li>
<li>Order([15]):在分段传送长帧的时候，将该位置1，表示接收端需要严格按照顺序处理该帧。</li>
</ul>
<h3 class="rp-toc-include" id="duration-id"><a href="#duration-id" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Duration ID</h3>
<p>Duration
ID（持续时间）占2个字节，主要用来记载网络分配矢量NAC的值，用来限制访问介质的时间。</p>
<h3 class="rp-toc-include" id="address"><a href="#address" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Address</h3>
<p>address有五种类型：</p>
<ol>
<li>BSSID，基本服务集标识符</li>
<li>DA，目的地址</li>
<li>SA，源地址</li>
<li>RA，接收端地址</li>
<li>TA，发送端地址</li>
</ol>
<p>根据Frame Control中的ToDS和FromDS来确定其具体功能：</p>


















































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>功能</th><th>To DS</th><th>From DS</th><th>Address1（接收端）</th><th>Address2（发送端）</th><th>Address3</th><th>Address4</th></tr></thead><tbody><tr><td>IBSS</td><td>0</td><td>0</td><td>DA</td><td>SA</td><td>BSSID</td><td>未使用</td></tr><tr><td>To AP（基础结构型）</td><td>1</td><td>0</td><td>BSSID</td><td>SA</td><td>DA</td><td>未使用</td></tr><tr><td>From AP（基础结构型）</td><td>0</td><td>1</td><td>DA</td><td>BSSID</td><td>SA</td><td>未使用</td></tr><tr><td>WDS（无线分布式系统）</td><td>1</td><td>1</td><td>RA</td><td>TA</td><td>DA</td><td>SA</td></tr></tbody></table></div>
<h3 class="rp-toc-include" id="seq-crl"><a href="#seq-crl" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Seq-crl</h3>
<p>Seq-crl（Sequence
Control）格式式如下，顺序编号4096的模数，从0开始，每处理一个上层封包就加1<br/>
若上层封包分片处理，所有帧分片采用相同顺序编号；对于重传帧，顺序编号不变</p>
<h3 class="rp-toc-include" id="frame-body字段"><a href="#frame-body字段" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Frame Body字段</h3>
<p>Frame
Body字段中记录的是通信中实际的数据，所以该字段也是数据字段。它最多可以传送2304个字节的数据(为了能够支持<a href="https://zh.wikipedia.org/wiki/%E6%9C%89%E7%B7%9A%E7%AD%89%E6%95%88%E5%8A%A0%E5%AF%86" target="_blank" rel="noopener noreferrer" class="rp-link">WEP</a>（无线加密协议），
各供应商在具体实现的时候通常是支持2312个字节的数据)。802.11的<a href="https://zh.wikipedia.org/wiki/%E9%80%BB%E8%BE%91%E9%93%BE%E8%B7%AF%E6%8E%A7%E5%88%B6" target="_blank" rel="noopener noreferrer" class="rp-link">LLC</a>（逻辑链路控制）需要占8个字节，因此最多可以承载2296个字节数据。</p>
<h3 class="rp-toc-include" id="fcs字段"><a href="#fcs字段" class="rp-header-anchor rp-link" aria-hidden="true">#</a>FCS字段</h3>
<p>FCS字段叫做帧校验序列(Frame Check Sequence,
FCS)，主要用来进行校验数据，确保传输过程没有发生错误（如果发生错误，将进行重传）。通常使用循环冗余校验<a href="https://zh.wikipedia.org/wiki/%E5%BE%AA%E7%92%B0%E5%86%97%E9%A4%98%E6%A0%A1%E9%A9%97" target="_blank" rel="noopener noreferrer" class="rp-link">CSC</a>(Cyclic
Redundancy Check)校验位进行校验。</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://zh.wikipedia.org/wiki/Wi-Fi" target="_blank" rel="noopener noreferrer" class="rp-link">Wi-Fi - 维基百科，自由的百科全书 (wikipedia.org)</a></li>
<li><a href="https://zh.wikipedia.org/wiki/IEEE_802.11" target="_blank" rel="noopener noreferrer" class="rp-link">IEEE 802.11 - 维基百科，自由的百科全书 (wikipedia.org)</a></li>
<li><a href="https://gaoyichao.com/Xiaotu/?book=network_and_security&amp;title=802.11%E5%B8%A7%E7%BB%93%E6%9E%84" target="_blank" rel="noopener noreferrer" class="rp-link">无处不在的小土-802.11帧结构 (gaoyichao.com)</a></li>
<li><a href="https://cxymm.net/article/fengfeng0328/112798288" target="_blank" rel="noopener noreferrer" class="rp-link">无线射频专题《协议类，IEEE 802.11/802.11b/802.11a/802.11g/802.11n/802.11ac标准简介》_物联网研究室-BBC的博客-程序员秘密 - 程序员秘密 (cxymm.net)</a></li>
<li><a href="http://codetd.com/article/12026114" target="_blank" rel="noopener noreferrer" class="rp-link">802.11 PHY层帧格式汇总 - 代码天地 (codetd.com)</a></li>
<li><a href="http://codetd.com/article/8450730" target="_blank" rel="noopener noreferrer" class="rp-link">802.11帧格式 - 代码天地 (codetd.com)</a></li>
<li><a href="https://www.cnblogs.com/rougungun/p/14340489.html" target="_blank" rel="noopener noreferrer" class="rp-link">802.11 帧格式和分类详解 - 肉滚滚和代码 - 博客园 (cnblogs.com)</a></li>
<li><a href="https://www.cnblogs.com/hzl6255/p/4084173.html" target="_blank" rel="noopener noreferrer" class="rp-link">802.11 MAC层 - 北落不吉 - 博客园 (cnblogs.com)</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[tar命令详解]]></title>
        <id>/blog/2021/wp-631</id>
        <link href="https://www.vhcffh.com/blog/2021/wp-631"/>
        <updated>2021-12-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文详解了Linux中的`tar`命令。内容系统地梳理了解包（-x）、打包（-c）、查看（-t）等核心参数，并对结合gzip（-z）、bzip2（-j）等不同压缩方案的用法进行了说明。文章通过清晰的参数列表和示例，为用户提供了全面的`tar`命令使用参考。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="tar命令详解"><a href="#tar命令详解" class="rp-header-anchor rp-link" aria-hidden="true">#</a>tar命令详解<!-- --> </h1>
<p>解包命令：<code>tar -xvf all.tar</code><br/>
打包命令：<code>tar -cvf all.tar dir1 dir2 1.txt 2.txt</code><br/>
解压命令：<code>tar -x[zjZ][v]f all.tar.[gz/bz2/Z]</code><br/>
压缩命令：<code>tar -c[zjZ]f all.tar.[gz/bz2/Z]</code></p>
<p>更新压缩档案中的文件</p>
<p>压缩解压参数</p>
<p>这五个参数是完全独立的，必须且只能使用其中一个与另外的参数配合进行某项操作。</p>
<p>压缩为compress（后缀Z）</p>
<p>压缩解压方案参数</p>
<p>这三个参数用来选择一个压缩方案，如果没有选择任何方案，则仅进行打包解包命令（后缀tar）。</p>
<p>输出文件到标准输出</p>
<p>其它配置</p>
<p>这两个参数添加一些其它特性。它们也是可选择。</p>
<h2 class="rp-toc-include" id="总结"><a href="#总结" class="rp-header-anchor rp-link" aria-hidden="true">#</a>总结</h2>
<p><code>unzip file.zip</code></p>
<p>压缩解压示例</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://www.cnblogs.com/xinghen1216/p/11307956.html" target="_blank" rel="noopener noreferrer" class="rp-link">（21）tar打包命令详解 - 星痕1216 - 博客园
(cnblogs.com)</a></li>
<li><a href="https://www.cnblogs.com/xiondun/p/13208881.html" target="_blank" rel="noopener noreferrer" class="rp-link">tar 压缩命令 - xiondun - 博客园
(cnblogs.com)</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C语言日期时间]]></title>
        <id>/blog/2021/wp-625</id>
        <link href="https://www.vhcffh.com/blog/2021/wp-625"/>
        <updated>2021-11-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文讲解了C语言中处理日期和时间的方法。内容介绍了`time.h`库，区分了Unix时间（time_t）和日历时间（struct tm）等概念，并详细说明了`time()`、`localtime()`、`mktime()`等核心函数的功能和用法，通过代码示例展示了如何获取和格式化当前时间。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="c语言日期时间"><a href="#c语言日期时间" class="rp-header-anchor rp-link" aria-hidden="true">#</a>C语言日期时间<!-- --> </h1>
<p>在本教程中，我们将展示如何在 C 中使用日期和时间。在本教程中，我们使用
C99。</p>
<h2 class="rp-toc-include" id="c-日期时间定义"><a href="#c-日期时间定义" class="rp-header-anchor rp-link" aria-hidden="true">#</a>C 日期时间定义</h2>
<p>我们从几个定义开始。<strong>日历时间</strong>，也称为绝对时间，是时间连续体中的一个点，例如
2016 年 2 月 17 日 13：02：5
CET。<strong>时间间隔</strong>是两个日历时间之间时间连续体的连续部分，例如 2000 年 2
月 20 日 13：00 到 14：00 之间的小时。<em>经过的时间</em>是间隔的长度，例如 28
分钟。</p>
<p><strong>时间量</strong>是经过的时间之和。经过的时间不需要是连续的。当工作花了我们十一个小时，我们可能是在不同的日子工作。<strong>CPU
时间</strong>是中央处理单元 （CPU）
用于处理计算机程序或操作系统指令的时间量。它以系统时钟或秒为单位进行测量。<strong>Unix
纪元</strong>是指从1970 年 1 月 1 日 00：00：00 UTC 开始的时间（或
1970-01-01T00：00：00Z ISO 8601）。</p>
<p><strong>Unix 时间</strong>是自<strong>Unix 纪元</strong>以来经过的时间的秒数。 <strong>Unix
时间</strong>的类型为<code>time_t</code>。另外有一个<strong>时间结构体</strong>来表示人类可读的日历时间。它由一组包括年、月、日、时、分、秒等变量组成。<strong>时间结构体</strong>的类型为<code>struct tm</code>。</p>
<p><strong>现实时间</strong>（Wall time、real-world time、wall-clock
time）不同于通过计算机微处理器时钟脉冲或周期测量得到的时间。</p>
<p><code>time.h</code>包含了以下函数：</p>
<ul>
<li><code>char *asctime(const struct tm *)</code> --- 将时间转化为字符串（过时的）</li>
<li><code>clock_t clock(void)</code> --- 返回当前进程启动后使用的CPU时间</li>
<li><code>int clock_getres(clockid_t, struct timespec *)</code> --- 返回时钟精度</li>
<li><code>int clock_gettime(clockid_t, struct timespec *)</code> ---
用于计算时间，有秒和纳秒两种精度；比clock精确</li>
<li><code>int clock_settime(clockid_t, const struct timespec *)</code> ---
设置系统时间</li>
<li><code>char *ctime(const time_t *)</code> ---
将时间值转换为日期和时间字符串（过时）</li>
<li><code>double difftime(time_t, time_t)</code> --- 计算两个时间的差</li>
<li><code>struct tm *getdate(const char *)</code> --- 将时间字符串转换为时间结构体</li>
<li><code>struct tm *gmtime(const time_t *)</code> ---
将Unix时间转换为时间结构体（<a href="https://baike.baidu.com/item/%E5%8D%8F%E8%B0%83%E4%B8%96%E7%95%8C%E6%97%B6/787659" target="_blank" rel="noopener noreferrer" class="rp-link">UTC时间</a>）</li>
<li><code>struct tm *localtime(const time_t *)</code> ---
将Unix时间转换为时间结构体（本地时间）</li>
<li><code>time_t mktime(struct tm *)</code> --- 将时间结构体转换为Unix时间</li>
<li><code>size_t strftime(char *, size_t, const char *, const struct tm *)</code> ---
以指定格式输出时间字符串</li>
<li><code>char *strptime(const char *, const char *, struct tm *)</code> ---
以指定格式的时间字符串配置时间结构体</li>
<li><code>time_t time(time_t *)</code> --- 返回Unix时间或设置Unix时间</li>
<li><code>void tzset(void)</code> --- 设置时区信息</li>
</ul>
<p>此外，<code>time.h</code>文件定义了<code>CLOCKS_PER_SEC</code>宏，它保存了每秒的处理器时钟刻度数。
<code>clock_t</code>是进程运行时间类型。</p>
<h2 class="rp-toc-include" id="unix时间time_t"><a href="#unix时间time_t" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Unix时间（time_t）</h2>
<p>Unix时间是指自Unix纪元以来的秒数。
time()函数返回自1970年1月1日协调世界时0小时0分0秒以来的时间值，单位为秒。
如果发生错误，它返回-1。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>time_t time(time_t *t);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>如果<code>t!=NULL</code>，此函数返回值也会存储到<code>t</code>指向的内存。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>#include &lt;stdio.h&gt;</span></span>
<span class="line"><span>#include &lt;time.h&gt;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>// unixtime.c</span></span>
<span class="line"><span>int main(void) {</span></span>
<span class="line"><span>    </span></span>
<span class="line"><span>    time_t now = time(NULL);</span></span>
<span class="line"><span>    </span></span>
<span class="line"><span>    if (now == -1) {</span></span>
<span class="line"><span>        </span></span>
<span class="line"><span>        puts(&quot;The time() function failed&quot;);</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    printf(&quot;%ld\n&quot;, now);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    return 0;</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>//❯ ./unixtime</span></span>
<span class="line"><span>//1638028257</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="时间结构体struct-tm"><a href="#时间结构体struct-tm" class="rp-header-anchor rp-link" aria-hidden="true">#</a>时间结构体（struct tm）</h2>
<p>时间结构体是一个人类友好的日期时间。结构体类型为<code>struct tm</code>。函数<code>localtime()</code>可以将
Unix时间（time_t）
转换为时间结构体。他使用本地账户的时区。函数原型如下：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>struct tm *localtime(const time_t *clock);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>函数存储了一个结构体并返回指针。</p>
<p>下面关于结构tm的描述来自FreeBSD手册。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>struct tm {</span></span>
<span class="line"><span>    int tm_sec;         /* seconds:0-59 */</span></span>
<span class="line"><span>    int tm_min;         /* minutes:0-59 */</span></span>
<span class="line"><span>    int tm_hour;        /* hours:0-23 */</span></span>
<span class="line"><span>    int tm_mday;        /* day of the month:1-31 */</span></span>
<span class="line"><span>    int tm_mon;         /* month:0-11 */</span></span>
<span class="line"><span>    int tm_year;        /* year:1900-&gt; */</span></span>
<span class="line"><span>    int tm_wday;        /* day of the week:0-6 */</span></span>
<span class="line"><span>    int tm_yday;        /* day in the year:0-365 */</span></span>
<span class="line"><span>    int tm_isdst;       /* daylight saving time:是否实行夏令时 */</span></span>
<span class="line"><span>};</span></span>
<span class="line"><span></span></span>
<span class="line"><span>#include &lt;stdio.h&gt; </span></span>
<span class="line"><span>#include &lt;time.h&gt;       </span></span>
<span class="line"><span> </span></span>
<span class="line"><span>int main(void) {</span></span>
<span class="line"><span>    </span></span>
<span class="line"><span>    time_t rawtime = time(NULL);  // 得到Unix时间</span></span>
<span class="line"><span>    </span></span>
<span class="line"><span>    if (rawtime == -1) {</span></span>
<span class="line"><span></span></span>
<span class="line"><span>        puts(&quot;The time() function failed&quot;);</span></span>
<span class="line"><span>        return 1;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    </span></span>
<span class="line"><span>    struct tm *ptm = localtime(&amp;rawtime);   // 将Unix时间转换为时间结构体</span></span>
<span class="line"><span>    </span></span>
<span class="line"><span>    if (ptm == NULL) {</span></span>
<span class="line"><span>        </span></span>
<span class="line"><span>puts(&quot;The localtime() function failed&quot;);</span></span>
<span class="line"><span>        return 1;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    </span></span>
<span class="line"><span>    printf(&quot;The time is: %02d:%02d:%02d\n&quot;, ptm-&gt;tm_hour, </span></span>
<span class="line"><span>           ptm-&gt;tm_min, ptm-&gt;tm_sec);</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    return 0;</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span></span></span>
<span class="line"><span>//❯ ./brokendowntime </span></span>
<span class="line"><span>//The time is: 17:00:12</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="时间结构体转换为unix时间"><a href="#时间结构体转换为unix时间" class="rp-header-anchor rp-link" aria-hidden="true">#</a>时间结构体转换为Unix时间</h2>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://zetcode.com/articles/cdatetime/" target="_blank" rel="noopener noreferrer" class="rp-link">C Date time
(zetcode.com)</a>[原文]</li>
<li><a href="https://www.cnblogs.com/buptmuye/p/3711022.html" target="_blank" rel="noopener noreferrer" class="rp-link">clock_gettime的使用，计时比clock()精确 - 木叶火影 - 博客园
(cnblogs.com)</a></li>
<li><a href="https://www.jianshu.com/p/0161e730eb5d" target="_blank" rel="noopener noreferrer" class="rp-link">C语言getdate函数、setdate函数的用法 - 简书
(jianshu.com)</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Coc-Clangd 配置]]></title>
        <id>/blog/2024/coc-clangd</id>
        <link href="https://www.vhcffh.com/blog/2024/coc-clangd"/>
        <updated>2021-11-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文解决了Vim中Coc-Clangd因头文件与源文件分离而无法找到头文件的问题。核心方法是在项目根目录创建`compile_commands.json`或`compile_flags.txt`文件，并介绍了如何分别使用CMake和Bear（配合make）来自动生成该配置文件，以确保语言服务器正常工作。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="coc-clangd-配置"><a href="#coc-clangd-配置" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Coc-Clangd 配置<!-- --> </h1>
<p>使用 vim 进行 c 项目开发时，使用 Coc-Clangd 作为语言服务器实现自动补全。当对项目结构进行调整后（.h 和.c 文件分离到了不同的目录），Coc-Clangd 需要一定的配置才能找到相关的.h 文件，否则会出现错误：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>&#x27;*.h&#x27; file not found</span></span>
<span class="line"><span>[clang: pp_file_not_found]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>具体需要在项目根目录生成<code>compile_commands.json</code>文件或者<code>compile_flags.txt</code>文件：</p>
<ol>
<li>当使用 cMake 时，可以运行<code>cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1</code>生成<code>compile_commands.json</code>。</li>
<li>当使用 make 时，需要安装<a href="https://github.com/rizsotto/Bear" target="_blank" rel="noopener noreferrer" class="rp-link">Bear</a>（apt 等包管理即可安装）。运行<code>make clean &amp;&amp; bear make</code>即可生成<code>compile_commands.json</code>。</li>
<li>对于其它情况（只使用 clang，没有构建工具和 make）时。可以创建<code>compile_flags.txt</code>文件<a href="https://releases.llvm.org/8.0.0/tools/clang/tools/extra/docs/clangd/Installation.html#compile-flags-txt" target="_blank" rel="noopener noreferrer" class="rp-link">参考 2</a>进行相关配置。</li>
</ol>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://www.reddit.com/r/vim/comments/hrfm1q/cocvim_cocclangd_setup_help/" target="_blank" rel="noopener noreferrer" class="rp-link">ProgrammAbel (u/ProgrammAbel) - Reddit</a></li>
<li><a href="https://releases.llvm.org/8.0.0/tools/clang/tools/extra/docs/clangd/Installation.html" target="_blank" rel="noopener noreferrer" class="rp-link">Getting started with clangd --- Extra Clang Tools 8 documentation (llvm.org)</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C语言库函数之函数间的goto]]></title>
        <id>/blog/2021/wp-577</id>
        <link href="https://www.vhcffh.com/blog/2021/wp-577"/>
        <updated>2021-11-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了C语言中几个实现非局部跳转和信号处理的库函数。内容涵盖了用于在函数间直接跳转的`setjmp()`和`longjmp()`，用于捕获和处理中断、异常等信号的`signal()`函数，以及用于定时触发中断的`alarm()`函数，为实现高级程序控制流程提供了方法。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="c语言库函数之函数间的goto"><a href="#c语言库函数之函数间的goto" class="rp-header-anchor rp-link" aria-hidden="true">#</a>C语言库函数之函数间的goto<!-- --> </h1>
<h2 class="rp-toc-include" id="setjmp"><a href="#setjmp" class="rp-header-anchor rp-link" aria-hidden="true">#</a>setjmp()</h2>
<p><a href="https://www.runoob.com/cprogramming/c-macro-setjmp.html" target="_blank" rel="noopener noreferrer" class="rp-link">C 库宏 -- setjmp() | 菜鸟教程
(runoob.com)</a></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>void longjmp(jmp_buf environment, int value)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>返回0，等待<code>longjmp()</code>调用<code>setjmp()</code>宏执行处返回新值</p>
<h2 class="rp-toc-include" id="longjmp"><a href="#longjmp" class="rp-header-anchor rp-link" aria-hidden="true">#</a>longjmp()</h2>
<p><a href="https://www.runoob.com/cprogramming/c-function-longjmp.html" target="_blank" rel="noopener noreferrer" class="rp-link">C 库函数 -- longjmp() | 菜鸟教程 (runoob.com)</a></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>int setjmp(jmp_buf environment)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>恢复最近一次调用<code>setjmp()</code>宏时保存的环境</p>
<p>setjmp()和longjmp()可以实现从一个函数直接跳转到另一个函数继续执行，类似于goto语句（但goto语句仅限于函数内使用）。不过这两个跳转并不保证堆栈正常，因此需要程序自己实现堆栈的保存与恢复（也就是保护现场和恢复现场）。通过sp和bp指针即可访问当前堆栈内容。堆栈寄存器sp（Stack
Pointer）一般用来存放栈的偏移指针；基数指针寄存器bp（Base
Pointer）一般在函数中用来保存进入函数时的sp的栈顶基址。bp到sp之间的内容即为当前函数的现场。在c语言中获取sp和bp指针的方法如下：</p>
<h2 class="rp-toc-include" id="signal"><a href="#signal" class="rp-header-anchor rp-link" aria-hidden="true">#</a>signal()</h2>
<p><a href="https://www.runoob.com/cprogramming/c-function-signal.html" target="_blank" rel="noopener noreferrer" class="rp-link">C 库函数 -- signal() | 菜鸟教程 (runoob.com)</a></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>void (*signal(int sig, void (*func)(int)))(int)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>宏        信号</p>
<hr/>
<p>SIGABRT   (Signal Abort) 程序异常终止。
SIGFPE    (Signal Floating-Point Exception) 算术运算出错，如除数为 0 或溢出（不一定是浮点运算）。
SIGILL    (Signal Illegal Instruction) 非法函数映象，如非法指令，通常是由于代码中的某个变体或者尝试执行数据导致的。
SIGINT    (Signal Interrupt) 中断信号，如 ctrl-C，通常由用户生成。
SIGSEGV   (Signal Segmentation Violation) 非法访问存储器，如访问不存在的内存单元。
SIGTERM   (Signal Terminate) 发送给本程序的终止请求信号。</p>
<p>sig参数</p>
<hr/>
<p>SIG_DFL   默认的信号处理程序。
SIG_IGN   忽视信号。</p>
<hr/>
<p>func参数</p>
<h2 class="rp-toc-include" id="alarm"><a href="#alarm" class="rp-header-anchor rp-link" aria-hidden="true">#</a>alarm()</h2>
<p><a href="https://www.cnblogs.com/wuyepeng/p/9788919.html" target="_blank" rel="noopener noreferrer" class="rp-link">alarm()函数的使用总结 - cs_wu - 博客园 (cnblogs.com)</a></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>unsigned int alarm(unsigned int seconds);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>设置一定时间后进行中断，执行signal()传入的函数。</p>
<p>signal函数和alarm函数可以通过中断来实现函数间的跳转，signal函数定义中断事件类型和中断发生时需要执行的函数；alarm函数定义多长时间后发生中断。</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://zhuanlan.zhihu.com/p/163852444" target="_blank" rel="noopener noreferrer" class="rp-link">C语言（6）- 函数调用和栈 - 知乎 (zhihu.com)</a></li>
<li><a href="https://www.runoob.com/cprogramming/c-macro-setjmp.html" target="_blank" rel="noopener noreferrer" class="rp-link">C 库宏 -- setjmp() | 菜鸟教程 (runoob.com)</a></li>
<li><a href="https://www.cnblogs.com/wuyepeng/p/9788919.html" target="_blank" rel="noopener noreferrer" class="rp-link">alarm()函数的使用总结 - cs_wu - 博客园 (cnblogs.com)</a></li>
<li><a href="https://www.cnblogs.com/dongzhiquan/p/4960602.html" target="_blank" rel="noopener noreferrer" class="rp-link">SS、SP、BP寄存器 - dzqdevin - 博客园 (cnblogs.com)</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C语言标准输出格式化]]></title>
        <id>/blog/2021/wp-584</id>
        <link href="https://www.vhcffh.com/blog/2021/wp-584"/>
        <updated>2021-11-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文总结了C语言中`printf`函数的格式化输出。内容详细列举了各种类型的修饰符，如`%d`, `%f`, `%x`等，并解释了如何通过指定宽度和对齐方式来控制输出格式。文章还特别针对整型和浮点型数据，展示了包括补零、进制转换、科学计数法和小数位数控制等多种格式化技巧。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="c语言标准输出格式化"><a href="#c语言标准输出格式化" class="rp-header-anchor rp-link" aria-hidden="true">#</a>C语言标准输出格式化<!-- --> </h1>
<p>c语言输出函数<code>printf</code>和<code>fprintf</code>使用修饰符格式化输出不同类型的变量。在这里总结一下各种不同的修饰符以及输出数据的格式。</p>
<h2 class="rp-toc-include" id="修饰符"><a href="#修饰符" class="rp-header-anchor rp-link" aria-hidden="true">#</a>修饰符</h2>
<p>科学计数法</p>
<p>c语言输出修饰符</p>
<p>主要的修饰符如上表所示，而且可以在<code>%</code>和修饰符之间添加一个整型数字来指定输出内容的宽度，以及对齐方式。超出宽度的字符正常输出，负数表示左对齐：</p>
<p>另外针对整型和浮点型有特别的标识可以使用。</p>
<h2 class="rp-toc-include" id="整型"><a href="#整型" class="rp-header-anchor rp-link" aria-hidden="true">#</a>整型</h2>
<p>整型主要包括<code>short</code>，<code>int</code>，<code>long int</code>，<code>long long int</code>以及它们对应的无符号类型<code>unsigned short</code>，<code>unsigned int</code>，<code>unsigned long int</code>，<code>unsigned long long int</code>。整型可以以十进制（%d）、十六进制（%x）、八进制（%o）。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>int l = 31;</span></span>
<span class="line"><span>printf( &quot;十进制(%%d)\t%d\n&quot;, l );</span></span>
<span class="line"><span>printf( &quot;十六进制(%%x,%%X)\t%x,%X\n&quot;, l, l );</span></span>
<span class="line"><span>printf( &quot;八进制(%%o)\t%o\n&quot;, l );</span></span>
<span class="line"><span>printf( &quot;十进制(%%04d,%%4d)\t%04d,%4d\n&quot;, l, l );</span></span>
<span class="line"><span>printf( &quot;十六进制(%%04x,%%4X) \t%04x,%4X\n&quot;, l, l );</span></span>
<span class="line"><span>printf( &quot;八进制(%%o04o,%%4o)\t%04o,%4o\n&quot;, l, l );</span></span>
<span class="line"><span>/*</span></span>
<span class="line"><span>十进制(%d)      31</span></span>
<span class="line"><span>十六进制(%x,%X) 1f,1F</span></span>
<span class="line"><span>八进制(%o)      37</span></span>
<span class="line"><span>十进制(%04d,%4d)        0031,  31</span></span>
<span class="line"><span>十六进制(%04x,%4X)      001f,  1F</span></span>
<span class="line"><span>八进制(%o4o,%4o)        0037,  37</span></span>
<span class="line"><span>*/</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="浮点型"><a href="#浮点型" class="rp-header-anchor rp-link" aria-hidden="true">#</a>浮点型</h2>
<p>浮点型主要包括<code>float</code>，<code>double</code>两种类型。可以使用%f，%g，%e进行输出。</p>
<p>其中%g和%s都以科学计数法的方式输出，不过%g在默认情况下包括整数位共输出六位，而%f和%e默认小数位数为六位。不过可以通过.m来指定小数点后面的位数。</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://zhuanlan.zhihu.com/p/206738818" target="_blank" rel="noopener noreferrer" class="rp-link">C语言printf指定宽度的格式化输出 - 知乎 (zhihu.com)</a></li>
<li><a href="https://www.cnblogs.com/hustxujinkang/p/4179373.html" target="_blank" rel="noopener noreferrer" class="rp-link">C/C++中浮点数输出格式问题 - sfesly - 博客园 (cnblogs.com)</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[SPI协议]]></title>
        <id>/blog/2021/wp-566</id>
        <link href="https://www.vhcffh.com/blog/2021/wp-566"/>
        <updated>2021-10-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了SPI（串行外设接口）协议。内容涵盖了SPI作为一种同步串行通信规范的定义，详细解释了SCLK、MOSI、MISO和SS四条信号线的功能，并说明了由时钟极性（CPOL）和相位（CPHA）决定的四种工作模式。文章还简要提及了Dual SPI和Quad SPI等扩展。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="spi协议"><a href="#spi协议" class="rp-header-anchor rp-link" aria-hidden="true">#</a>SPI协议<!-- --> </h1>
<p>串行外设接口（SPI）是一种同步串行通信接口规范，主要用于嵌入式系统的短距离通信。
该接口由摩托罗拉公司在20世纪80年代中期开发，已成为事实上的标准。
典型的应用包括闪存，EEPROM，SD卡和液晶显示器等。</p>
<p>有时SPI被称为四线串行总线，与三线、二线和一线串行总线形成对比。
SPI可以被准确地描述为一个同步串行接口，但它与同步串行接口（SSI）协议不同，后者也是一个四线同步串行通信协议。
SSI协议采用差分信号，只提供一个单工通信通道。
于此相对的是，SPI是一个主机和多个从机的通信。</p>
<p>SPI设备之间使用全双工模式通信，是一个主机和一个或多个从机的主从模式。主机负责初始化帧，这个数据传输帧可以用于读与写两种操作，片选线路可以从多个从机选择一个来响应主机的请求。</p>
<h2 class="rp-toc-include" id="接口定义"><a href="#接口定义" class="rp-header-anchor rp-link" aria-hidden="true">#</a>接口定义</h2>
<p>SPI总线规定了4个保留逻辑信号接口：</p>
<ul>
<li>SCLK（Serial Clock）：串行时钟，由主机发出</li>
<li>MOSI（Master Output, Slave
Input）：主机输出从机输入信号（数据由主机发出）</li>
<li>MISO（Master Input, Slave
Output）：主机输入从机输出信号（数据由从机发出）</li>
<li>SS（Slave Select）：片选信号，由主机发出，一般是低电位有效</li>
</ul>
<p>SPI总线的通信操作可以在单个主设备与一或多个从机之间进行。在只有单一从机的情况下，如果从机允许，可以固定为低电平。大多数从机具有三态逻辑的特性，当器件未被选中时MISO信号变为高阻抗（逻辑断开）。没有三态输出的器件不能与其他器件共享SPI总线段，但是可以使用外接的三态逻辑缓存来解决这个问题。</p>
<p>SPI通信有4种不同的模式，不同的从设备可能在出厂就是配置为某种模式，这是无法改变的；但我们的通信双方必须工作在同一模式下，所以我们可以通过对CPOL(时钟极性)和CPHA(时钟相位)的配置来设置我们可以通过对CPOL(时钟极性)和CPHA(时钟相位)的配置来设置我们的主设备的工作模式；CPOL是用来配置SCLK的电平的空闲态或者有效态时的电平，CPHA是用来配置数据采样是发生在上升沿还是下降沿。具体如下：</p>
<ul>
<li>Mode0：CPOL=0，CPHA=0；空闲态时SCLK=0,数据在上升沿采样，在下降沿移位</li>
<li>Mode1：CPOL=0，CPHA=1；空闲态时SCLK=0,数据在下降沿采样，在上升沿移位</li>
<li>Mode2：CPOL=1，CPHA=0；空闲态时SCLK=1,数据在上升沿采样，在下降沿移位</li>
<li>Mode3：CPOL=1，CPHA=1；空闲态时SCLK=1,数据在下降沿采样，在上升沿移位</li>
</ul>
<div>
</div>
<p>四种模式</p>
<h2 class="rp-toc-include" id="数据传输限制"><a href="#数据传输限制" class="rp-header-anchor rp-link" aria-hidden="true">#</a>数据传输限制</h2>
<p>SPI数据传输速率主要受限与三点：</p>
<ol>
<li>SPI的最大时钟频率</li>
<li>CPU处理SPI数据的能力</li>
<li>输出端驱动能力（PCB所允许的最大信号传输速率）</li>
</ol>
<h2 class="rp-toc-include" id="扩展"><a href="#扩展" class="rp-header-anchor rp-link" aria-hidden="true">#</a>扩展</h2>
<p>一、SPI设备内部详细结构如图2所示，主要组件包括状态寄存器、控制寄存器和数据寄存器，数据位移逻辑单元，波特率发生器，主从控制逻辑单元和端口控制逻辑单元。</p>
<div>
</div>
<p>SPI设备内部详细结构图</p>
<p>二、由于在SPI
Flash的通信中,全双工并不常用,因此扩展了标准SPI中MOSI、MISO的用法,使其工作在半双工,用于加倍数据传输,这就形成了Dual
SPI;在Dual
SPI的基础上再增加两条信号线(SIO2、SIO3),可以在一个时钟内传输4bit数据,使传输速率再次加倍,就形成了Qual
SPI。</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="https://www.cnblogs.com/wcat/p/13854028.html" target="_blank" rel="noopener noreferrer" class="rp-link">硬件设计:接口--SPI总线</a></li>
<li><a href="https://zh.wikipedia.org/wiki/%E5%BA%8F%E5%88%97%E5%91%A8%E9%82%8A%E4%BB%8B%E9%9D%A2" target="_blank" rel="noopener noreferrer" class="rp-link">序列周邊介面</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[top命令笔记]]></title>
        <id>/blog/2021/wp-376</id>
        <link href="https://www.vhcffh.com/blog/2021/wp-376"/>
        <updated>2021-10-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是一篇关于Linux `top`命令的学习笔记。内容详细解读了`top`命令输出界面的各个部分，包括系统摘要信息、任务进程信息和CPU状态信息，并对各参数的含义进行了解释。此外，还介绍了一些常用的交互式命令，如按CPU或内存使用率进行排序。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="top命令笔记"><a href="#top命令笔记" class="rp-header-anchor rp-link" aria-hidden="true">#</a>top命令笔记<!-- --> </h1>
<h2 class="rp-toc-include" id="界面介绍"><a href="#界面介绍" class="rp-header-anchor rp-link" aria-hidden="true">#</a>界面介绍</h2>
<p>第一行信息(<code>top -</code>)</p>

























<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">参数</th><th style="text-align:left">含义</th></tr></thead><tbody><tr><td style="text-align:left"><code>05:19:41</code></td><td style="text-align:left">系统当前时间</td></tr><tr><td style="text-align:left"><code>up 10 days, 20:15</code></td><td style="text-align:left">本机己经运行 10 天 20小时 15 分钟</td></tr><tr><td style="text-align:left"><code>1 users</code></td><td style="text-align:left">当前登录了一个用户</td></tr><tr><td style="text-align:left"><code>load average:0.01, 0.01, 0.00</code></td><td style="text-align:left">系统历史平均负载1分钟，5分钟，15分钟一般认为1表示一个CPU核满负载</td></tr></tbody></table></div>
<p>第二行信息(<code>Tasks: </code>)</p>
<p>任务进程信息</p>





























<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>参数</th><th>意义</th></tr></thead><tbody><tr><td><code>Tasks: 38 total</code></td><td>系统中的进程总数</td></tr><tr><td><code>1 running</code></td><td>正在运行的进程数</td></tr><tr><td><code>37 sleeping</code></td><td>睡眠的进程数</td></tr><tr><td><code>0 stoped</code></td><td>停止的进程数</td></tr><tr><td><code>0 zombie</code></td><td>僵尸进程数如果不是 0，则需要手工检查僵尸进程</td></tr></tbody></table></div>
<p>第三行信息(<code>%CPU(s)</code>)</p>
<p>CPU状态信息，占用CPU百分比</p>









































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>参数</th><th>意义</th></tr></thead><tbody><tr><td>0.0 us</td><td>用户进程</td></tr><tr><td>0.0 sy</td><td>内核进程</td></tr><tr><td>0.0 ni</td><td>已调整优先级的用户进程</td></tr><tr><td>100.0 id</td><td>空闲</td></tr><tr><td>0.0 wa</td><td>等待IO</td></tr><tr><td>0.0 hi</td><td>处理硬件中断</td></tr><tr><td>0.0 si</td><td>处理软件中断</td></tr><tr><td>0.0 st</td><td>虚拟机</td></tr></tbody></table></div>
<p>交互命令</p>





















<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>命令</th><th>意义</th></tr></thead><tbody><tr><td>P</td><td>根据CPU使用百分比(%CPU)大小排序（默认状态）</td></tr><tr><td>M</td><td>根据内存使用量(%MEM)排序</td></tr><tr><td>T</td><td>根据时间(TIME)/累计时间(TIME+)排序</td></tr></tbody></table></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[WSL2网络测试]]></title>
        <id>/blog/2021/wp-396</id>
        <link href="https://www.vhcffh.com/blog/2021/wp-396"/>
        <updated>2021-06-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了解决WSL2网络连接问题的过程。内容涵盖了通过`netsh`端口转发实现Windows与WSL2之间的服务访问，以及如何通过脚本为WSL2设置固定IP地址并利用Windows计划任务实现自启动。此外，还提到了重启`iphlpsvc`服务来解决端口映射失败的问题。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="wsl2网络测试"><a href="#wsl2网络测试" class="rp-header-anchor rp-link" aria-hidden="true">#</a>WSL2网络测试<!-- --> </h1>
<h3 class="rp-toc-include" id="测试网络情况"><a href="#测试网络情况" class="rp-header-anchor rp-link" aria-hidden="true">#</a>测试网络情况</h3>
<p>WSL访问window中的127.0.0.1
127.0.0.1 失败
wsl网关 失败
WSL访问windows中的wsl网关
127.0.0.1 失败
wsl网关 成功
配置转发，在windows中将wsl网关转发到对应localhost端口</p>
<h3 class="rp-toc-include" id="配置转发"><a href="#配置转发" class="rp-header-anchor rp-link" aria-hidden="true">#</a>配置转发</h3>
<p>window可以使用<code>netsh interface portproxy</code>进行端口转发配置
添加转发</p>
<div class="rp-codeblock language-powershell"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="powershell"><code><span class="line"><span style="color:var(--shiki-foreground)">netsh interface portproxy add v4tov4 listenaddress</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">127.0</span><span style="color:var(--shiki-foreground)">.</span><span style="color:var(--shiki-token-constant)">0.1</span><span style="color:var(--shiki-foreground)"> listenport</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">80</span><span style="color:var(--shiki-foreground)"> connectaddress</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">192.168</span><span style="color:var(--shiki-foreground)">.</span><span style="color:var(--shiki-token-constant)">0.10</span><span style="color:var(--shiki-foreground)"> connectport</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">80</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>监听<code>127.0.0.1:80</code>并转发到<code>192.168.0.10:80</code></p>
<p>需要对防火墙进行配置
成功使用vim连接Joplin</p>
<p>windows重新启动后WSL2的IP地址会改变
在WSL内部利用<code>ip</code>命令获取主机IP</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">ip</span><span style="color:var(--shiki-token-string)"> route</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> grep</span><span style="color:var(--shiki-token-string)"> default</span><span style="color:var(--shiki-token-keyword)"> |</span><span style="color:var(--shiki-token-function)"> awk</span><span style="color:var(--shiki-token-string-expression)"> &#x27;{print $3}&#x27;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>在windows中需要更改转发地址</p>
<div class="rp-codeblock language-powershell"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="powershell"><code><span class="line"><span style="color:var(--shiki-foreground)">wsl </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">d Linux </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">u root ip addr add </span><span style="color:var(--shiki-token-constant)">192.168</span><span style="color:var(--shiki-foreground)">.</span><span style="color:var(--shiki-token-constant)">10.10</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-token-constant)">24</span><span style="color:var(--shiki-foreground)"> broadcast </span><span style="color:var(--shiki-token-constant)">192.168</span><span style="color:var(--shiki-foreground)">.</span><span style="color:var(--shiki-token-constant)">50.255</span><span style="color:var(--shiki-foreground)"> dev eth0 label eth0:</span><span style="color:var(--shiki-token-constant)">1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">netsh interface ip add address </span><span style="color:var(--shiki-token-string-expression)">&quot;vEthernet (WSL)&quot;</span><span style="color:var(--shiki-token-constant)"> 192.168</span><span style="color:var(--shiki-foreground)">.</span><span style="color:var(--shiki-token-constant)">10.11</span><span style="color:var(--shiki-token-constant)"> 255.255</span><span style="color:var(--shiki-foreground)">.</span><span style="color:var(--shiki-token-constant)">255.0</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>当重启windows时会重置此配置
写一个脚本，实现两个ip配置
使用windows计划任务实现脚本自动启动
创建任务是选择使用最高权限运行和隐藏</p>
<p>经常遇到由于<code>iphlpsvc</code>进程异常，导致的端口映射失败，重启此进程可解决
<code>iphlpsvc</code>经常异常，不知是何缘故
通过脚本重启</p>
<div class="rp-codeblock language-powershell"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="powershell"><code><span class="line"><span style="color:var(--shiki-foreground)">net stop iphlpsvc</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">net start iphlpsvc</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h3>
<p>1.<a href="https://www.v2ex.com/t/744955" target="_blank" rel="noopener noreferrer" class="rp-link">终于找到给 wsl2 分配固定 ip 的方法</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C语言中的指针]]></title>
        <id>/blog/2021/wp-386</id>
        <link href="https://www.vhcffh.com/blog/2021/wp-386"/>
        <updated>2021-01-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文深入探讨了C语言中复杂的指针声明，如指针数组、数组指针和函数指针。文章首先提供了一份详细的C语言运算符优先级和结合律表，然后运用这些规则，逐步分析并解释了多种复杂指针声明的含义，帮助读者准确理解其结构。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="c语言中的指针"><a href="#c语言中的指针" class="rp-header-anchor rp-link" aria-hidden="true">#</a>C语言中的指针<!-- --> </h1>
<p>指针中相对复杂的主要有三类情况：指针数组、数组指针和函数指针，以及三者相互嵌套的情况。弄清楚C中各类符号的运算优先级才能真正理解其含义。</p>
<p>C语言运算符号优先级</p>


























































































<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>优先级</th><th>运算符</th><th>结合律</th></tr></thead><tbody><tr><td>1</td><td>后缀运算符：<code>[],(),.,-&gt;,++,--</code></td><td>从左到右</td></tr><tr><td>2</td><td>一元运算符：<code>++,--,!,~,+,-,*,&amp;,size_of</code></td><td>从右到左</td></tr><tr><td>3</td><td>类型转换运算：<code>(int)</code></td><td>从右到左</td></tr><tr><td>4</td><td>乘除运算符：<code>*,/,%</code></td><td>从左到右</td></tr><tr><td>5</td><td>加减运算符：<code>+,-</code></td><td>从左到右</td></tr><tr><td>6</td><td>移位运算符：<code>&lt;&lt;,&gt;&gt;</code></td><td>从左到右</td></tr><tr><td>7</td><td>关系运算符：<code>&lt;,&lt;=,&gt;,&gt;=</code></td><td>从左到右</td></tr><tr><td>8</td><td>相等运算符：<code>==,!=</code></td><td>从左到右</td></tr><tr><td>9</td><td>位与运算符：<code>&amp;</code></td><td>从左到右</td></tr><tr><td>10</td><td>位异或运算符：<code>^</code></td><td>从左到右</td></tr><tr><td>11</td><td>位或运算符：<code>|</code></td><td>从左到右</td></tr><tr><td>12</td><td>逻辑与运算符：<code>&amp;&amp;</code></td><td>从左到右</td></tr><tr><td>13</td><td>逻辑或运算符：<code>||</code></td><td>从左到右</td></tr><tr><td>14</td><td>条件运算符：<code>?:</code></td><td>从右到左</td></tr><tr><td>15</td><td>赋值运算符：<code>=,+=,-=,*=,/=,%=,&amp;=,^=,|=,&lt;&lt;=,&gt;&gt;=</code></td><td>从右到左</td></tr><tr><td>16</td><td>逗号运算符：<code>,</code></td><td>从左到右</td></tr></tbody></table></div>
<p>运算符优先级和结合律</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">p[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// [],*,int:数组，里面是指针，指向int</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">p)[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// *,[],int:指针，指向数组，数组中是int</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">p)(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a);</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// *，(int a),int:指针，指向参数为(int a)的函数，函数返回int</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">p[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">])(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> a);</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// [],*,(int a),int:数组，数组中是指针，指向参数为(int a)的函数，函数返回int</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">p</span><span style="color:var(--shiki-foreground)">())</span><span style="color:var(--shiki-token-keyword)">[]</span><span style="color:var(--shiki-foreground)">)();</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">// (),*,[],*,(),int:无参函数，返回一个指针，指向一个数组，数组中是指针，指向一个无参函数，函数返回int</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>[]运算级比*高</p>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<ol>
<li><a href="http://c.biancheng.net/view/285.html" target="_blank" rel="noopener noreferrer" class="rp-link">C语言运算符优先级</a></li>
<li><a href="https://www.jianshu.com/p/a6d5c9e3dd8c" target="_blank" rel="noopener noreferrer" class="rp-link">C语言总结</a></li>
<li><a href="https://www.jianshu.com/p/30bfb7fbc3e8" target="_blank" rel="noopener noreferrer" class="rp-link">C复杂指针</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[git基本用法笔记]]></title>
        <id>/blog/2020/wp-351</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-351"/>
        <updated>2020-10-16T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是一份Git基本用法的笔记。内容涵盖了分支的建立与合并（`merge`与`rebase`的区别），利用相对引用（`^`和`~`）在提交记录间移动HEAD指针，以及如何通过`reset`、`revert`、`cherry-pick`和交互式`rebase`等命令来撤销或修改提交记录，为版本控制提供了实用的操作指南。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="git基本用法笔记"><a href="#git基本用法笔记" class="rp-header-anchor rp-link" aria-hidden="true">#</a>git基本用法笔记<!-- --> </h1>
<h2 class="rp-toc-include" id="分支建立于合并"><a href="#分支建立于合并" class="rp-header-anchor rp-link" aria-hidden="true">#</a>分支建立于合并</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>git commit # 提交</span></span>
<span class="line"><span>git branch branch_name # 新建分支</span></span>
<span class="line"><span>git checkout branch_name # 切换分支</span></span>
<span class="line"><span></span></span>
<span class="line"><span>git merge branch_name # 合并分支</span></span>
<span class="line"><span># 将branch_name合并到当前分支，并增加一次commit</span></span>
<span class="line"><span></span></span>
<span class="line"><span>git rebase branch_name # 复制分支</span></span>
<span class="line"><span># 将当前分支所有commit复制到branch_name，没有新增commit</span></span>
<span class="line"><span># 当前分支和branch_name 有共同的祖先</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="在分支树上移动"><a href="#在分支树上移动" class="rp-header-anchor rp-link" aria-hidden="true">#</a>在分支树上移动</h2>
<p>branch_name指向分支树上的一个提交记录，每一个提交记录都有唯一的SHA-1
Hash值标识作为commit id</p>
<p>默认HEAD指向当前提交记录，当前记录有分支名，则显示为branch_name*</p>
<p>HEAD可以指向任何其他的提交记录，只需要checkout到一个指定的commit
id，或者使用引用</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>git checkout da3423*</span></span>
<span class="line"><span># 相对引用^</span></span>
<span class="line"><span>git checkout HEAD^^ # 将HEAD指向HEAD的第2父提交</span></span>
<span class="line"><span>git checkout master^ # 将HEAD指向master的第1父提交</span></span>
<span class="line"><span>git branch -f master HEAD^^^ # 强制将master指向HEAD的第三父提交</span></span>
<span class="line"><span># 相对引用~</span></span>
<span class="line"><span>git checkout HEAD~10 # 将HEAD指向HEAD前10个commit id</span></span>
<span class="line"><span># 撤销变更</span></span>
<span class="line"><span>git reset master^ # 当前分支指向master^，工作区内容不变</span></span>
<span class="line"><span>git revert master^ # 增加一次提交，使当前分支与master^相同</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="移动提交记录"><a href="#移动提交记录" class="rp-header-anchor rp-link" aria-hidden="true">#</a>移动提交记录</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>git cherry-pick &lt;提交号&gt;...</span></span>
<span class="line"><span># 将一系列提交copy到当前分支</span></span>
<span class="line"><span>git rebase -i &lt;提交号&gt;</span></span>
<span class="line"><span># 以-i参数为基,重新整理提交（排序，删除等）</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[matplotlib绘制x轴不连续的图]]></title>
        <id>/blog/2020/wp-342</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-342"/>
        <updated>2020-10-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文解决了使用matplotlib绘制X轴不连续数据时，图表会自动补全的问题。核心方法是，先将Y轴数据对一个连续的整数序列（如`range(len(y))`）进行绘图，然后利用`plt.xticks()`函数，将图表上连续的整数刻度标签替换为原始的不连续X轴数据标签，从而实现视觉上的不连续效果。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="matplotlib绘制x轴不连续的图"><a href="#matplotlib绘制x轴不连续的图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>matplotlib绘制x轴不连续的图<!-- --> </h1>
<p>问题：matplotlib在绘制x轴不连续的数据时，会自补全；当使用日期作为横坐标时，会出现一些空值</p>
<p>例如：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>x = [1,2,3,4,5,8]</span></span>
<span class="line"><span>y = [1,4,9,16,25,36]</span></span>
<span class="line"><span>plt.plot(x,y)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div>
</div>
<p>matplotlib的x轴是一定连续的，因此先将需要的图形绘制出来，然后使用<code>plt.xticks(ticks,labels)</code>替换新的坐标显示</p>
<p>ticks为实际位置，labels为要显示的文本</p>
<p>画出需要的图形</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>x = [1,2,3,4,5,8]</span></span>
<span class="line"><span>y = [1,4,9,16,25,36]</span></span>
<span class="line"><span>plt.plot(range(y),y)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div>
</div>
<p>重新定义x轴的显示</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>plt.xticks(range(len(x)),x)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div>
</div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[在wsl上安装Arch Linux]]></title>
        <id>/blog/2020/wp-326</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-326"/>
        <updated>2020-10-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了在Windows子系统（WSL）上安装Arch Linux的方法。文章放弃了传统的Bootstrap镜像安装，转而推荐使用专为WSL设计的ArchWSL分发版进行安装。内容还涵盖了安装后的关键配置步骤，如初始化pacman密钥环，以及为不支持systemd的WSL1安装替代方案。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="在wsl上安装arch-linux"><a href="#在wsl上安装arch-linux" class="rp-header-anchor rp-link" aria-hidden="true">#</a>在wsl上安装Arch Linux<!-- --> </h1>
<p>首先启用&quot;适用于 Linux 的 Windows
子系统&quot;可选功能，并从应用商店安装Ubuntu（本文是在wsl1上进行实验的）</p>
<h2 class="rp-toc-include" id="备份现有linux分发版"><a href="#备份现有linux分发版" class="rp-header-anchor rp-link" aria-hidden="true">#</a>备份现有Linux分发版</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>wsl -l #查看所有Linux分发版</span></span>
<span class="line"><span>wsl --export &lt;分发版&gt; &lt;文件名&gt; #到处分发版到文件</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="使用-bootstrap-镜像安装"><a href="#使用-bootstrap-镜像安装" class="rp-header-anchor rp-link" aria-hidden="true">#</a>使用 Bootstrap 镜像安装</h2>
<p>下载Bootstrap镜像</p>
<ul>
<li><a href="https://www.archlinux.org/download/" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.archlinux.org/download/</a></li>
<li><a href="https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/" target="_blank" rel="noopener noreferrer" class="rp-link">https://mirrors.tuna.tsinghua.edu.cn/archlinux/iso/</a></li>
</ul>
<p>选择合适版本的<code>archlinux-bootstrap-2020.10.01-x86_64.tar.gz</code>进行下载</p>
<p>解压</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>tar -zxf archlinux-bootstrap-2020.10.01-x86_64.tar.gz</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>选择软件仓库服务器，去掉<code>etc/pacman.d/mirrorlist</code>中的一个注释</p>
<p>进入chroot</p>
<p>[进入失败]{.has-inline-color
.has-vivid-red-color}，出现错误<code>mount: /tmp/root.x86_64/dev: unknown filesystem type &#x27;devtmpfs&#x27;</code>和<code>ERROR: failed to setup chroot /tmp/root.x86_64</code></p>
<p>这是参照<a href="https://wiki.archlinux.org/index.php/Install_Arch_Linux_from_existing_Linux_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)" target="_blank" rel="noopener noreferrer" class="rp-link" title="https://wiki.archlinux.org/index.php/Install_Arch_Linux_from_existing_Linux_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)">官网</a>的方法，可能不适用于wsl，参照<a href="https://github.com/yuk7/ArchWSL" target="_blank" rel="noopener noreferrer" class="rp-link" title="https://github.com/yuk7/ArchWSL">github</a>安装一个新的Linux分发版Arch
Linux</p>
<h2 class="rp-toc-include" id="使用archwsl安装arch-linux子系统"><a href="#使用archwsl安装arch-linux子系统" class="rp-header-anchor rp-link" aria-hidden="true">#</a>使用ArchWSL安装Arch linux子系统</h2>
<p>ArchWSL是基于WSL的Arch linux分发版，专门用于管理Arch Linux分发版</p>
<p>Arch.exe用于Arch Linux子系统安装，其余两个应该是将Arch放到微软应用商店。</p>
<p>Note：安装.appx后开启Arch时出现<strong>系统资源不足，无法完成请求的服务。</strong></p>
<p>安装后是WSL2中的Arch Linux</p>
<p>Note：为了正常使用pacman需要<a href="https://github.com/yuk7/ArchWSL/wiki/How-to-Setup" target="_blank" rel="noopener noreferrer" class="rp-link" title="https://github.com/yuk7/ArchWSL/wiki/How-to-Setup">初始化keyring</a></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>sudo pacman-key --init</span></span>
<span class="line"><span>sudo pacman-key --populate</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>Note：安装systemctl alternative代替systemctl（WSL不支持systemctl）</p>
<p>WSL2之间安装<a href="https://aur.archlinux.org/packages/genie-systemd" target="_blank" rel="noopener noreferrer" class="rp-link">genie-systemd</a>即可</p>
<p>Note：[使用<code>makepkg -si</code>命令时出错]{.has-inline-color
.has-vivid-red-color}</p>
<p><code>==&gt; ERROR: Cannot find the strip binary required for object file stripping.</code></p>
<p>执行<code>sudo pacman -Sy base-devel</code>更新即可</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[python标准库模块heapq]]></title>
        <id>/blog/2020/wp-322</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-322"/>
        <updated>2020-10-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了Python标准库中的`heapq`模块，它提供了一系列高效的堆排序算法。文章首先解释了堆（近似完全二叉树）的基本性质，然后详细列举并说明了`heapq`模块中的核心函数，如`heapify`、`heappush`、`heappop`、`nsmallest`和`nlargest`等，为实现优先队列等数据结构提供了便利。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="python标准库模块heapq"><a href="#python标准库模块heapq" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python标准库模块heapq<!-- --> </h1>
<p>堆是一个近似完全二叉树的结构，并同时满足如下性质</p>
<blockquote>
<p><strong>子节点的键值或索引总是小于（或者大于）它的父节点</strong></p>
</blockquote>
<p>python标准库模块heapq实现了堆排序的一些算法，主要提供了以下几个函数</p>
<ol>
<li><code>heapify(x)</code>:本地把列表转换为堆，时间复杂度O(n)</li>
<li><code>heappush(heap, item)</code>:将新项添加到堆，并保持堆的不变性</li>
<li><code>heappop(heap)</code>:从堆中取出最小项，并保持堆的不变性</li>
<li><code>heapreplace(heap, item)</code>:从堆中取出最小项，并将新项添加到堆，并保持堆的不变性</li>
<li><code>heappushpop(heap, item)</code>:从堆中取出最小项，并将新项添加到堆，并保持堆的不变性（速度更快）</li>
<li><code>nsmallest(n, iterable, key=None)</code>:从可迭代对象中返回前n个最小项</li>
<li><code>nlargest(n, iterable, key=None)</code>:从可迭代对象中返回前n个最大项</li>
<li><code>merge(*iterables, key=None, reverse=False)</code>:合并多个可排序对象</li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[初探Tornado]]></title>
        <id>/blog/2020/wp-277</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-277"/>
        <updated>2020-08-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文初步探讨了Python的Tornado Web框架。文章重点阐述了其两大核心特点：异步和非阻塞。内容对比了Tornado与Flask、Django等WSGI框架在服务器实现上的不同，并深入解释了异步非阻塞IO模型的重要性，以及Tornado如何利用epoll实现高效的IO多路复用，以支持高并发连接。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="初探tornado"><a href="#初探tornado" class="rp-header-anchor rp-link" aria-hidden="true">#</a>初探Tornado<!-- --> </h1>
<blockquote>
<p>Tornado是一种 Web 服务器软件的开源版本。Tornado 和主流Web
服务器框架（包括大多数 Python
的框架）有着明显的区别：它是非阻塞式服务器，而且速度相当快。</p>
<p>得利于其非阻塞的方式和对epoll的运用，Tornado
每秒可以处理数以千计的连接，因此 Tornado 是实时 Web 服务的一个
理想框架。</p>
</blockquote>
<p>来自百度百科的解释，其中<strong>异步非阻塞</strong>和<strong>对epoll的运用</strong>是其两大特点</p>
<p>Tornado不同于<a href="http://docs.jinkan.org/docs/flask/index.html" target="_blank" rel="noopener noreferrer" class="rp-link">Flask</a>和<a href="https://docs.djangoproject.com/en/3.1/" target="_blank" rel="noopener noreferrer" class="rp-link" title="https://docs.djangoproject.com/en/3.1/">Django</a>两个常见框架，主要特点是Tornado内部实现了自己的Web服务器，而Flask和Django是采用WSGI协议与服务器对接。在开发时，Flask依赖<a href="https://werkzeug.palletsprojects.com/en/1.0.x/" target="_blank" rel="noopener noreferrer" class="rp-link" title="https://werkzeug.palletsprojects.com/en/1.0.x/">Werkzeug</a>WSGI
工具集实现一个基于WSGI协议的内置web服务器来满足本地调试，部署的时候需要选择合适的<a href="http://docs.jinkan.org/docs/flask/deploying/index.html" target="_blank" rel="noopener noreferrer" class="rp-link">WSGI服务器</a>来满足生产需求。Django也是同样原理，使用内置WSGI服务器满足开发，使用其他性能更高的WSGI服务器满足生产中的并发需求。（Tornado中的web服务器和web框架都可以实现对WSGI的兼容，可以Tornado服务器模块为其他web框架提供WSGI服务器，也可以使用其他服务器来部署Tornado的web应用。）</p>
<h2 class="rp-toc-include" id="异步非阻塞"><a href="#异步非阻塞" class="rp-header-anchor rp-link" aria-hidden="true">#</a>异步非阻塞</h2>
<p>异步和非阻塞是非常相关的而且这两个术语经常交换使用，但它们不完全相同。</p>
<h3 class="rp-toc-include" id="为什么异步"><a href="#为什么异步" class="rp-header-anchor rp-link" aria-hidden="true">#</a>为什么异步</h3>
<p>通常情况下，web服务器对与每个客户端的请求，都会创建一个线程与其连接，这就是同步模式。在处理高并发时，对每一个请求都会创建一个线程，如此多的线程开销是服务器的压力极大。异步模式在处理了并发请求时，先将请求放到后台处理，通过事件轮询等机制，将处理好的请求发送会客户端，从而减少了线程的创建。</p>
<h3 class="rp-toc-include" id="非阻塞"><a href="#非阻塞" class="rp-header-anchor rp-link" aria-hidden="true">#</a>非阻塞</h3>
<p>非阻塞是指在不能立刻得到结果之前，该函数不会阻塞当前线程，而会立刻返回（继续执行下面代码，或者使用重试机制）。阻塞的发生主要是由于<strong>系统IO</strong>（网络IO，文件读写IO等）引起的，或者在处理客户端请求时由于复杂的计算引起的CPU阻塞。总之阻塞的发生是由与服务器处理客户端请求需要一定的时间，直接执行（阻塞）或者直接返回，通过一定机制等到准备好要发送到客户端的内容后，发送到对应客户端。如何处理好系统IO是非阻塞的关键，Tornado是通过<strong>epoll</strong>方式的IO多路复用来实现的。</p>
<h2 class="rp-toc-include" id="epoll"><a href="#epoll" class="rp-header-anchor rp-link" aria-hidden="true">#</a>epoll</h2>
<p>系统IO主要是程序与硬件间接交互的一种方式，如果每个程序都直接操作硬件，不仅程序开发会变得复杂，而且不同程序不统一的操作方式会使硬件混乱。因此有了操作系统，程序通过系统接口访问硬件，操作系统对所有硬件统一管理。当程序调用了系统的IO接口后，操作系统有不同的处理模式，不同的模式就是不同的IO模型。IO多路复用是一种IO模型，epoll是其中一种方式，常用的IO模型有五种：</p>
<ol>
<li>阻塞式IO<br/>
当调用IO请求时直接进入<strong>阻塞状态</strong>，当IO完成（包括准备数据和拷贝数据）时，进入<strong>就绪状态</strong>，等待被再次调度进入<strong>运行状态</strong>。</li>
<li>非阻塞式IO<br/>
当调用IO请求时，系统内核直接返回一个error信息，程序一边处理其它事情，每隔一段时间都询问内核IO数据是否准备完成，直到返回准备完成，然后把数据由内核拷贝到用户空间。</li>
<li>IO多路复用<br/>
多路复用把一个程序的多个IO请求整合到一起进行阻塞，主要实现方式有select，poll，epoll。</li>
<li>信号驱动IO<br/>
内核通过信号通知程序IO数据已经准备好。</li>
<li>异步IO<br/>
发出IO请求后，内核把数据拷贝到用户空间后，通知程序IO已经完成。</li>
</ol>
<p>IO多路复用的方式</p>
<p>Tornado使用epoll（依赖依赖操作系统）的方式对网络IO进行多路复用，与客户端建立tcp连接后，能继续与其它客户端继续建立连接。接受完某客户端的数据后，调用对应的回掉函数处理。这样就能在一个线程里处理多个客户端的请求了。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[mysql 新建用户]]></title>
        <id>/blog/2020/wp-270</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-270"/>
        <updated>2020-08-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是一篇关于MySQL用户管理的快速笔记。内容清晰地列出了新建用户的`CREATE USER`命令，为用户授权的`GRANT`命令，以及撤销权限的`REVOKE`命令。文章还强调了在修改权限后需要使用`FLUSH PRIVILEGES`命令来使更改立即生效，为数据库管理员提供了简洁实用的操作指南。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="mysql-新建用户"><a href="#mysql-新建用户" class="rp-header-anchor rp-link" aria-hidden="true">#</a>mysql 新建用户<!-- --> </h1>
<p>一、新建用户</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>CREATE USER &#x27;username&#x27;@&#x27;host&#x27; IDENTIFIED BY &#x27;password&#x27;;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>username:用户名</p>
<p>host:允许在那些ip登录(%)</p>
<p>password:密码</p>
<p>&#x27;username&#x27;和@和&#x27;host&#x27;之间没有空格</p>
<p>二、授权</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>GRANT privileges ON databasename.tablename TO &#x27;username&#x27;@&#x27;host&#x27;;</span></span>
<span class="line"><span>FLUSH PRIVILEGES;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>privileges:具体权限<code>SELECT</code>,<code>INSERT</code>,<code>UPDATE</code>,<code>DELETE</code>,<code>CREATE</code>,<code>DROP</code>(<code>ALL</code>)</p>
<p>databasename:数据库名(*)</p>
<p>tablename:表名(*)</p>
<p>三、撤权</p>
<p>与授权相似<code>GRANT</code>-&gt;<code>REVOKE</code>,<code>TO</code>-&gt;<code>FROM</code></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>REVOKE privileges ON databasename.tablename FROM &#x27;username&#x27;@&#x27;host&#x27;;</span></span>
<span class="line"><span>FLUSH PRIVILEGES;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>privileges:具体权限<code>SELECT</code>,<code>INSERT</code>,<code>UPDATE</code>,<code>DELETE</code>,<code>CREATE</code>,<code>DROP</code>(<code>ALL</code>)</p>
<p>databasename:数据库名(*)</p>
<p>tablename:表名(*)</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[vim及插件编译]]></title>
        <id>/blog/2020/wp-169</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-169"/>
        <updated>2020-07-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了Vim及其插件YouCompleteMe的编译过程。内容详细列出了编译Vim时推荐的配置选项，如启用huge特性、多字节支持以及Python、Ruby等多种语言解释器。同时，还提到了编译过程中可能遇到的缺少ncurses终端库的问题，并给出了安装相应开发包的解决方案。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="vim及插件编译"><a href="#vim及插件编译" class="rp-header-anchor rp-link" aria-hidden="true">#</a>vim及插件编译<!-- --> </h1>
<h2 class="rp-toc-include" id="vim编译"><a href="#vim编译" class="rp-header-anchor rp-link" aria-hidden="true">#</a>VIM编译</h2>
<h3 class="rp-toc-include" id="编译选项 .has-text-align-left"><a href="#编译选项 .has-text-align-left" class="rp-header-anchor rp-link" aria-hidden="true">#</a>编译选项</h3>
<p><code>--with-features=huge</code></p>
<p><code>--enable-multibyte</code></p>
<p><code>--enable-rubyiniterp</code></p>
<p><code>--enable-pythoninterp</code></p>
<p><code>--with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/</code></p>
<p><code>--enable-python3interp</code></p>
<p><code>--with-python3-config-dir=/usr/lib/python3.7/config-3.7m-x86_64-linux-gnu/</code></p>
<p><code>--enable-luainterp</code></p>
<p><code>--enable-cscope</code></p>
<p><code>--enable-perlinterp</code></p>
<p><code>--prefix=~/.local</code></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>./configure --with-features=huge --enable-multibyte --enable-rubyiniterp --enable-pythoninterp --with-python-config-dir=/usr/lib/python2.7/config-x86_64-linux-gnu/ --enable-python3interp --with-python3-config-dir=/usr/lib/python3.7/config-3.7m-x86_64-linux-gnu/ --enable-luainterp --enable-cscope --enable-perlinterp --prefix=/home/frey/.local</span></span>
<span class="line"><span>make -j8</span></span>
<span class="line"><span>make install</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="错误"><a href="#错误" class="rp-header-anchor rp-link" aria-hidden="true">#</a>错误</h3>
<p><code>You need to install a terminal library; for example ncurses</code><br/>
安装libncurse5-dev可以解决</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>apt install libncurse5-dev</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="youcompleteme编译"><a href="#youcompleteme编译" class="rp-header-anchor rp-link" aria-hidden="true">#</a>YouCompleteMe编译</h2><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[命名实体识别]]></title>
        <id>/blog/2020/wp-179</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-179"/>
        <updated>2020-07-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文概述了命名实体识别（NER）技术的发展。内容涵盖了从早期的基于词典和规则的方法，到传统的机器学习模型如HMM、MEMM和CRF，再到现代的深度学习方法如Bi-LSTM-CRF。文章对比了不同方法的优缺点，并提及了最新的研究方向，为理解NER技术提供了全面的视角。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="命名实体识别"><a href="#命名实体识别" class="rp-header-anchor rp-link" aria-hidden="true">#</a>命名实体识别<!-- --> </h1>
<blockquote>
<p>命名实体识别（英语：Named Entity
Recognition，简称 NER），又称作专名识别、命名实体，是指识别文本中具有特定意义的实体，主要包括人名、地名、机构名、专有名词等，以及时间、数量、货币、比例数值等文字。指的是可以用专有名词（名称）标识的事物，一个命名实体一般代表唯一一个具体事物个体，包括人名、地名等。</p>
</blockquote>
<h2 class="rp-toc-include" id="早期方法"><a href="#早期方法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>早期方法</h2>
<p>基于词典和规则的方法<br/>
优点：快速、可解释性强和不需要太多标注语料<br/>
缺点：需要领域知识、规则和词典的构建与维护繁重、未登录词匹配问题<br/>
具体步骤：</p>
<ol>
<li>构建词典<br/>
综合中文语义词库<a href="http://www.crsky.com/soft/31795.html" target="_blank" rel="noopener noreferrer" class="rp-link">CSC</a>,<a href="http://www.keenage.com/html/e_index.html" target="_blank" rel="noopener noreferrer" class="rp-link">hownet</a>,<a href="http://compling.hss.ntu.edu.sg/cow/" target="_blank" rel="noopener noreferrer" class="rp-link">Chinese
Open Worldnet</a><br/>
词典构建的统计方法：词频，TF-IDF，TextRank，借助百科，词法分析，依存句法分析<br/>
构建词典可以通过人工，基于统计学的方法。主要目的就是分词和词性标注</li>
<li>规则构建<br/>
规则构建是通过根据对词的标注（词性，特征），通过对标注设计一系列规则，从而得到规则中特定标注的实体类别。
<ol>
<li>基于词性标注进行规则推理<br/>
通过特定的词性顺序，建立词性与实体的对应关系</li>
<li>采用一个特征集合来泛化表达命名实体<a href="https://www.researchgate.net/publication/220195686_Automatic_rule_learning_exploiting_morphological_features_for_named_entity_recognition_in_Turkish" target="_blank" rel="noopener noreferrer" class="rp-link">Tatar and
Cicekli,2011</a><br/>
为每个词生成特征，然后在特征上做规则的合并和构建。<br/>
提出<a href="https://dl.acm.org/doi/10.1177/0165551511398573" target="_blank" rel="noopener noreferrer" class="rp-link">一种自动学习规则的方案</a>,通过处理模式串的相似之处，通过泛化构建规则</li>
</ol>
</li>
<li>规则维护<br/>
提出<a href="https://www.aclweb.org/anthology/P01-1055.pdf" target="_blank" rel="noopener noreferrer" class="rp-link">一种基于机器学习长期维护规则的框架</a>，规则维护是在新增语料的情况下，通过对规则的改进与补充，提升其在新语料上的效果。</li>
</ol>
<h2 class="rp-toc-include" id="传统机器学习"><a href="#传统机器学习" class="rp-header-anchor rp-link" aria-hidden="true">#</a>传统机器学习</h2>
<h3 class="rp-toc-include" id="有监督"><a href="#有监督" class="rp-header-anchor rp-link" aria-hidden="true">#</a>有监督</h3>
<h4 class="rp-toc-include" id="svmlogistic-回归和决策树等"><a href="#svmlogistic-回归和决策树等" class="rp-header-anchor rp-link" aria-hidden="true">#</a>SVM，logistic 回归和决策树等</h4>
<p>这类方法将 NER 视为分类问题，根据提取的特征和标注的类别对模型进行训练。捕获上下文关系能力弱,对分词结果要求高。</p>
<p>SVM(支持向量机）是在分类与回归分析中分析数据的监督式学习模型，主要思想是通过一个(p－1)维超平面将数据点(p 维向量)分开，而且 SVM 可以通过核函数将低维线性不可分的数据集影射到高维空间使其线性可分。</p>
<p>决策树是一种概率模型，通过分支对样本特征进行划分，从而划分样本所属类别，决策树的生成主要是通过使用熵的概念。</p>
<p><a href="https://www.vhcffh.com/2019/%E5%9F%BA%E4%BA%8E%E7%BB%9F%E8%AE%A1%E7%9A%84%E5%88%86%E8%AF%8D%E6%96%B9%E6%B3%95/" target="_blank" rel="noopener noreferrer" class="rp-link">HMM</a>,MEMM,CRF</p>
<p>这些都属于序列模型，能够很好的捕获上下文关系。</p>
<p><strong>HMM</strong>模型主要用于序列标注问题，通过把标签看作隐藏状态变量，把要标注的序列看作可观察输出，可以有效的解决分词，词性标注，命名实体识别等问题。但是受限于 HMM 模型的两个假设，HMM 只能学习到有限的序列特征。</p>
<ol>
<li>当前观测状态只与当前隐藏状态有关</li>
<li>当前隐藏状态只与前一时刻隐藏状态有关</li>
</ol>
<p><strong>MEMM</strong>（最大熵马尔可夫模型）是一种结合了 HMM 和最大熵模型的图模型，可用于序列标注问题。</p>
<p><strong>HMM</strong>将标注看作隐藏状态，不同的标注序列（隐藏状态）都可以计算出给定观测状态出现的概率,概率最大时对应的隐藏状态序列就是所求结果。而<strong>MEMM</strong>通过输入当前序列状态特征（这里可以加入多个特征，前后多个词或者标注），计算出每个标注的概率。也可以说是简单逻辑回归模型在序列模型上的扩展。</p>
<p>「在求解$latex P(X|Y)$时，可以直接求，也可以间接求$latex
P(Y|X)P(X)/P(Y)$」</p>
<p>在训练阶段，<strong>HMM</strong>通过概率估计（频率学派和贝叶斯派）获得模型参数，在预测阶段，可以通过维特比算法（一种 dp 算法，不用计算所有可能隐藏序列对应的观测序列概率）解码（找到最可能对应观测序列的隐藏状态序列）。<strong>MEMM</strong>直接通过定义特征，可以只将当前字符作为特征（此时就是 logistic 回归模型），也可以方便的加入任何其他特征（前后多个词，前面词的标注结果，或者后缀前缀等），通过对每个特征设置一个权重，代表其对最终结果的影响。通过训练，优化权重。预测时可以通过硬解码的方式一个一个给出类别（只考虑当前单词标签），另一种更好的方式是像 HMM 一样使用维特比算法求整个句子的最优解(CRF)。</p>
<h4 class="rp-toc-include" id="crf"><a href="#crf" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CRF</h4>
<p>CRF 模型与 MEMM 模型类似，也是通过序列特征计算每个 token 所有可能 label 的概率，取概率最大的 label 作为结果就是 MEMM 模型。这样计算出整个序列的结果后，可能出现不可理得标注(例如：[B,B...])。为了使输出序列前后相互约束，回想一下 HMM 的实现（当前观测状态依赖当前隐藏状态，当前隐藏状态依赖前一隐藏状态），因此可以考虑将当前 label 的概率与前一了 label 关联，求出整个序列所有可能 label 序列中可能性最大的。这样问题就变的复杂了，本来是 sequence_lenth 个分类问题（有多少种 label，就有多少种类别），现在变成了一个分类问题，从所有可能 label 序列（共 sequence_lenth^label_num 个）选择合适的。</p>
<p>简单来说，CRF 模型就是在 MEMM 模型的基础上增加了对输出的约束，使其输出的标签序列更加合理。</p>
<h2 class="rp-toc-include" id="深度学习"><a href="#深度学习" class="rp-header-anchor rp-link" aria-hidden="true">#</a>深度学习</h2>
<h3 class="rp-toc-include" id="有监督-1"><a href="#有监督-1" class="rp-header-anchor rp-link" aria-hidden="true">#</a>有监督</h3>
<ol>
<li>NN/CNN-CRF</li>
<li>Bi-LSTM-CRF</li>
</ol>
<h2 class="rp-toc-include" id="最新研究"><a href="#最新研究" class="rp-header-anchor rp-link" aria-hidden="true">#</a>最新研究</h2>
<h3 class="rp-toc-include" id="有监督-2"><a href="#有监督-2" class="rp-header-anchor rp-link" aria-hidden="true">#</a>有监督</h3>
<ol>
<li>Bi-LSTM-CRF+Attention</li>
</ol>
<h3 class="rp-toc-include" id="半监督"><a href="#半监督" class="rp-header-anchor rp-link" aria-hidden="true">#</a>半监督</h3>
<ol>
<li>TagLM</li>
<li>迁移学习</li>
</ol>
<h2 class="rp-toc-include" id="参考"><a href="#参考" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考</h2>
<p>[1]<a href="https://easyai.tech/ai-definition/ner/" target="_blank" rel="noopener noreferrer" class="rp-link">一文看懂命名实体识别 -
NER（发展史+4 类方式+数据集+工具推荐）</a><br/>
[2]<a href="https://zekizz.github.io/NER_survey_zeki.pdf" target="_blank" rel="noopener noreferrer" class="rp-link">命名实体识别调研报告</a><br/>
[3]<a href="https://carlos9310.github.io/2018/12/28/nlp-flow/" target="_blank" rel="noopener noreferrer" class="rp-link">中文自然语言处理的一般流程</a><br/>
[4]<a href="https://raw.githubusercontent.com/carlos9310/carlos9310.github.io/master/assets/pdf/chinese-nlp.pdf" target="_blank" rel="noopener noreferrer" class="rp-link">中文自然语言处理的完整机器处理流程</a><br/>
[5]<a href="https://homepages.inf.ed.ac.uk/csutton/publications/crftut-fnt.pdf" target="_blank" rel="noopener noreferrer" class="rp-link">An Introduction to ConditionalRandom
Fields</a><br/>
[6]<a href="https://zhuanlan.zhihu.com/p/60651380" target="_blank" rel="noopener noreferrer" class="rp-link">最大熵马尔可夫模型</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[confluent系列软件介绍]]></title>
        <id>/blog/2020/wp-176</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-176"/>
        <updated>2020-07-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了Confluent平台系列软件。内容涵盖了Zookeeper、Kafka、Schema Registry、Kafka-Rest、Connect、ksql-server和Control-center等核心组件的功能和作用，并解释了它们如何协同工作。最后还提供了在本地环境中一键启动和关闭整个Confluent平台的命令。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="confluent系列软件介绍"><a href="#confluent系列软件介绍" class="rp-header-anchor rp-link" aria-hidden="true">#</a>confluent系列软件介绍<!-- --> </h1>
<h2 class="rp-toc-include" id="zookeeper"><a href="#zookeeper" class="rp-header-anchor rp-link" aria-hidden="true">#</a>zookeeper</h2>
<p>主要功能：配置管理、名字服务、分布式同步、集群管理
<a href="https://juejin.im/post/5ba879ce6fb9a05d16588802" target="_blank" rel="noopener noreferrer" class="rp-link">集群配置</a>：每台机器的配置都相同，主要通过<code>myid</code>文件区分ip端口</p>
<h2 class="rp-toc-include" id="kafka"><a href="#kafka" class="rp-header-anchor rp-link" aria-hidden="true">#</a><a href="http://blog.vhcffh.com/2020/%e5%88%9d%e6%ad%a5%e4%ba%86%e8%a7%a3kafka/" target="_blank" rel="noopener noreferrer" class="rp-link">kafka</a></h2>
<ol>
<li>
<p>Broker：Kafka的broker是无状态的，broker使用Zookeeper维护集群的状态。Leader的选举也由Zookeeper负责。</p>
</li>
<li>
<p>Zookeeper：Zookeeper负责维护和协调broker。当Kafka系统中新增了broker或者某个broker发生故障失效时，由ZooKeeper通知生产者和消费者。生产者和消费者依据Zookeeper的broker状态信息与broker协调数据的发布和订阅任务。</p>
</li>
<li>
<p>Producer：生产者将数据推送到broker上，当集群中出现新的broker时，所有的生产者将会搜寻到这个新的broker，并自动将数据发送到这个broker上。</p>
</li>
<li>
<p>Consumer：因为Kafka的broker是无状态的，所以consumer必须使用partition
offset来记录消费了多少数据。如果一个consumer指定了一个topic的offset，意味着该consumer已经消费了该offset之前的所有数据。consumer可以通过指定offset，从topic的指定位置开始消费数据。consumer的offset存储在Zookeeper中。</p>
</li>
</ol>
<h2 class="rp-toc-include" id="schema-registry"><a href="#schema-registry" class="rp-header-anchor rp-link" aria-hidden="true">#</a>schema-registry</h2>
<p>作用：让 Kafka 支持 Avro
序列化,从而减少存储空间的占用，加快读取速度。大部分结构化的数据都有相同的schema，将结构和数据分开存储，减少数据量。
Avro序列化：将结构化数据变成有序的数据格式（一般是二进制），并通过schema记录数据结构。
生产者在使用schema-registry时首先向schema-registry注册数据格式，然后使用Avro序列化将数据发送到kafka；消费者消费数据时，先向schema-registry获取数据格式，然后从kafka的到数据，反序列化。
schema-registry服务端的数据存储在kafka中名为_schemas的topic
schema-registry提供了restful api
<a href="https://zhmin.github.io/2019/04/23/kafka-schema-registry/" target="_blank" rel="noopener noreferrer" class="rp-link">参考</a></p>
<h2 class="rp-toc-include" id="kafka-rest"><a href="#kafka-rest" class="rp-header-anchor rp-link" aria-hidden="true">#</a>kafka-rest</h2>
<p>提供kafka restful api，实现通过http协议实现kafka
的生产者，消费者等。registry存储数据结构，提供了restful
api。kafka-rest也提供了api，用于存储数据。</p>
<h2 class="rp-toc-include" id="connect"><a href="#connect" class="rp-header-anchor rp-link" aria-hidden="true">#</a>connect</h2>
<p>Kafaka connect
是一种用于在Kafka和其他系统之间可扩展的、可靠的流式传输数据的工具。它使得能够快速定义将大量数据集合移入和移出Kafka的连接器变得简单。Kafka
Connect可以从数据库或应用程序服务器收集数据到Kafka
topic，使数据可用于低延迟的流处理。导出作业可以将数据从Kafka
topic传输到二次存储和查询系统，或者传递到批处理系统以进行离线分析。
用于其他数据库与kafka的连接，实现数据的导入导出。
<a href="https://www.cnblogs.com/laoqing/p/11927958.html" target="_blank" rel="noopener noreferrer" class="rp-link">参考</a></p>
<h2 class="rp-toc-include" id="ksql-server"><a href="#ksql-server" class="rp-header-anchor rp-link" aria-hidden="true">#</a>ksql-server</h2>
<p>实现kafka中数据的sql查询</p>
<h2 class="rp-toc-include" id="control-center"><a href="#control-center" class="rp-header-anchor rp-link" aria-hidden="true">#</a>control-center</h2>
<p>confluent的控制中心，用于监控集群状态等。用商用版和社区版。</p>
<h2 class="rp-toc-include" id="confluent-本地启动"><a href="#confluent-本地启动" class="rp-header-anchor rp-link" aria-hidden="true">#</a>confluent 本地启动</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>$ ./bin/confluent local start</span></span>
<span class="line"><span>    The local commands are intended for a single-node development environment</span></span>
<span class="line"><span>    only, NOT for production usage. https://docs.confluent.io/current/cli/index.html</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Using CONFLUENT_CURRENT: /tmp/confluent.HWNZqmRc</span></span>
<span class="line"><span>Starting zookeeper</span></span>
<span class="line"><span>zookeeper is [UP]</span></span>
<span class="line"><span>Starting kafka</span></span>
<span class="line"><span>kafka is [UP]</span></span>
<span class="line"><span>Starting schema-registry</span></span>
<span class="line"><span>schema-registry is [UP]</span></span>
<span class="line"><span>Starting kafka-rest</span></span>
<span class="line"><span>kafka-rest is [UP]</span></span>
<span class="line"><span>Starting connect</span></span>
<span class="line"><span>connect is [UP]</span></span>
<span class="line"><span>Starting ksql-server</span></span>
<span class="line"><span>ksql-server is [UP]</span></span>
<span class="line"><span>Starting control-center</span></span>
<span class="line"><span>control-center is [UP]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="confluent-本地关闭"><a href="#confluent-本地关闭" class="rp-header-anchor rp-link" aria-hidden="true">#</a>confluent 本地关闭</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>$ ./bin/confluent local stop</span></span>
<span class="line"><span>    The local commands are intended for a single-node development environment</span></span>
<span class="line"><span>    only, NOT for production usage. https://docs.confluent.io/current/cli/index.html</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Using CONFLUENT_CURRENT: /tmp/confluent.HWNZqmRc</span></span>
<span class="line"><span>Stopping control-center</span></span>
<span class="line"><span>control-center is [DOWN]</span></span>
<span class="line"><span>Stopping ksql-server</span></span>
<span class="line"><span>ksql-server is [DOWN]</span></span>
<span class="line"><span>Stopping connect</span></span>
<span class="line"><span>connect is [DOWN]</span></span>
<span class="line"><span>Stopping kafka-rest</span></span>
<span class="line"><span>kafka-rest is [DOWN]</span></span>
<span class="line"><span>Stopping schema-registry</span></span>
<span class="line"><span>schema-registry is [DOWN]</span></span>
<span class="line"><span>Stopping kafka</span></span>
<span class="line"><span>kafka is [DOWN]</span></span>
<span class="line"><span>Stopping zookeeper</span></span>
<span class="line"><span>zookeeper is [DOWN]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[初步了解kafka]]></title>
        <id>/blog/2020/wp-173</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-173"/>
        <updated>2020-07-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是对分布式消息系统Kafka的初步介绍。内容涵盖了Topic、Producer、Consumer和Broker等核心术语的解释。文章还提供了启动Kafka服务的基本步骤，包括启动依赖的ZooKeeper，创建主题，以及通过命令行工具运行生产者和消费者的简单示例，为初学者提供了快速入门的指引。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="初步了解kafka"><a href="#初步了解kafka" class="rp-header-anchor rp-link" aria-hidden="true">#</a>初步了解kafka<!-- --> </h1>
<h2 class="rp-toc-include" id="kafka简介"><a href="#kafka简介" class="rp-header-anchor rp-link" aria-hidden="true">#</a>kafka简介</h2>
<p>kafka<a href="https://www.apache.org/dyn/closer.cgi?path=/kafka/0.9.0.0/kafka_2.11-0.9.0.0.tgz" target="_blank" rel="noopener noreferrer" class="rp-link">下载地址</a>
kafka<a href="http://kafka.apache.org/" target="_blank" rel="noopener noreferrer" class="rp-link">官网</a>
kafka是一个分布式消息发布订阅系统，主要特点：易于扩展，高吞吐量
<strong>主要术语:</strong></p>
<ol>
<li>Topic Kafka将消息种子(Feed)分门别类， 每一类的消息称之为话题(Topic).</li>
<li>Producer 发布消息的对象称之为话题生产者(Kafka topic producer)</li>
<li>Consumer
订阅消息并处理发布的消息的种子的对象称之为话题消费者(consumers)</li>
<li>Broker
已发布的消息保存在一组服务器中，称之为Kafka集群。集群中的每一个服务器都是一个代理(Broker).
消费者可以订阅一个或多个话题，并从Broker拉数据，从而消费这些已发布的消息。</li>
</ol>
<h2 class="rp-toc-include" id="启动服务端"><a href="#启动服务端" class="rp-header-anchor rp-link" aria-hidden="true">#</a>启动服务端</h2>
<ol>
<li>启动ZooKeeper,因为Kafka Cluster使用ZooKeeper
ZooKeeper是一个分布式服务框架，主要用来解决分布式应用中经常遇到的一些数据管理问题，如：统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。</li>
</ol>
<!-- -->
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>bin/zookeeper-server-start.sh config/zookeeper.properties</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.  启动Kafka Broker</p>
<!-- -->
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>bin/kafka-server-start.sh config/server.properties</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>3.  Jps查看进程</p>
<!-- -->
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>$ jps</span></span>
<span class="line"><span>4407 QuorumPeerMain</span></span>
<span class="line"><span>4408 Kafka</span></span>
<span class="line"><span>5291 Jps</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>QuorumPeerMain是ZooKeeper守护进程，Kafka是Kafka守护进程</p>
<h2 class="rp-toc-include" id="创建一个主题"><a href="#创建一个主题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>创建一个主题</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>bin/kafka-topics.sh --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic test</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><code>replication-factor</code>分区个数，不同分区会存储到不同的主机（负载均衡），分区写入策略（<em>1、轮询策略</em>，2、随机策略，3、按键保存策略）
<code>partitions</code>副本个数，仅用于数据冗余</p>
<h2 class="rp-toc-include" id="获取主题列表"><a href="#获取主题列表" class="rp-header-anchor rp-link" aria-hidden="true">#</a>获取主题列表</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>bin/kafka-topics.sh --list --bootstrap-server localhost:9092</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="生产者示例"><a href="#生产者示例" class="rp-header-anchor rp-link" aria-hidden="true">#</a>生产者示例</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>bin/kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><code>bootstrap-server</code>代理列表，kafka服务端配置文件中指定</p>
<h2 class="rp-toc-include" id="消费者示例"><a href="#消费者示例" class="rp-header-anchor rp-link" aria-hidden="true">#</a>消费者示例</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 —topic topic-name --from-beginning</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><code>from-beginning</code>读取历史未消费的数据</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[一些有用的python函数]]></title>
        <id>/blog/2020/wp-160</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-160"/>
        <updated>2020-05-14T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文整理了一些实用的Python内置函数和标准库模块。内容涵盖了基础的`map`和`filter`函数，用于堆操作的`heapq`模块，以及`functools`模块中的`reduce`函数和`lru_cache`装饰器。这些工具能够有效简化代码，提高数据处理和算法的执行效率。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="一些有用的python函数"><a href="#一些有用的python函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>一些有用的python函数<!-- --> </h1>
<h1 class="rp-toc-include" id="基础函数"><a href="#基础函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>基础函数<!-- --> </h1>
<h2 class="rp-toc-include" id="map"><a href="#map" class="rp-header-anchor rp-link" aria-hidden="true">#</a>map</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>map(function, iterable, ...)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>对迭代器每一给元素进行计算<br/>
返回新的迭代器</p>
<h2 class="rp-toc-include" id="filter"><a href="#filter" class="rp-header-anchor rp-link" aria-hidden="true">#</a>filter</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>filter(function, iterable)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>过滤掉不满足function的函数<br/>
返回过滤后的迭代器</p>
<h2 class="rp-toc-include" id="heapq模块"><a href="#heapq模块" class="rp-header-anchor rp-link" aria-hidden="true">#</a>heapq模块</h2>
<p>参考python中文文档<a href="https://docs.python.org/zh-cn/3/library/heapq.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://docs.python.org/zh-cn/3/library/heapq.html</a></p>
<p>模块提供了一系列的函数用来操作list，从而实现最小堆的特性</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>import heapq</span></span>
<span class="line"><span>heapq.heapify(x) #原地转化为最小堆</span></span>
<span class="line"><span>heapq.heappush(heap,item) #堆中加入新项</span></span>
<span class="line"><span>heapq.heappop(heap) #弹出堆中最小项</span></span>
<span class="line"><span>heapq.heapreplace(heap,item) #弹出堆中最小项并加入新项</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h1 class="rp-toc-include" id="functools模块中的函数"><a href="#functools模块中的函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>functools模块中的函数<!-- --> </h1>
<h2 class="rp-toc-include" id="reduce"><a href="#reduce" class="rp-header-anchor rp-link" aria-hidden="true">#</a>reduce</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>from functools import reduce</span></span>
<span class="line"><span>reduce(function, sequence, startValue)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>将一个序列归纳为一个输出<br/>
返回一个输出</p>
<h2 class="rp-toc-include" id="lru_cache"><a href="#lru_cache" class="rp-header-anchor rp-link" aria-hidden="true">#</a>lru_cache</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>from functools import lru_cache</span></span>
<span class="line"><span>@lru_cache(user_function)</span></span>
<span class="line"><span>@lru_cache(maxsize=128, typed=False)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>装饰器缓存函数的输出值<br/>
maxsize：最多缓存最近多少个返回值<br/>
typed：类型是否作为缓存中键的一部分（如果为True，3和3.0两次缓存）</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[集合合并问题]]></title>
        <id>/blog/2020/wp-155</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-155"/>
        <updated>2020-05-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文探讨了一个集合合并问题：为n只袜子进行最少次数的染色，以满足m天的配对需求。核心思路是将每天需要配对的袜子看作一个集合，通过合并所有关联的袜子对，形成若干个独立的集合。在每个集合内，将所有袜子染成其中出现次数最多的颜色，即可得到最优解。文章提供了一种基于循环合并的Python实现。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="集合合并问题"><a href="#集合合并问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>集合合并问题<!-- --> </h1>
<blockquote>
<p>题目： 小明有n只袜子，需要穿m天 第i只袜子的颜色为c_i
给出每天要穿的两只袜子的编号（i1,i2)
保证每天穿的袜子颜色一样，最少要对多少只袜子进行染色</p>
</blockquote>
<p>思路：
根据这m天每天穿的两只袜子，可以将所有袜子分成几个集合，每个集合的颜色都要一样，把集合中所有袜子染成颜色最多的袜子即可
将每天穿的袜子标号看作集合，按袜子颜色进行合并，直到每个集合中袜子的标号都不重复
实现函数</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>def maxTint(c,d):</span></span>
<span class="line"><span>    &quot;&quot;&quot;</span></span>
<span class="line"><span>    c: n只袜子的颜色</span></span>
<span class="line"><span>    d: m天每天穿的袜子的标号</span></span>
<span class="line"><span>    &quot;&quot;&quot;</span></span>
<span class="line"><span>    pass</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>1，循环标号进行合并</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>def maxTint(c,d):</span></span>
<span class="line"><span>    d = map(set,d)</span></span>
<span class="line"><span>    for ci in range(len(c)):</span></span>
<span class="line"><span>        new_d = []</span></span>
<span class="line"><span>        new_g = []</span></span>
<span class="line"><span>        for di in d:</span></span>
<span class="line"><span>            if ci in di:</span></span>
<span class="line"><span>                new_g.append(di)</span></span>
<span class="line"><span>            else:</span></span>
<span class="line"><span>                new_d.append(di)</span></span>
<span class="line"><span>        d = new_d</span></span>
<span class="line"><span>        if len(new_g)!=0:</span></span>
<span class="line"><span>            d.append(set())</span></span>
<span class="line"><span>            for gi in new_g:</span></span>
<span class="line"><span>                d[-1]=d[-1]|gi</span></span>
<span class="line"><span>    ans = 0</span></span>
<span class="line"><span>    for di in d:</span></span>
<span class="line"><span>        ansi = 0</span></span>
<span class="line"><span>        for i in di:</span></span>
<span class="line"><span>            ansi=max(ansi,c.count(c[i-1]))</span></span>
<span class="line"><span>        ans+=ansi</span></span>
<span class="line"><span>    return ans</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>时间复杂度：<code>n*m</code></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[python的整除]]></title>
        <id>/blog/2020/wp-151</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-151"/>
        <updated>2020-05-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文讲解了Python中的整除运算符`//`。重点解释了其在处理负数时向下取整（floor division）的特性。文章还提供了一份详细的Python运算符优先级列表，指出一元负号（-）的优先级高于乘除、取模和整除等算术运算符，有助于避免在复杂表达式中出现计算错误。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="python的整除"><a href="#python的整除" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python的整除<!-- --> </h1>
<p>python可以通过<code>//</code>进行整除运算 例如：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>4//2</span></span>
<span class="line"><span># 2</span></span>
<span class="line"><span>5//2</span></span>
<span class="line"><span># 2</span></span>
<span class="line"><span># 去尾法</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>当遇到负数时，最后的结果向下取整数 此时负号运算级高，先构成负数，再除法</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>-4//2</span></span>
<span class="line"><span># -2</span></span>
<span class="line"><span>-5//2</span></span>
<span class="line"><span># -3</span></span>
<span class="line"><span>-1//2</span></span>
<span class="line"><span># -1</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>如果是减号，就先计算除法</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>-1//2</span></span>
<span class="line"><span># -1</span></span>
<span class="line"><span>1-1//2</span></span>
<span class="line"><span># 1</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>python远算符优先级</p>
<p>运算符                       描述</p>
<hr/>
<p><code>**</code>                         指数
<code>~ + -</code>                      按位翻转, 一元加号和减号（就是正数和负数）
<code>* / % //</code>                   乘，除，取模和取整除
<code>+ -</code>                        加法和减法
<code>&gt;&gt; &lt;&lt;</code>                      右移，左移
<code>&amp;</code>                          位与运算
<code>^ |</code>                        位异或，位或
<code>&lt;= &lt; &gt; &gt;=</code>                  比较远算
<code>== !=</code>                      等于远算
<code>= %= /= //= -= += *= **=</code>   赋值
<code>is is not</code>                  身份
<code>in not in</code>                  成员
<code>and or not</code>                 逻辑与或非</p>
<p><code>-</code>负号比<code>//</code>整除远算级高</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[数独的解法]]></title>
        <id>/blog/2020/wp-143</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-143"/>
        <updated>2020-04-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了使用回溯法解决数独问题的算法。其核心思想是通过深度优先搜索（DFS）遍历所有空白单元格，并尝试填入1到9的数字。为了高效判断填入数字的合法性，算法使用三个二维数组分别记录每行、每列以及每个3x3九宫格内数字的占用情况，从而实现了有效的剪枝和回溯。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="数独的解法"><a href="#数独的解法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>数独的解法<!-- --> </h1>
<h2 class="rp-toc-include" id="数独的规则"><a href="#数独的规则" class="rp-header-anchor rp-link" aria-hidden="true">#</a>数独的规则</h2>
<p>在 9×9 的方格里面填写数字 1-9，满足</p>
<ul>
<li>每行不重复</li>
<li>每列不重复</li>
<li>9 个 3×3 的小方格不重复</li>
</ul>
<h2 class="rp-toc-include" id="回溯法"><a href="#回溯法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>回溯法</h2>
<p>通过 DFS 遍历尝试每一个数字
根据三条规则，可以用三个二维数组记录每行，每列和每个小方格可填数字状态</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>row = [[True]*9 for _ in range(9)]</span></span>
<span class="line"><span>col = [[True]*9 for _ in range(9)]</span></span>
<span class="line"><span>block = [[True]*9 for _ in range(9)]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><code>row[i][j]</code>表示第<code>i</code>行是否可以填数字<code>j</code>
<code>col[i][j]</code>表示第<code>i</code>列是否可以填数字<code>j</code>
<code>block[i][j]</code>表示第<code>i</code>个方格是否可以填数字<code>j</code></p>
<p>用二维数组<code>g</code>表示数独方格的原始状态，<code>0</code>表示空白</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>def dfs():</span></span>
<span class="line"><span>    # 遍历所有位置</span></span>
<span class="line"><span>    for i in range(9):</span></span>
<span class="line"><span>        for j in range(9):</span></span>
<span class="line"><span>            # 空白位置</span></span>
<span class="line"><span>            if g[i][j]==0:</span></span>
<span class="line"><span>                # 尝试每一个数字</span></span>
<span class="line"><span>                for k in range(9):</span></span>
<span class="line"><span>                    # 数字满足行，列，块</span></span>
<span class="line"><span>                    if row[i][k] and col[j][k] and block[3*(i//3)+j//3][k]:</span></span>
<span class="line"><span>                        # 填入数字</span></span>
<span class="line"><span>                        row[i][k] = col[j][k] = block[3*(i//3)+j//3][k]= False</span></span>
<span class="line"><span>                        g[i][j] = k+1</span></span>
<span class="line"><span>                        if(dfs()):</span></span>
<span class="line"><span>                            return True</span></span>
<span class="line"><span>                        # 有填错的，删除数字</span></span>
<span class="line"><span>                        row[i][k] = col[j][k] = block[3*(i//3)+j//3][k]= True</span></span>
<span class="line"><span>                        g[i][j] = 0</span></span>
<span class="line"><span>                # 九个数字都不能填</span></span>
<span class="line"><span>                return False</span></span>
<span class="line"><span>    # 所有位置都填了数字</span></span>
<span class="line"><span>    return True</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>回溯法要注意如何进行记录状态，要方便更新，回溯</p>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<p>[1]<a href="https://blog.csdn.net/xiaoyiaoyou/article/details/52491187" target="_blank" rel="noopener noreferrer" class="rp-link">数独求解算法（回溯法和唯一解法）java 实现</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[tensorflow2建立模型的方法]]></title>
        <id>/blog/2020/wp-137</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-137"/>
        <updated>2020-04-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了在TensorFlow 2中创建Keras模型的三种主要方法。第一种是使用函数式API，通过`tf.keras.Input`定义输入层来构建灵活的模型。第二种是通过继承`tf.keras.Model`类并重写`call`方法来创建完全自定义的模型。第三种是使用`tf.keras.Sequential`容器，快速搭建简单的线性层叠模型。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="tensorflow2建立模型的方法"><a href="#tensorflow2建立模型的方法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>tensorflow2建立模型的方法<!-- --> </h1>
<p>1.使用Input</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>tf.keras.Input(shape=None, batch_size=None, name=None, dtype=None, sparse=False, tensor=None, ragged=False, **kwargs)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><code>Input</code>初始化一个占位符 <code>shape</code>：指定模型输入的shape，不包括batch size
<code>batch_size</code>：可选 <code>name</code>：可选，图层名称 <code>dtype</code>:字符串，数据类型
<code>sparse</code>:布尔，是否稀疏 <code>tensor</code>:可选，指定tensor，不再是占位符</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>from tensorflow.keras import Input, Model</span></span>
<span class="line"><span>from tensorflow.keras.layers import Dense</span></span>
<span class="line"><span>x = Input(shape=(2,))</span></span>
<span class="line"><span>y = Dense(5, activation=&#x27;softmax&#x27;)(x)</span></span>
<span class="line"><span>model = Model(x, y)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.继承Model</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>import tensorflow as tf</span></span>
<span class="line"><span>class MyModel(tf.keras.Model):</span></span>
<span class="line"><span>    def __init__(self):</span></span>
<span class="line"><span>        super(MyModel, self).__init__()</span></span>
<span class="line"><span>        self.dense = tf.keras.layers.Dense(5, activation=tf.nn.softmax)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>    def call(self, inputs):</span></span>
<span class="line"><span>        x = self.dense1(inputs)</span></span>
<span class="line"><span>        return self.dense(x)</span></span>
<span class="line"><span></span></span>
<span class="line"><span>model = MyModel()</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>3.使用Sequential</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>import tensorflow as tf</span></span>
<span class="line"><span>model1 = tf.keras.Sequential(</span></span>
<span class="line"><span>    tf.keras.layers.Dense(5, activation=tf.nn.softmax)</span></span>
<span class="line"><span>)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[栈实现四则远算]]></title>
        <id>/blog/2020/wp-122</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-122"/>
        <updated>2020-03-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文讲解了如何使用栈结构实现一个支持四则运算的计算器。核心思路分为两步：首先，通过一个符号栈将中缀表达式转换为后缀表达式（逆波兰表示法）；然后，再利用一个数字栈对后缀表达式进行求值。文章详细描述了转换和计算的规则，并提供了完整的Python代码实现。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="栈实现四则远算"><a href="#栈实现四则远算" class="rp-header-anchor rp-link" aria-hidden="true">#</a>栈实现四则远算<!-- --> </h1>
<h2 class="rp-toc-include" id="总结"><a href="#总结" class="rp-header-anchor rp-link" aria-hidden="true">#</a>总结</h2>
<p>四则运算表达式求值分两步<br/>
中缀转后缀，栈中存符号<br/>
后缀算结果，栈中存数字</p>
<h2 class="rp-toc-include" id="中缀表达式与后缀表达式转换"><a href="#中缀表达式与后缀表达式转换" class="rp-header-anchor rp-link" aria-hidden="true">#</a>中缀表达式与后缀表达式转换</h2>
<p>中缀表达式<code>1+(2-3)*4+5/6</code><br/>
后缀表达式<code>1,2,+</code><br/>
通过栈进行转换</p>
<ul>
<li>数字：直接输出</li>
<li>（：进栈</li>
<li>）：出栈直到（,弹出(</li>
<li>运算符：出栈（高阶等阶运算符），进栈（当前运算符）</li>
</ul>
<!-- -->
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>#当前字符：1+(2-3)*4+5/6</span></span>
<span class="line"><span>#输出：1</span></span>
<span class="line"><span>#栈：</span></span>
<span class="line"><span>#当前字符：+(2-3)*4+5/6</span></span>
<span class="line"><span>#输出：1</span></span>
<span class="line"><span>#栈：+</span></span>
<span class="line"><span>#当前字符：(2-3)*4+5/6</span></span>
<span class="line"><span>#输出：1</span></span>
<span class="line"><span>#栈：+,(</span></span>
<span class="line"><span>#当前字符：2-3)*4+5/6</span></span>
<span class="line"><span>#输出：1,2</span></span>
<span class="line"><span>#栈：+,(</span></span>
<span class="line"><span>#当前字符：-3)*4+5/6</span></span>
<span class="line"><span>#输出：1,2</span></span>
<span class="line"><span>#栈：+,(,-</span></span>
<span class="line"><span>#当前字符：3)*4+5/6</span></span>
<span class="line"><span>#输出：1,2,3</span></span>
<span class="line"><span>#栈：+,(,-</span></span>
<span class="line"><span>#当前字符：)*4+5/6</span></span>
<span class="line"><span>#输出：1,2,3,-</span></span>
<span class="line"><span>#栈：+</span></span>
<span class="line"><span>#当前字符：*4+5/6</span></span>
<span class="line"><span>#输出：1,2,3,-,</span></span>
<span class="line"><span>#栈：+(低阶不弹出),*</span></span>
<span class="line"><span>#当前字符：4+5/6</span></span>
<span class="line"><span>#输出：1,2,3,-,4</span></span>
<span class="line"><span>#栈：+,*</span></span>
<span class="line"><span>#当前字符：+5/6</span></span>
<span class="line"><span>#输出：1,2,3,-,4,*(高阶弹出),+(等阶弹出)</span></span>
<span class="line"><span>#栈：+</span></span>
<span class="line"><span>#当前字符：5/6</span></span>
<span class="line"><span>#输出：1,2,3,-,4,*,+,5</span></span>
<span class="line"><span>#栈：+</span></span>
<span class="line"><span>#当前字符：/6</span></span>
<span class="line"><span>#输出：1,2,3,-,4,*,+,5</span></span>
<span class="line"><span>#栈：+,/</span></span>
<span class="line"><span>#当前字符：6</span></span>
<span class="line"><span>#输出：1,2,3,-,4,*,+,5,6</span></span>
<span class="line"><span>#栈：+,/</span></span>
<span class="line"><span>#当前字符：</span></span>
<span class="line"><span>#输出：1,2,3,-,4,*,+,5,6,/,+</span></span>
<span class="line"><span>#栈：</span></span>
<span class="line"><span>#1+(2-3)*4+5/6</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="后缀表达式的计算"><a href="#后缀表达式的计算" class="rp-header-anchor rp-link" aria-hidden="true">#</a>后缀表达式的计算</h2>
<p>数字进栈，符号远算</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>#[1,[[[2,3,-],4,*],[5,6,/],+],+]</span></span>
<span class="line"><span>#2-3=-1</span></span>
<span class="line"><span>#-1*4=-4</span></span>
<span class="line"><span>#5/6=0.833</span></span>
<span class="line"><span>#-4+0.833=-3.167</span></span>
<span class="line"><span>#1+(-3.167)=-2.167</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="python实现"><a href="#python实现" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python实现</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>def calculator(s: str) -&gt; float:</span></span>
<span class="line"><span>    s = s.replace(&quot; &quot;, &quot;&quot;)</span></span>
<span class="line"><span>    s_list = []</span></span>
<span class="line"><span>    for c in list(s):</span></span>
<span class="line"><span>        if c.isdigit():</span></span>
<span class="line"><span>            if len(s_list) == 0 or isinstance(s_list[-1], str):</span></span>
<span class="line"><span>                s_list.append(int(c))</span></span>
<span class="line"><span>            else:</span></span>
<span class="line"><span>                s_list[-1] *= 10+int(c)</span></span>
<span class="line"><span>        else:</span></span>
<span class="line"><span>            s_list.append(c)</span></span>
<span class="line"><span>    # 中缀转后缀</span></span>
<span class="line"><span>    stack = []</span></span>
<span class="line"><span>    s_end = []</span></span>
<span class="line"><span>    for c in s_list:</span></span>
<span class="line"><span>        if isinstance(c, int):</span></span>
<span class="line"><span>            s_end.append(c)</span></span>
<span class="line"><span>        elif c == &quot;(&quot;:</span></span>
<span class="line"><span>            stack.append(c)</span></span>
<span class="line"><span>        elif c == &quot;)&quot;:</span></span>
<span class="line"><span>            while stack[-1] != &quot;(&quot;:</span></span>
<span class="line"><span>                s_end.append(stack.pop())</span></span>
<span class="line"><span>            stack.pop()</span></span>
<span class="line"><span>        elif c in [&quot;*&quot;, &quot;/&quot;]:</span></span>
<span class="line"><span>            while len(stack) != 0 and stack[-1] in [&quot;*&quot;, &quot;/&quot;]:</span></span>
<span class="line"><span>                s_end.append(stack.pop())</span></span>
<span class="line"><span>            stack.append(c)</span></span>
<span class="line"><span>        elif c in [&quot;+&quot;, &quot;-&quot;]:</span></span>
<span class="line"><span>            while len(stack) != 0 and stack[-1] in [&quot;+&quot;, &quot;-&quot;, &quot;*&quot;, &quot;/&quot;]:</span></span>
<span class="line"><span>                s_end.append(stack.pop())</span></span>
<span class="line"><span>            stack.append(c)</span></span>
<span class="line"><span>        else:</span></span>
<span class="line"><span>            continue</span></span>
<span class="line"><span>    while stack:</span></span>
<span class="line"><span>        s_end.append(stack.pop())</span></span>
<span class="line"><span>    print(s_end)</span></span>
<span class="line"><span>    # 计算后缀表达式</span></span>
<span class="line"><span>    stack = []</span></span>
<span class="line"><span>    for c in s_end:</span></span>
<span class="line"><span>        if isinstance(c, int):</span></span>
<span class="line"><span>            stack.append(c)</span></span>
<span class="line"><span>        elif c == &quot;+&quot;:</span></span>
<span class="line"><span>            stack[-2] += stack[-1]</span></span>
<span class="line"><span>            stack.pop()</span></span>
<span class="line"><span>        elif c == &quot;-&quot;:</span></span>
<span class="line"><span>            stack[-2] -= stack[-1]</span></span>
<span class="line"><span>            stack.pop()</span></span>
<span class="line"><span>        elif c == &quot;*&quot;:</span></span>
<span class="line"><span>            stack[-2] *= stack[-1]</span></span>
<span class="line"><span>            stack.pop()</span></span>
<span class="line"><span>        elif c == &quot;/&quot;:</span></span>
<span class="line"><span>            stack[-2] /= stack[-1]</span></span>
<span class="line"><span>            stack.pop()</span></span>
<span class="line"><span>        else:</span></span>
<span class="line"><span>            continue</span></span>
<span class="line"><span>    return stack[0]</span></span>
<span class="line"><span></span></span>
<span class="line"><span>if __name__ == &quot;__main__&quot;:</span></span>
<span class="line"><span>    print(calculator(&quot;1+(2-3)*4+5/6&quot;))</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="leetcode相关题目"><a href="#leetcode相关题目" class="rp-header-anchor rp-link" aria-hidden="true">#</a>leetcode相关题目</h2>
<p>1.<a href="https://leetcode.com/problems/basic-calculator/" target="_blank" rel="noopener noreferrer" class="rp-link">https://leetcode.com/problems/basic-calculator/</a><br/>
2.<a href="https://leetcode.com/problems/basic-calculator-ii/" target="_blank" rel="noopener noreferrer" class="rp-link">https://leetcode.com/problems/basic-calculator-ii/</a><br/>
3.<a href="https://leetcode.com/problems/basic-calculator-iii/" target="_blank" rel="noopener noreferrer" class="rp-link">https://leetcode.com/problems/basic-calculator-iii/</a><br/>
4.<a href="https://leetcode.com/problems/basic-calculator-iv/" target="_blank" rel="noopener noreferrer" class="rp-link">https://leetcode.com/problems/basic-calculator-iv/</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[linux交换分区]]></title>
        <id>/blog/2020/wp-102</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-102"/>
        <updated>2020-03-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了如何在Linux系统中新建并启用硬盘交换分区。内容包括根据物理内存大小选择合适的交换分区容量的建议，使用`mkswap`命令创建交换分区，通过`swapon`命令启用分区，以及如何修改`/etc/fstab`文件以实现开机自动挂载。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="linux交换分区"><a href="#linux交换分区" class="rp-header-anchor rp-link" aria-hidden="true">#</a>linux交换分区<!-- --> </h1>
<h2 class="rp-toc-include" id="新建硬盘分区作为交换分区"><a href="#新建硬盘分区作为交换分区" class="rp-header-anchor rp-link" aria-hidden="true">#</a>新建硬盘分区作为交换分区</h2>
<p>硬盘分区情况</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>设备            起点      末尾      扇区  大小 类型</span></span>
<span class="line"><span>/dev/sda1       2048    821247    819200  400M Linux 文件系统</span></span>
<span class="line"><span>/dev/sda2     821248   1640447    819200  400M Linux 文件系统</span></span>
<span class="line"><span>/dev/sda3    1640448 840501247 838860800  400G Linux 文件系统</span></span>
<span class="line"><span>/dev/sda4  840501248 871958527  31457280   15G VMware 诊断</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>把<code>/dev/sda4</code>作为交换分区 交换分区大小建议</p>
<p>物理内存   不需要休眠   需要休眠   最大值</p>
<hr/>
<p>256M       256M         512M       512M
512M       512M         1024M      1024M
1024M      1024M        2048M      2048M
1G         1G           2G         2G
2G         1G           3G         4G
3G         2G           5G         6G
4G         2G           6G         8G
5G         2G           7G         10G
6G         2G           8G         12G
8G         3G           11G        16G
12G        3G           15G        24G
16G        4G           20G        32G
24G        5G           29G        48G
32G        6G           38G        64G
64G        8G           72G        128G
128G       11G          139G       256G</p>
<p>archlinux的wiki中建议交换分区类型为82 安装交换分区<code>mkswap /dev/sda4</code>
启用交换分区<code>swapon /dev/sdxy</code> 设置自动启动
在文件<code>/etc/fstab</code>中添加<code>UUID=&lt;UUID&gt; none swap defaults 0 0</code>
其中UUID<code>lsblk -no UUID /dev/sda4</code></p>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<p>[1]<a href="https://segmentfault.com/a/1190000008125116" target="_blank" rel="noopener noreferrer" class="rp-link">Linux交换空间（swap
space）</a> [2]<a href="https://wiki.archlinux.org/index.php/Swap_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)#%E4%BA%A4%E6%8D%A2%E6%96%87%E4%BB%B6" target="_blank" rel="noopener noreferrer" class="rp-link">Swap
(简体中文)</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[vim中的leetcode插件]]></title>
        <id>/blog/2020/wp-111</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-111"/>
        <updated>2020-03-24T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了Vim中`leetcode.vim`插件的安装与问题排查过程。内容涵盖了依赖安装、Vundle配置，并重点解决了因`keyring`后端和`browser-cookie3`库与新版Chrome不兼容而导致的登录失败问题，提供了安装`keyrings.alt`和从Git更新`browser-cookie3`等解决方案。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="vim中的leetcode插件"><a href="#vim中的leetcode插件" class="rp-header-anchor rp-link" aria-hidden="true">#</a>vim中的leetcode插件<!-- --> </h1>
<h2 class="rp-toc-include" id="安装"><a href="#安装" class="rp-header-anchor rp-link" aria-hidden="true">#</a>安装</h2>
<p>1.安装依赖</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">pip</span><span style="color:var(--shiki-token-string)"> install</span><span style="color:var(--shiki-token-string)"> keyring</span><span style="color:var(--shiki-token-string)"> browser-cookie3</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.使用<code>vundle</code>安装并简单配置</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>call vundle#begin()</span></span>
<span class="line"><span>...</span></span>
<span class="line"><span>Plugin &#x27;ianding1/leetcode.vim&#x27;</span></span>
<span class="line"><span>...</span></span>
<span class="line"><span>call vundle#end()</span></span>
<span class="line"><span></span></span>
<span class="line"><span>&quot;leetcode&quot;</span></span>
<span class="line"><span>let g:leetcode_china=1  &quot;中国区leetcode&quot;</span></span>
<span class="line"><span>let g:leetcode_solution_filetype=&#x27;python3&#x27;    &quot;默认使用python3&quot;</span></span>
<span class="line"><span>let g:leetcode_browser=&#x27;chrome&#x27;   &quot;登录leetcode-cn.com的浏览器&quot;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="问题"><a href="#问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>问题</h2>
<ol>
<li><code>leetcode.vim</code>依赖<code>keyring</code>
按照<a href="https://github.com/ianding1/leetcode.vim#faq" target="_blank" rel="noopener noreferrer" class="rp-link">这里</a>配置使用GnomeKeyring</li>
</ol>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>[backend]</span></span>
<span class="line"><span>default-keyring=keyring.backends.Gnome.Keyring</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>vim中执行<code>:LeetCodeSignIn</code>出现错误<code>browser_cookie3 not installed</code>
明明已经安装过了</p>
<ol start="2">
<li>
<p>通过<code>python</code>直接导入<code>browser_cookie3</code>
发现原因<code>ModuleNotFoundError: No module named &#x27;keyring.backends.Gnome&#x27;</code></p>
</li>
<li>
<p>查看<code>keyring</code>的<a href="https://github.com/jaraco/keyring" target="_blank" rel="noopener noreferrer" class="rp-link">资料</a>后,发现<code>keyring</code>把<code>keyring.backends.Gnome.Keyring</code>单独放到了<code>keyrings.alt</code>包中
安装<code>keyrings.alt</code>,有提示<code>RuntimeError: GnomeKeyring module required</code>
<code>GnomeKeyring</code>是<a href="https://pygobject.readthedocs.io/en/latest/getting_started.html" target="_blank" rel="noopener noreferrer" class="rp-link">PyGObject</a>里面的，<a href="https://pygobject.readthedocs.io/en/latest/getting_started.html" target="_blank" rel="noopener noreferrer" class="rp-link">PyGObject</a>是<code>Gtk</code>python接口,在archlinux中需要安装<code>pygobject-devel</code>和<code>libgnome-keyring</code></p>
</li>
<li>
<p><del><code>browser-cookie3</code>无法正确获取<code>chrome</code>的cookies,只能获取到key,获得的value为空,猜想应该是<code>browser-cookie3</code>解密cookies时出现了问题。原因就是<code>chrome</code>更改了对<code>cookie</code>的加密方法，因此<code>browser-cookie3</code>无法获取<code>cookie</code>。
通过更改<code>leetcode.vim</code>使用<code>pycookiecheat</code>库获取<code>cookie</code>也可以。</del></p>
</li>
<li>
<p><del>更新<code>browser-cookie3</code>库也可以解决这个问题<a href="https://github.com/borisbabic/browser_cookie3/pull/52" target="_blank" rel="noopener noreferrer" class="rp-link">Pull</a></del></p>
</li>
<li>
<p><code>browser-cookie3</code>库可以正常使用了。
因此可以尝试从git直接安装browser-cookie3这个库</p>
</li>
</ol>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">pip</span><span style="color:var(--shiki-token-string)"> install</span><span style="color:var(--shiki-token-string)"> git+https://github.com/borisbabic/browser_cookie3.git</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<ol>
<li><a href="https://github.com/ianding1/leetcode.vim" target="_blank" rel="noopener noreferrer" class="rp-link">leetcode.vim插件</a></li>
<li><a href="https://github.com/jaraco/keyring" target="_blank" rel="noopener noreferrer" class="rp-link">keyring</a></li>
<li><a href="https://github.com/n8henrie/pycookiecheat" target="_blank" rel="noopener noreferrer" class="rp-link">pycookiecheat</a></li>
</ol><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[vim命令记录]]></title>
        <id>/blog/2020/wp-60</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-60"/>
        <updated>2020-03-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了Vim中的一些实用命令，重点介绍了代码折叠功能。文章列举了Vim支持的六种折叠方式，并详细说明了如何配置和使用基于缩进（indent）的折叠。内容包括全局和单行折叠的开关命令（如`zm/zr`, `zc/zo`）以及在折叠代码间快速移动的快捷键。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="vim命令记录"><a href="#vim命令记录" class="rp-header-anchor rp-link" aria-hidden="true">#</a>vim命令记录<!-- --> </h1>
<h2 class="rp-toc-include" id="折叠代码"><a href="#折叠代码" class="rp-header-anchor rp-link" aria-hidden="true">#</a>折叠代码</h2>
<p>vim中共有六种代码折叠方式,不同的折叠方式有不同的折叠命令</p>
<ul>
<li>manual //手工定义折叠</li>
<li>indent //用缩进表示折叠</li>
<li>expr　 //用表达式来定义折叠</li>
<li>syntax //用语法高亮来定义折叠</li>
<li>diff //对没有更改的文本进行折叠</li>
<li>marker //用标志折叠</li>
</ul>
<h2 class="rp-toc-include" id="indent"><a href="#indent" class="rp-header-anchor rp-link" aria-hidden="true">#</a>indent</h2>
<p>配置方法</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span># ～/.vimrc</span></span>
<span class="line"><span>set foldmethod=indent</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>使用indent方式，vim会利用自动缩进进行折叠代码</p>
<h3 class="rp-toc-include" id="全局折叠"><a href="#全局折叠" class="rp-header-anchor rp-link" aria-hidden="true">#</a>全局折叠</h3>
<p>关闭折叠           打开折叠</p>
<hr/>
<p><code>zm</code>关闭一层折叠   <code>zr</code>打开一层折叠
<code>zM</code>关闭多层折叠   <code>zR</code>打开多层折叠</p>
<h3 class="rp-toc-include" id="单行折叠"><a href="#单行折叠" class="rp-header-anchor rp-link" aria-hidden="true">#</a>单行折叠</h3>
<p>关闭折叠           打开折叠</p>
<hr/>
<p><code>zc</code>关闭一层折叠   <code>zo</code>打开一层折叠
<code>zC</code>关闭多层折叠   <code>zO</code>打开多层折叠</p>
<h3 class="rp-toc-include" id="快速移动"><a href="#快速移动" class="rp-header-anchor rp-link" aria-hidden="true">#</a>快速移动</h3>
<p>后退           前进</p>
<hr/>
<p><code>[z</code>折叠开始   <code>]z</code>折叠末尾
<code>zk</code>上一折叠   <code>zj</code>下一折叠</p>
<h2 class="rp-toc-include" id="一些其他命令"><a href="#一些其他命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>一些其他命令</h2>
<h3 class="rp-toc-include" id="自动换行等问题"><a href="#自动换行等问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>自动换行等问题</h3>
<p>设置行宽<code>:set textwidth=78</code> 删除换行符<code>gq</code>,<code>J</code> 自动折行(默认)<code>:set wrap</code>
取消自动折行<code>:set nowrap</code></p>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<p>[1]<a href="http://vimcdoc.sourceforge.net/doc/index.html" target="_blank" rel="noopener noreferrer" class="rp-link">http://vimcdoc.sourceforge.net/doc/index.html</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[实现让终端走代理]]></title>
        <id>/blog/2020/wp-41</id>
        <link href="https://www.vhcffh.com/blog/2020/wp-41"/>
        <updated>2020-03-13T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了如何让终端流量走代理。核心方法是通过设置`http_proxy`和`https_proxy`等环境变量。文章还提供了一个在`.zshrc`中创建`setproxy`和`unsetproxy`别名以方便切换代理的技巧，并讨论了v2ray代理中`socks`与`socks5`设置可能引发的`curl`解析错误问题。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="实现让终端走代理"><a href="#实现让终端走代理" class="rp-header-anchor rp-link" aria-hidden="true">#</a>实现让终端走代理<!-- --> </h1>
<p>让终端走代理可以通过设置环境变量实现</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>export http_proxy=socks5://127.0.0.1:1080 </span></span>
<span class="line"><span>export https_proxy=socks5://127.0.0.1:1080 </span></span>
<span class="line"><span>export ALL_PROXY=socks5://127.0.0.1:1080</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>把代理服务器的配置写到shell配置文件<code>~/.bashrc</code>或者<code>./zshrc</code><br/>
并通过<code>alias</code>实现方便的设置代理<code>setproxy</code>，关闭代理<code>unsetproxy</code>，验证代理<code>myip</code></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span># ~/.zshrc </span></span>
<span class="line"><span># setproxy,unsetproxy,myip </span></span>
<span class="line"><span>alias setproxy=&quot;export ALL_PROXY=socks://localhost:1080&quot; </span></span>
<span class="line"><span>alias unsetproxy=&quot;unset ALL_PROXY&quot; </span></span>
<span class="line"><span>alias myip=&quot;curl http://cip.cc&quot; </span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>验证ip通过获取本机外网ip实现[2]
<img src="https://i.imgur.com/Xtdho3W.png" alt="file"/></p>
<h2 class="rp-toc-include" id="问题"><a href="#问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>问题</h2>
<p>本机使用v2ray开的<code>socks</code>代理，设置代理用<code>sock5</code>会出现错误，只能设置成socks，可能是终端不支持socks5，v2ray兼容socks<br/>
查<a href="https://www.v2ray.com/chapter_02/protocols/socks.html" target="_blank" rel="noopener noreferrer" class="rp-link">资料</a>得知<code>v2ray</code>中的<code>socks</code>兼容
Socks 4、Socks 4a 和 Socks 5<br/>
<code>curl: (6) Couldn&#x27;t resolve host name</code><br/>
但是在chrome中使用SwitchyOmega设置为<code>sock5</code>可以上网</p>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<p>[1]<a href="https://blog.fazero.me/2015/09/15/%E8%AE%A9%E7%BB%88%E7%AB%AF%E8%B5%B0%E4%BB%A3%E7%90%86%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E6%B3%95/" target="_blank" rel="noopener noreferrer" class="rp-link" title="让终端走代理的几种方法">让终端走代理的几种方法</a><br/>
[2]<a href="https://www.cnblogs.com/wjoyxt/p/6288582.html" target="_blank" rel="noopener noreferrer" class="rp-link" title="用Linux命令行获取本机外网IP地址">用Linux命令行获取本机外网IP地址</a><br/>
[3]<a href="https://www.v2ray.com/chapter_02/protocols/socks.html" target="_blank" rel="noopener noreferrer" class="rp-link">www.v2ray.com</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Transformers]]></title>
        <id>/blog/2019/hexo-Transformers</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-Transformers"/>
        <updated>2019-12-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了Hugging Face的Transformers库，一个强大的Python库，提供了BERT、GPT-2等多种预训练模型用于NLU和NLG任务。文章概述了该库的特点，列举了其支持的多种主流模型，并详细说明了库的核心使用方法，包括模型（Model）、配置（Config）和分词器（Tokenizer）三个主要类。最后通过一个BERT的实例，展示了如何加载模型、处理文本输入以及进行预测。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="transformers"><a href="#transformers" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Transformers<!-- --> </h1>
<p><a href="https://github.com/huggingface/transformers" target="_blank" rel="noopener noreferrer" class="rp-link">transformers</a>（与<em>pytorch-transformers</em>和<em>pytorch-pretrained-bert</em>相似）是python的一个库，它提供了用于自然语言理解(NLU)和自然语言生成(NLG)的多种预训练模型（BERT，GPT-2，RoBERTa，XLM，DistilBert，XLNet.....），为100多种语言提供了超过32种的预训练模型，并实现Tensorflow
2.0和Pytorch的深度互操作。</p>
<p>特点</p>
<ul>
<li>与pytorch-transformers一样容易使用</li>
<li>如Keras一样强大简洁</li>
<li>在NLU和NLG任务上有很好的表现</li>
<li>容易学习</li>
</ul>
<p>模型</p>
<ol>
<li><a href="https://github.com/google-research/bert" target="_blank" rel="noopener noreferrer" class="rp-link">BERT</a> (from Google)
released with the paper <a href="https://arxiv.org/abs/1810.04805" target="_blank" rel="noopener noreferrer" class="rp-link">BERT: Pre-training of Deep Bidirectional
Transformers for Language
Understanding</a> by Jacob Devlin,
Ming-Wei Chang, Kenton Lee and Kristina Toutanova.</li>
<li><a href="https://github.com/openai/finetune-transformer-lm" target="_blank" rel="noopener noreferrer" class="rp-link">GPT</a> (from
OpenAI) released with the paper <a href="https://blog.openai.com/language-unsupervised" target="_blank" rel="noopener noreferrer" class="rp-link">Improving Language Understanding by
Generative
Pre-Training</a> by Alec
Radford, Karthik Narasimhan, Tim Salimans and Ilya Sutskever.</li>
<li><a href="https://blog.openai.com/better-language-models" target="_blank" rel="noopener noreferrer" class="rp-link">GPT-2</a> (from
OpenAI) released with the paper <a href="https://blog.openai.com/better-language-models" target="_blank" rel="noopener noreferrer" class="rp-link">Language Models are Unsupervised
Multitask Learners</a>
by Alec Radford*, Jeffrey Wu*, Rewon Child, David Luan, Dario Amodei
<strong>and Ilya Sutskever</strong>.</li>
<li><a href="https://github.com/kimiyoung/transformer-xl" target="_blank" rel="noopener noreferrer" class="rp-link">Transformer-XL</a> (from
Google/CMU) released with the paper <a href="https://arxiv.org/abs/1901.02860" target="_blank" rel="noopener noreferrer" class="rp-link">Transformer-XL: Attentive
Language Models Beyond a Fixed-Length
Context</a> by Zihang Dai*, Zhilin
Yang*, Yiming Yang, Jaime Carbonell, Quoc V. Le, Ruslan
Salakhutdinov.</li>
<li><a href="https://github.com/zihangdai/xlnet" target="_blank" rel="noopener noreferrer" class="rp-link">XLNet</a> (from Google/CMU)
released with the paper <a href="https://arxiv.org/abs/1906.08237" target="_blank" rel="noopener noreferrer" class="rp-link">XLNet: Generalized Autoregressive
Pretraining for Language
Understanding</a> by Zhilin Yang*,
Zihang Dai*, Yiming Yang, Jaime Carbonell, Ruslan Salakhutdinov,
Quoc V. Le.</li>
<li><a href="https://github.com/facebookresearch/XLM" target="_blank" rel="noopener noreferrer" class="rp-link">XLM</a> (from Facebook)
released together with the paper <a href="https://arxiv.org/abs/1901.07291" target="_blank" rel="noopener noreferrer" class="rp-link">Cross-lingual Language Model
Pretraining</a> by Guillaume Lample
and Alexis Conneau.</li>
<li><a href="https://github.com/pytorch/fairseq/tree/master/examples/roberta" target="_blank" rel="noopener noreferrer" class="rp-link">RoBERTa</a>
(from Facebook), released together with the paper a <a href="https://arxiv.org/abs/1907.11692" target="_blank" rel="noopener noreferrer" class="rp-link">Robustly
Optimized BERT Pretraining
Approach</a> by Yinhan Liu, Myle Ott,
Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike
Lewis, Luke Zettlemoyer, Veselin Stoyanov.</li>
<li><a href="https://huggingface.co/transformers/model_doc/distilbert.html" target="_blank" rel="noopener noreferrer" class="rp-link">DistilBERT</a>
(from HuggingFace) released together with the paper <a href="https://arxiv.org/abs/1910.01108" target="_blank" rel="noopener noreferrer" class="rp-link">DistilBERT, a
distilled version of BERT: smaller, faster, cheaper and
lighter</a> by Victor Sanh, Lysandre
Debut and Thomas Wolf. The same method has been applied to compress
GPT2 into
<a href="https://github.com/huggingface/transformers/tree/master/examples/distillation" target="_blank" rel="noopener noreferrer" class="rp-link">DistilGPT2</a>.</li>
<li><a href="https://github.com/pytorch/fairseq/tree/master/examples/ctrl" target="_blank" rel="noopener noreferrer" class="rp-link">CTRL</a>
(from Salesforce), released together with the paper <a href="https://www.github.com/salesforce/ctrl" target="_blank" rel="noopener noreferrer" class="rp-link">CTRL: A
Conditional Transformer Language Model for Controllable
Generation</a> by Nitish
Shirish Keskar*, Bryan McCann*, Lav R. Varshney, Caiming Xiong and
Richard Socher.</li>
<li><a href="https://huggingface.co/transformers/model_doc/camembert.html" target="_blank" rel="noopener noreferrer" class="rp-link">CamemBERT</a>
(from FAIR, Inria, Sorbonne Université) released together with the
paper <a href="https://arxiv.org/abs/1911.03894" target="_blank" rel="noopener noreferrer" class="rp-link">CamemBERT: a Tasty French Language
Model</a> by Louis Martin, Benjamin
Muller, Pedro Javier Ortiz Suarez, Yoann Dupont, Laurent Romary,
Eric Villemonte de la Clergerie, Djame Seddah, and Benoît Sagot.</li>
<li><a href="https://github.com/google-research/ALBERT" target="_blank" rel="noopener noreferrer" class="rp-link">ALBERT</a> (from Google
Research), released together with the paper a <a href="https://arxiv.org/abs/1909.11942" target="_blank" rel="noopener noreferrer" class="rp-link">ALBERT: A Lite BERT
for Self-supervised Learning of Language
Representations</a> by Zhenzhong Lan,
Mingda Chen, Sebastian Goodman, Kevin Gimpel, Piyush Sharma, Radu
Soricut.</li>
<li><a href="https://github.com/pytorch/fairseq/tree/master/examples/xlmr" target="_blank" rel="noopener noreferrer" class="rp-link">XLM-RoBERTa</a>
(from Facebook AI), released together with the paper <a href="https://arxiv.org/abs/1911.02116" target="_blank" rel="noopener noreferrer" class="rp-link">Unsupervised
Cross-lingual Representation Learning at
Scale</a> by Alexis Conneau*,
Kartikay Khandelwal*, Naman Goyal, Vishrav Chaudhary, Guillaume
Wenzek, Francisco Guzmán, Edouard Grave, Myle Ott, Luke Zettlemoyer
and Veselin Stoyanov.</li>
</ol>
<p>使用</p>
<p>对于每个模型，这个库主要涉及3个类</p>
<ul>
<li>model classes：提供模型的结构，如：<code>BertModel</code></li>
<li>configuration classes：存储构建模型的所有参数，如<code>BertConfig</code></li>
<li>tokenizer
classes：提供模型的词汇表和用于对字符串解码/编码的方法，如<code>BertTokenizer</code></li>
</ul>
<p>所有的实例可以通过<code>from_pretrained()</code>加载预训练模型，通过<code>save_pretrained()</code>保存模型</p>
<p>BERT example</p>
<p>从字符串获得输入向量</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>import torch</span></span>
<span class="line"><span>from transformers import BertTokenizer, BertModel, BertForMaskedLM</span></span>
<span class="line"><span></span></span>
<span class="line"><span># OPTIONAL: if you want to have more information on what&#x27;s happening under the hood, activate the logger as follows</span></span>
<span class="line"><span>import logging</span></span>
<span class="line"><span>logging.basicConfig(level=logging.INFO)</span></span>
<span class="line"><span></span></span>
<span class="line"><span># Load pre-trained model tokenizer (vocabulary)</span></span>
<span class="line"><span>tokenizer = BertTokenizer.from_pretrained(&#x27;bert-base-uncased&#x27;)</span></span>
<span class="line"><span># 中文bert模型&#x27;bert-base-chinese&#x27;</span></span>
<span class="line"><span># bert 特殊的符号</span></span>
<span class="line"><span># &#x27;[MASK]&#x27; 用于mask language model</span></span>
<span class="line"><span># &#x27;[CLS]&#x27; 开头，用于分类的标记</span></span>
<span class="line"><span># &#x27;[PAD]&#x27; </span></span>
<span class="line"><span># &#x27;[SEP]&#x27; 结尾，句子分隔符</span></span>
<span class="line"><span># &#x27;[UNK]&#x27;</span></span>
<span class="line"><span></span></span>
<span class="line"><span># Tokenize input</span></span>
<span class="line"><span>text = &quot;[CLS] Who was Jim Henson ? [SEP] Jim Henson was a puppeteer [SEP]&quot;</span></span>
<span class="line"><span>tokenized_text = tokenizer.tokenize(text)</span></span>
<span class="line"><span></span></span>
<span class="line"><span># Mask a token that we will try to predict back with `BertForMaskedLM`</span></span>
<span class="line"><span>masked_index = 8</span></span>
<span class="line"><span>tokenized_text[masked_index] = &#x27;[MASK]&#x27;</span></span>
<span class="line"><span>assert tokenized_text == [&#x27;[CLS]&#x27;, &#x27;who&#x27;, &#x27;was&#x27;, &#x27;jim&#x27;, &#x27;henson&#x27;, &#x27;?&#x27;, &#x27;[SEP]&#x27;, &#x27;jim&#x27;, &#x27;[MASK]&#x27;, &#x27;was&#x27;, &#x27;a&#x27;, &#x27;puppet&#x27;, &#x27;##eer&#x27;, &#x27;[SEP]&#x27;]</span></span>
<span class="line"><span></span></span>
<span class="line"><span># Convert token to vocabulary indices</span></span>
<span class="line"><span>indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)</span></span>
<span class="line"><span># Define sentence A and B indices associated to 1st and 2nd sentences (see paper)</span></span>
<span class="line"><span>segments_ids = [0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]</span></span>
<span class="line"><span></span></span>
<span class="line"><span># Convert inputs to PyTorch tensors</span></span>
<span class="line"><span>tokens_tensor = torch.tensor([indexed_tokens])</span></span>
<span class="line"><span>segments_tensors = torch.tensor([segments_ids])</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>对输入进行编码</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span># Load pre-trained model (weights)</span></span>
<span class="line"><span>model = BertModel.from_pretrained(&#x27;bert-base-uncased&#x27;)</span></span>
<span class="line"><span></span></span>
<span class="line"><span># Set the model in evaluation mode to deactivate the DropOut modules</span></span>
<span class="line"><span># This is IMPORTANT to have reproducible results during evaluation!</span></span>
<span class="line"><span>model.eval()</span></span>
<span class="line"><span></span></span>
<span class="line"><span># If you have a GPU, put everything on cuda</span></span>
<span class="line"><span>tokens_tensor = tokens_tensor.to(&#x27;cuda&#x27;)</span></span>
<span class="line"><span>segments_tensors = segments_tensors.to(&#x27;cuda&#x27;)</span></span>
<span class="line"><span>model.to(&#x27;cuda&#x27;)</span></span>
<span class="line"><span></span></span>
<span class="line"><span># Predict hidden states features for each layer</span></span>
<span class="line"><span>with torch.no_grad():</span></span>
<span class="line"><span>    # See the models docstrings for the detail of the inputs</span></span>
<span class="line"><span>    outputs = model(tokens_tensor, token_type_ids=segments_tensors)</span></span>
<span class="line"><span>    # Transformers models always output tuples.</span></span>
<span class="line"><span>    # See the models docstrings for the detail of all the outputs</span></span>
<span class="line"><span>    # In our case, the first element is the hidden state of the last layer of the Bert model</span></span>
<span class="line"><span>    encoded_layers = outputs[0]</span></span>
<span class="line"><span># We have encoded our input sequence in a FloatTensor of shape (batch size, sequence length, model hidden dimension)</span></span>
<span class="line"><span>assert tuple(encoded_layers.shape) == (1, len(indexed_tokens), model.config.hidden_size)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>使用<code>BertForMaskedLM</code>预测masked token</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span># Load pre-trained model (weights)</span></span>
<span class="line"><span>model = BertForMaskedLM.from_pretrained(&#x27;bert-base-uncased&#x27;)</span></span>
<span class="line"><span>model.eval()</span></span>
<span class="line"><span></span></span>
<span class="line"><span># If you have a GPU, put everything on cuda</span></span>
<span class="line"><span>tokens_tensor = tokens_tensor.to(&#x27;cuda&#x27;)</span></span>
<span class="line"><span>segments_tensors = segments_tensors.to(&#x27;cuda&#x27;)</span></span>
<span class="line"><span>model.to(&#x27;cuda&#x27;)</span></span>
<span class="line"><span></span></span>
<span class="line"><span># Predict all tokens</span></span>
<span class="line"><span>with torch.no_grad():</span></span>
<span class="line"><span>    outputs = model(tokens_tensor, token_type_ids=segments_tensors)</span></span>
<span class="line"><span>    predictions = outputs[0]</span></span>
<span class="line"><span></span></span>
<span class="line"><span># confirm we were able to predict &#x27;henson&#x27;</span></span>
<span class="line"><span>predicted_index = torch.argmax(predictions[0, masked_index]).item()</span></span>
<span class="line"><span>predicted_token = tokenizer.convert_ids_to_tokens([predicted_index])[0]</span></span>
<span class="line"><span>assert predicted_token == &#x27;henson&#x27;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>参考</p>
<p>1.<a href="https://huggingface.co/transformers/index.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://huggingface.co/transformers/index.html</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[机器学习笔记]]></title>
        <id>/blog/2019/hexo-机器学习笔记</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-机器学习笔记"/>
        <updated>2019-11-15T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是一篇关于机器学习评估指标的学习笔记。内容分为两部分：第一部分详细介绍了分类任务中常用的评估指标，包括准确率、精确率、召回率以及它们的调和均值F1分数。第二部分则聚焦于自然语言处理领域的序列评估指标，讲解了用于机器翻译的BLEU和用于自动摘要的ROUGE（特别是ROUGE-N和ROUGE-L）的计算方法和核心思想。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="机器学习笔记"><a href="#机器学习笔记" class="rp-header-anchor rp-link" aria-hidden="true">#</a>机器学习笔记<!-- --> </h1>
<h2 class="rp-toc-include" id="分类"><a href="#分类" class="rp-header-anchor rp-link" aria-hidden="true">#</a>分类</h2>
<p>准确率:所有样本中预测正确的占比</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>a</mi><mi>c</mi><mi>c</mi><mi>u</mi><mi>r</mi><mi>a</mi><mi>c</mi><mi>y</mi><mo>=</mo><mfrac><mrow><mi>T</mi><mi>P</mi><mo>+</mo><mi>T</mi><mi>N</mi></mrow><mrow><mi>T</mi><mi>P</mi><mo>+</mo><mi>T</mi><mi>N</mi><mo>+</mo><mi>F</mi><mi>P</mi><mo>+</mo><mi>F</mi><mi>N</mi></mrow></mfrac><mo>=</mo><mfrac><mi>T</mi><mrow><mi>T</mi><mo>+</mo><mi>F</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">accuracy =\frac {TP+TN}{TP+TN+FP+FN} = \frac {T}{T+F}
</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">a</span><span class="mord mathnormal">cc</span><span class="mord mathnormal">u</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.03588em">cy</span><span 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:2.1297em;vertical-align:-0.7693em"></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.3603em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">TP</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.10903em">TN</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.13889em">FP</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.10903em">FN</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">TP</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.10903em">TN</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em"><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:2.1297em;vertical-align:-0.7693em"></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.3603em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><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 class="mord mathnormal" style="margin-right:0.13889em">F</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">T</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>精确率:<strong>预测为正的样本</strong>中真正的正样本占比</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>p</mi><mi>r</mi><mi>e</mi><mi>c</mi><mi>i</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo>=</mo><mfrac><mrow><mi>T</mi><mi>P</mi></mrow><mrow><mi>T</mi><mi>P</mi><mo>+</mo><mi>F</mi><mi>P</mi></mrow></mfrac><mo>=</mo><mfrac><mrow><mi>T</mi><mi>P</mi></mrow><msup><mi>P</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></mfrac></mrow><annotation encoding="application/x-tex">precision = \frac {TP}{TP+FP} = \frac {TP}{P&#x27;}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.854em;vertical-align:-0.1944em"></span><span class="mord mathnormal">p</span><span class="mord mathnormal">rec</span><span class="mord mathnormal">i</span><span class="mord mathnormal">s</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</span><span 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:2.1297em;vertical-align:-0.7693em"></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.3603em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">TP</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.13889em">FP</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">TP</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em"><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:2.0463em;vertical-align:-0.686em"></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.3603em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6779em"><span style="top:-2.989em;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 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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">TP</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>召回率:<strong>正样本</strong>中预测为正的占比</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>r</mi><mi>e</mi><mi>c</mi><mi>a</mi><mi>l</mi><mi>l</mi><mo>=</mo><mfrac><mrow><mi>T</mi><mi>P</mi></mrow><mrow><mi>T</mi><mi>P</mi><mo>+</mo><mi>F</mi><mi>N</mi></mrow></mfrac><mo>=</mo><mfrac><mrow><mi>T</mi><mi>P</mi></mrow><mi>P</mi></mfrac></mrow><annotation encoding="application/x-tex">recall = \frac{TP}{TP+FN} = \frac{TP}{P}
</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 mathnormal">rec</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em">ll</span><span 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:2.1297em;vertical-align:-0.7693em"></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.3603em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">TP</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.10903em">FN</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">TP</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em"><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:2.0463em;vertical-align:-0.686em"></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.3603em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">P</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">TP</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>F1:精确率和召回率的<strong>调和均值</strong></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mfrac><mn>2</mn><msub><mi>F</mi><mn>1</mn></msub></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><mn>1</mn><mrow><mi>p</mi><mi>r</mi><mi>e</mi><mi>c</mi><mi>i</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi></mrow></mfrac><mo>+</mo><mfrac><mn>1</mn><mrow><mi>r</mi><mi>e</mi><mi>c</mi><mi>a</mi><mi>l</mi><mi>l</mi></mrow></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><msub><mi>F</mi><mn>1</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><mrow><mn>2</mn><mo>⋅</mo><mi>p</mi><mi>r</mi><mi>e</mi><mi>c</mi><mi>i</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo>⋅</mo><mi>r</mi><mi>e</mi><mi>c</mi><mi>a</mi><mi>l</mi><mi>l</mi></mrow><mrow><mi>p</mi><mi>r</mi><mi>e</mi><mi>c</mi><mi>i</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo>+</mo><mi>r</mi><mi>e</mi><mi>c</mi><mi>a</mi><mi>l</mi><mi>l</mi></mrow></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><msub><mi>F</mi><mn>1</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><mrow><mn>2</mn><mi>T</mi><mi>P</mi></mrow><mrow><mn>2</mn><mi>T</mi><mi>P</mi><mo>+</mo><mi>F</mi><mi>P</mi><mo>+</mo><mi>F</mi><mi>N</mi></mrow></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><msub><mi>F</mi><mn>1</mn></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><mrow><mn>2</mn><mi>T</mi><mi>P</mi></mrow><mrow><msup><mi>P</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><mo>+</mo><mi>P</mi></mrow></mfrac></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{align*}
\frac{2}{F_1} &amp; = \frac{1}{precision} + \frac{1}{recall}\cr
F_1 &amp; = \frac{2\cdot precision \cdot recall}{precision+recall}\cr
F_1 &amp; = \frac{2TP}{2TP + FP + FN} \cr
F_1 &amp; = \frac{2TP}{P&#x27; + P} \cr
\end{align*}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:9.9131em;vertical-align:-4.7065em"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:5.2065em"><span style="top:-7.2565em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><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.3214em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><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 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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-4.7047em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><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 style="top:-2.1639em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><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 style="top:0.2658em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.7065em"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:5.2065em"><span style="top:-7.2565em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></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.3214em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">p</span><span class="mord mathnormal">rec</span><span class="mord mathnormal">i</span><span class="mord mathnormal">s</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</span><span class="mord mathnormal">n</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">rec</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em">ll</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-4.7047em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">p</span><span class="mord mathnormal">rec</span><span class="mord mathnormal">i</span><span class="mord mathnormal">s</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</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 class="mord mathnormal">rec</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em">ll</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</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">p</span><span class="mord mathnormal">rec</span><span class="mord mathnormal">i</span><span class="mord mathnormal">s</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</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 class="mord mathnormal">rec</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em">ll</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-2.1639em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></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.3603em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.13889em">TP</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.13889em">FP</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.10903em">FN</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.13889em">TP</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:0.2658em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></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.3603em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6779em"><span style="top:-2.989em;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.2222em"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em"></span><span class="mord mathnormal" style="margin-right:0.13889em">P</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</span><span class="mord mathnormal" style="margin-right:0.13889em">TP</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:4.7065em"><span></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>F-score:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>F</mi><mrow><mi>s</mi><mi>c</mi><mi>o</mi><mi>r</mi><mi>e</mi></mrow></msub><mo>=</mo><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><msup><mi>β</mi><mn>2</mn></msup><mo stretchy="false">)</mo><mo>⋅</mo><mfrac><mrow><mi>p</mi><mi>r</mi><mi>e</mi><mi>c</mi><mi>i</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo>⋅</mo><mi>r</mi><mi>e</mi><mi>c</mi><mi>a</mi><mi>l</mi><mi>l</mi></mrow><mrow><msup><mi>β</mi><mn>2</mn></msup><mo>⋅</mo><mi>p</mi><mi>r</mi><mi>e</mi><mi>c</mi><mi>i</mi><mi>s</mi><mi>i</mi><mi>o</mi><mi>n</mi><mo>+</mo><mi>r</mi><mi>e</mi><mi>c</mi><mi>a</mi><mi>l</mi><mi>l</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">F_{score}=(1+\beta^2)\cdot \frac{precision \cdot recall}{\beta^2\cdot precision + recall}
</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.1514em"><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">score</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">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:1.1141em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</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">2</span></span></span></span></span></span></span></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:2.2519em;vertical-align:-0.8804em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.989em;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></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 mathnormal">p</span><span class="mord mathnormal">rec</span><span class="mord mathnormal">i</span><span class="mord mathnormal">s</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</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 class="mord mathnormal">rec</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em">ll</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">p</span><span class="mord mathnormal">rec</span><span class="mord mathnormal">i</span><span class="mord mathnormal">s</span><span class="mord mathnormal">i</span><span class="mord mathnormal">o</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 class="mord mathnormal">rec</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.01968em">ll</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>




















<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th></th><th>P</th><th>N</th></tr></thead><tbody><tr><td>P&#x27;</td><td>TP</td><td>FP</td></tr><tr><td>N&#x27;</td><td>FN</td><td>TN</td></tr></tbody></table></div>
<h2 class="rp-toc-include" id="序列"><a href="#序列" class="rp-header-anchor rp-link" aria-hidden="true">#</a>序列</h2>
<p>BLEU(Bilingual Evaluation understudy)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>C</mi><msub><mi>P</mi><mi>n</mi></msub><mo stretchy="false">(</mo><mi>C</mi><mo separator="true">,</mo><mi>S</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><munder><mo>∑</mo><mi>i</mi></munder><munder><mo>∑</mo><mi>k</mi></munder><mi>min</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mi>h</mi><mi>k</mi></msub><mo stretchy="false">(</mo><msub><mi>c</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><mi>m</mi><mi>a</mi><msub><mi>x</mi><mrow><mi>j</mi><mo>∈</mo><mi>m</mi></mrow></msub><msub><mi>h</mi><mi>k</mi></msub><mo stretchy="false">(</mo><msub><mi>s</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><mrow><munder><mo>∑</mo><mi>i</mi></munder><munder><mo>∑</mo><mi>k</mi></munder><msub><mi>h</mi><mi>k</mi></msub><mo stretchy="false">(</mo><msub><mi>c</mi><mi>j</mi></msub><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">CP_n(C,S)=\frac {\sum_i\sum_k\min(h_k(c_i),max_{j \in m}h_k(s_{ij}))}{\sum_i\sum_kh_k(c_j)}
</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.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.1514em"><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">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="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07153em">C</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.05764em">S</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:2.4254em;vertical-align:-0.9857em"></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.4397em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.162em"><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 mathnormal mtight">i</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="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.1864em"><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 mathnormal mtight" style="margin-right:0.03148em">k</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 mathnormal">h</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" style="margin-right:0.03148em">k</span></span></span></span><span class="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">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: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.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 class="mclose">)</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.6897em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.162em"><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 mathnormal mtight">i</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="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.1864em"><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 mathnormal mtight" style="margin-right:0.03148em">k</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="mop">min</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">h</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" style="margin-right:0.03148em">k</span></span></span></span><span class="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">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: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="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">ma</span><span class="mord"><span class="mord mathnormal">x</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" style="margin-right:0.05724em">j</span><span class="mrel mtight">∈</span><span class="mord mathnormal mtight">m</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">h</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" style="margin-right:0.03148em">k</span></span></span></span><span class="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">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: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">ij</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mclose">))</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9857em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><strong>惩罚因子BP(Brevity Penalty)</strong></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>b</mi><mo stretchy="false">(</mo><mi>C</mi><mo separator="true">,</mo><mi>S</mi><mo stretchy="false">)</mo><mo>=</mo><mrow><mo fence="true">{</mo><mtable rowspacing="0.36em" columnalign="left left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>1</mn><mo separator="true">,</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mi>l</mi><mi>c</mi></msub><mo>&lt;</mo><msub><mi>l</mi><mi>s</mi></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msup><mi>e</mi><mrow><mn>1</mn><mo>−</mo><mfrac><msub><mi>l</mi><mi>s</mi></msub><msub><mi>l</mi><mi>c</mi></msub></mfrac></mrow></msup><mo separator="true">,</mo></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mi>l</mi><mi>c</mi></msub><mo>≥</mo><msub><mi>l</mi><mi>s</mi></msub></mrow></mstyle></mtd></mtr></mtable></mrow></mrow><annotation encoding="application/x-tex">b(C,S)=\begin{cases}
1,                        &amp;l_c \lt l_s \cr
e^{1-\frac{l_s}{l_c}},    &amp;l_c \geq l_s
\end{cases}
</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">b</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07153em">C</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.05764em">S</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:3em;vertical-align:-1.25em"></span><span class="minner"><span class="mopen delimcenter" style="top:0em"><span class="delimsizing size4">{</span></span><span class="mord"><span class="mtable"><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7471em"><span style="top:-3.8613em"><span class="pstrut" style="height:3.1222em"></span><span class="mord"><span class="mord">1</span><span class="mpunct">,</span></span></span><span style="top:-2.3071em"><span class="pstrut" style="height:3.1222em"></span><span class="mord"><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.1222em"><span style="top:-3.4486em;margin-right:0.05em"><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 class="mbin mtight">−</span><span class="mord mtight"><span class="mopen nulldelimiter sizing reset-size3 size6"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9624em"><span style="top:-2.656em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.01968em">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2306em"><span style="top:-2.3em;margin-left:-0.0197em;margin-right:0.1em"><span class="pstrut" style="height:2.5em"></span><span class="mord mathnormal mtight">c</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2em"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.2255em"><span class="pstrut" style="height:3em"></span><span class="frac-line mtight" style="border-bottom-width:0.049em"></span></span><span style="top:-3.4664em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.01968em">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2306em"><span style="top:-2.3em;margin-left:-0.0197em;margin-right:0.1em"><span class="pstrut" style="height:2.5em"></span><span class="mord mathnormal mtight">s</span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2em"><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.4869em"><span></span></span></span></span></span><span class="mclose nulldelimiter sizing reset-size3 size6"></span></span></span></span></span></span></span></span></span></span><span class="mpunct">,</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2471em"><span></span></span></span></span></span><span class="arraycolsep" style="width:1em"></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7471em"><span style="top:-3.8613em"><span class="pstrut" style="height:3.1222em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em">l</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.0197em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">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">&lt;</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em">l</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.0197em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span 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:-2.3071em"><span class="pstrut" style="height:3.1222em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em">l</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.0197em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">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 class="mord"><span class="mord mathnormal" style="margin-right:0.01968em">l</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.0197em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">s</span></span></span></span><span 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2471em"><span></span></span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>B</mi><mi>L</mi><mi>E</mi><msub><mi>U</mi><mi>N</mi></msub><mo stretchy="false">(</mo><mi>C</mi><mo separator="true">,</mo><mi>S</mi><mo stretchy="false">)</mo><mo>=</mo><mi>b</mi><mo stretchy="false">(</mo><mi>C</mi><mo separator="true">,</mo><mi>S</mi><mo stretchy="false">)</mo><mi>exp</mi><mo>⁡</mo><mo stretchy="false">(</mo><munderover><mo>∑</mo><mrow><mi>n</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><msub><mi>ω</mi><mi>n</mi></msub><mi>log</mi><mo>⁡</mo><mi>C</mi><msub><mi>P</mi><mi>n</mi></msub><mo stretchy="false">(</mo><mi>C</mi><mo separator="true">,</mo><mi>S</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">BLEU_N(C,S)=b(C,S)\exp(\sum_{n=1}^N\omega_n\log CP_n(C,S))
</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.05017em">B</span><span class="mord mathnormal">L</span><span class="mord mathnormal" style="margin-right:0.05764em">E</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em">U</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.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.10903em">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="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07153em">C</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.05764em">S</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:3.0954em;vertical-align:-1.2671em"></span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07153em">C</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.05764em">S</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop">exp</span><span class="mopen">(</span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em"><span style="top:-1.8829em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">n</span><span class="mrel mtight">=</span><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2671em"><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.03588em">ω</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.0359em;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.1667em"></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 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.1514em"><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">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="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07153em">C</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.05764em">S</span><span class="mclose">))</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>机器翻译</p>
<p>ROUGE(Recall-Oriented Understudy for Gisting Evaluation)</p>





















<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th>ROUGE-N</th><th>基于N-gram公现性统计</th></tr></thead><tbody><tr><td>ROUGE-L</td><td>基于最长公有子句共现性精确度和召回率Fmeasure统计</td></tr><tr><td>ROUGE-W</td><td>代权重的最长公有子句共现性精确度和召回率Fmeasure统计</td></tr><tr><td>ROUGE-S</td><td>不连续二元组共现性精确度和召回率Fmeasure统计</td></tr></tbody></table></div>
<p><strong>ROUGE-N</strong></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>R</mi><mi>O</mi><mi>U</mi><mi>G</mi><mi>E</mi><mo>−</mo><mi>N</mi><mo>=</mo><mfrac><mrow><munder><mo>∑</mo><mrow><mi>S</mi><mo>∈</mo><mi>R</mi><mi>e</mi><mi>f</mi><mi>e</mi><mi>r</mi><mi>e</mi><mi>n</mi><mi>c</mi><mi>e</mi><mi>s</mi><mi>S</mi><mi>u</mi><mi>m</mi><mi>m</mi><mi>a</mi><mi>r</mi><mi>i</mi><mi>e</mi><mi>s</mi></mrow></munder><munder><mo>∑</mo><mrow><mi>g</mi><mi>r</mi><mi>a</mi><msub><mi>m</mi><mi>n</mi></msub><mo>∈</mo><mi>S</mi></mrow></munder><mi>C</mi><mi>o</mi><mi>u</mi><mi>n</mi><msub><mi>t</mi><mrow><mi>m</mi><mi>a</mi><mi>t</mi><mi>c</mi><mi>h</mi></mrow></msub><mo stretchy="false">(</mo><mi>g</mi><mi>r</mi><mi>a</mi><msub><mi>m</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><mrow><munder><mo>∑</mo><mrow><mi>S</mi><mo>∈</mo><mi>R</mi><mi>e</mi><mi>f</mi><mi>e</mi><mi>r</mi><mi>e</mi><mi>n</mi><mi>c</mi><mi>e</mi><mi>s</mi><mi>S</mi><mi>u</mi><mi>m</mi><mi>m</mi><mi>a</mi><mi>r</mi><mi>i</mi><mi>e</mi><mi>s</mi></mrow></munder><munder><mo>∑</mo><mrow><mi>g</mi><mi>r</mi><mi>a</mi><msub><mi>m</mi><mi>n</mi></msub><mo>∈</mo><mi>S</mi></mrow></munder><mi>C</mi><mi>o</mi><mi>u</mi><mi>n</mi><mi>t</mi><mo stretchy="false">(</mo><mi>g</mi><mi>r</mi><mi>a</mi><msub><mi>m</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">ROUGE-N=\frac {\sum_{S \in ReferencesSummaries}\sum_{gram_n\in S}Count_{match}(gram_n)}
{\sum_{S \in ReferencesSummaries}\sum_{gram_n\in S}Count(gram_n)}
</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.02778em">RO</span><span class="mord mathnormal" style="margin-right:0.10903em">U</span><span class="mord mathnormal" style="margin-right:0.05764em">GE</span><span 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.10903em">N</span><span 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:2.6976em;vertical-align:-1.1218em"></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.5758em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.1864em"><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.05764em">S</span><span class="mrel mtight">∈</span><span class="mord mathnormal mtight" style="margin-right:0.00773em">R</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight" style="margin-right:0.10764em">f</span><span class="mord mathnormal mtight">ere</span><span class="mord mathnormal mtight">n</span><span class="mord mathnormal mtight">ces</span><span class="mord mathnormal mtight" style="margin-right:0.05764em">S</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">mma</span><span class="mord mathnormal mtight" style="margin-right:0.02778em">r</span><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight">es</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></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" style="margin-right:0.03588em">g</span><span class="mord mathnormal mtight" style="margin-right:0.02778em">r</span><span class="mord mathnormal mtight">a</span><span class="mord mtight"><span class="mord mathnormal mtight">m</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:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span><span class="mrel mtight">∈</span><span class="mord mathnormal mtight" style="margin-right:0.05764em">S</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.07153em">C</span><span class="mord mathnormal">o</span><span class="mord mathnormal">u</span><span class="mord mathnormal">n</span><span class="mord mathnormal">t</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span><span class="mord mathnormal">a</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.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 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.8258em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.1864em"><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.05764em">S</span><span class="mrel mtight">∈</span><span class="mord mathnormal mtight" style="margin-right:0.00773em">R</span><span class="mord mathnormal mtight">e</span><span class="mord mathnormal mtight" style="margin-right:0.10764em">f</span><span class="mord mathnormal mtight">ere</span><span class="mord mathnormal mtight">n</span><span class="mord mathnormal mtight">ces</span><span class="mord mathnormal mtight" style="margin-right:0.05764em">S</span><span class="mord mathnormal mtight">u</span><span class="mord mathnormal mtight">mma</span><span class="mord mathnormal mtight" style="margin-right:0.02778em">r</span><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight">es</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></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" style="margin-right:0.03588em">g</span><span class="mord mathnormal mtight" style="margin-right:0.02778em">r</span><span class="mord mathnormal mtight">a</span><span class="mord mtight"><span class="mord mathnormal mtight">m</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:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span><span class="mrel mtight">∈</span><span class="mord mathnormal mtight" style="margin-right:0.05764em">S</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.07153em">C</span><span class="mord mathnormal">o</span><span class="mord mathnormal">u</span><span class="mord mathnormal">n</span><span class="mord"><span class="mord mathnormal">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left: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">ma</span><span class="mord mathnormal mtight">t</span><span class="mord mathnormal mtight">c</span><span class="mord mathnormal mtight">h</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span><span class="mord mathnormal">a</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.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 class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1218em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><strong>ROUGE-L</strong>
最长公共子句longest common subsequence(LCS)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>R</mi><mrow><mi>l</mi><mi>c</mi><mi>s</mi></mrow></msub><mo>=</mo><mfrac><mrow><mi>L</mi><mi>C</mi><mi>S</mi><mo stretchy="false">(</mo><mi>X</mi><mo separator="true">,</mo><mi>Y</mi><mo stretchy="false">)</mo></mrow><mi>m</mi></mfrac><mo separator="true">,</mo><mi>m</mi><mo>=</mo><mi>l</mi><mi>e</mi><mi>n</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">R_{lcs}=\frac {LCS(X,Y)}{m} ,m=len(X)
</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.00773em">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0077em;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.01968em">l</span><span class="mord mathnormal mtight">cs</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:2.113em;vertical-align:-0.686em"></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.427em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">m</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">L</span><span class="mord mathnormal" style="margin-right:0.05764em">CS</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">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:1em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>P</mi><mrow><mi>l</mi><mi>c</mi><mi>s</mi></mrow></msub><mo>=</mo><mfrac><mrow><mi>L</mi><mi>C</mi><mi>S</mi><mo stretchy="false">(</mo><mi>X</mi><mo separator="true">,</mo><mi>Y</mi><mo stretchy="false">)</mo></mrow><mi>n</mi></mfrac><mo separator="true">,</mo><mi>n</mi><mo>=</mo><mi>l</mi><mi>e</mi><mi>n</mi><mo stretchy="false">(</mo><mi>Y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P_{lcs}=\frac {LCS(X,Y)}{n} ,n=len(Y)
</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">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:-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" style="margin-right:0.01968em">l</span><span class="mord mathnormal mtight">cs</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:2.113em;vertical-align:-0.686em"></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.427em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">n</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">L</span><span class="mord mathnormal" style="margin-right:0.05764em">CS</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">n</span><span 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.01968em">l</span><span class="mord mathnormal">e</span><span class="mord mathnormal">n</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>F</mi><mrow><mi>l</mi><mi>c</mi><mi>s</mi></mrow></msub><mo>=</mo><mfrac><mrow><mo stretchy="false">(</mo><mn>1</mn><mo>+</mo><msup><mi>β</mi><mn>2</mn></msup><mo stretchy="false">)</mo><msub><mi>R</mi><mrow><mi>l</mi><mi>c</mi><mi>s</mi></mrow></msub><msub><mi>P</mi><mrow><mi>l</mi><mi>c</mi><mi>s</mi></mrow></msub></mrow><mrow><msub><mi>R</mi><mrow><mi>l</mi><mi>c</mi><mi>s</mi></mrow></msub><mo>+</mo><msup><mi>β</mi><mn>2</mn></msup><msub><mi>P</mi><mrow><mi>l</mi><mi>c</mi><mi>s</mi></mrow></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">F_{lcs}=\frac{(1+\beta^2)R_{lcs}P_{lcs}}{R_{lcs}+\beta^2P_{lcs}}
</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.3361em"><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" style="margin-right:0.01968em">l</span><span class="mord mathnormal mtight">cs</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:2.3715em;vertical-align:-0.8804em"></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.4911em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0077em;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.01968em">l</span><span class="mord mathnormal mtight">cs</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 class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.989em;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></span></span></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.3361em"><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" style="margin-right:0.01968em">l</span><span class="mord mathnormal mtight">cs</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 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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mopen">(</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 class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</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">2</span></span></span></span></span></span></span></span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.00773em">R</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0077em;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.01968em">l</span><span class="mord mathnormal mtight">cs</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.13889em">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:-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" style="margin-right:0.01968em">l</span><span class="mord mathnormal mtight">cs</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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[交叉熵损失的反向传播]]></title>
        <id>/blog/2019/hexo-交叉熵损失的反向传播</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-交叉熵损失的反向传播"/>
        <updated>2019-10-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文详细推导了在多分类问题中，结合Softmax激活函数和交叉熵损失函数的反向传播过程。文章从定义Softmax和交叉熵损失开始，逐步计算了损失对网络输出的偏导，以及Softmax函数对其输入的偏导（雅可比矩阵）。最终通过链式法则，得出了一个简洁而优美的结论：损失对Softmax层输入的梯度等于模型的预测概率与真实标签之差（ŷ - y）。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="交叉熵损失的反向传播"><a href="#交叉熵损失的反向传播" class="rp-header-anchor rp-link" aria-hidden="true">#</a>交叉熵损失的反向传播<!-- --> </h1>
<p>对于一个单标签多分类问题,假设网络的输出层的输入为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>Z</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub><mo>=</mo><mo stretchy="false">[</mo><msub><mi>z</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>z</mi><mi>i</mi></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>z</mi><mi>n</mi></msub><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">Z_{in}=[z_1,\cdots,z_i,\cdots,z_n]</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.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">in</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"><span class="mord mathnormal" style="margin-right:0.04398em">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.044em;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="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" style="margin-right:0.04398em">z</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.044em;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="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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" style="margin-right:0.04398em">z</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.044em;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>,
输出为$\hat Y=[\hat y_1,\cdots,\hat y_i,\cdots,\hat y_n]$,
真实类标签为$Y = [y_1,\cdots,y_i,\cdots,y_n]$,$n$为类别数(输出层神经元数),通常有:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mover accent="true"><mi>Y</mi><mo>^</mo></mover><mo>=</mo><mi>S</mi><mi>o</mi><mi>f</mi><mi>t</mi><mi>m</mi><mi>a</mi><mi>x</mi><mo stretchy="false">(</mo><msub><mi>Z</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub><mo stretchy="false">)</mo></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(1)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">\hat Y = Softmax(Z_{in})\tag{1}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9468em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span></span><span style="top:-3.2523em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</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="mord mathnormal" style="margin-right:0.05764em">S</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ma</span><span class="mord mathnormal">x</span><span class="mopen">(</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.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">in</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></span><span class="tag"><span class="strut" style="height:1.1968em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">1</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub><mo>=</mo><mfrac><msup><mi>e</mi><msub><mi>z</mi><mi>i</mi></msub></msup><mrow><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mi>n</mi></munderover><msup><mi>e</mi><msub><mi>z</mi><mi>j</mi></msub></msup></mrow></mfrac></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(2)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">\hat y_i = \frac {e^{z_i}}{\sum_{j=0}^n e^{z_j}}\tag{2}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em"></span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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:2.4715em;vertical-align:-1.1301em"></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.3414em"><span style="top:-2.3057em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.8043em"><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><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 mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6065em"><span style="top:-3.0051em;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 class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.2819em"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal">e</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></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:1.1301em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span><span class="tag"><span class="strut" style="height:2.4715em;vertical-align:-1.1301em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">2</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>其中$Softmax$为:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mi>S</mi><mi>o</mi><mi>f</mi><mi>t</mi><mi>m</mi><mi>a</mi><mi>x</mi><mo stretchy="false">(</mo><msub><mi>Z</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">[</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><mfrac><msup><mi>e</mi><msub><mi>z</mi><mi>i</mi></msub></msup><mrow><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msup><mi>e</mi><msub><mi>z</mi><mi>j</mi></msub></msup></mrow></mfrac><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo stretchy="false">]</mo></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(3)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">Softmax(Z_{in}) = [\cdots,\frac {e^{z_i}}{\sum_{j=1}^n e^{z_j}},\cdots]\tag{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="mord mathnormal" style="margin-right:0.05764em">S</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="mord mathnormal">t</span><span class="mord mathnormal">ma</span><span class="mord mathnormal">x</span><span class="mopen">(</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.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">in</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><span 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:2.4715em;vertical-align:-1.1301em"></span><span class="mopen">[</span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3414em"><span style="top:-2.3057em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.8043em"><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><span class="mord mtight">1</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 mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6065em"><span style="top:-3.0051em;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 class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.2819em"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal">e</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></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:1.1301em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mclose">]</span></span><span class="tag"><span class="strut" style="height:2.4715em;vertical-align:-1.1301em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">3</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="交叉熵损失"><a href="#交叉熵损失" class="rp-header-anchor rp-link" aria-hidden="true">#</a>交叉熵损失</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mi>L</mi><mi>o</mi><mi>s</mi><mi>s</mi><mo stretchy="false">(</mo><mi>Y</mi><mo separator="true">,</mo><mover accent="true"><mi>Y</mi><mo>^</mo></mover><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msub><mi>y</mi><mi>i</mi></msub><mo>∗</mo><mi>ln</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub><mo stretchy="false">)</mo></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(4)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">Loss(Y,\hat Y) = -\sum_{i=1}^ny_i*\ln(\hat y_i)\tag{4}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1968em;vertical-align:-0.25em"></span><span class="mord mathnormal">L</span><span class="mord mathnormal">oss</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span></span><span style="top:-3.2523em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</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:2.9291em;vertical-align:-1.2777em"></span><span class="mord">−</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><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.03588em">y</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.0359em;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:1em;vertical-align:-0.25em"></span><span class="mop">ln</span><span class="mopen">(</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="tag"><span class="strut" style="height:2.9291em;vertical-align:-1.2777em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">4</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>损失对神经网络输出的偏导(<a href="https://www.vhcffh.com/2019/%E7%9F%A9%E9%98%B5%E4%B8%AD%E7%9A%84%E6%B1%82%E5%AF%BC/" target="_blank" rel="noopener noreferrer" class="rp-link">标量对向量求偏导</a>)为:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi><mi>o</mi><mi>s</mi><mi>s</mi><mo stretchy="false">(</mo><mi>Y</mi><mo separator="true">,</mo><mover accent="true"><mi>Y</mi><mo>^</mo></mover><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">∂</mi><mover accent="true"><mi>Y</mi><mo>^</mo></mover></mrow></mfrac><mo>=</mo><mo stretchy="false">[</mo><mo>−</mo><mfrac><msub><mi>y</mi><mn>1</mn></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub></mfrac><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><mo>−</mo><mfrac><msub><mi>y</mi><mi>i</mi></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub></mfrac><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><mo>−</mo><mfrac><msub><mi>y</mi><mi>n</mi></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub></mfrac><mo stretchy="false">]</mo><mstyle mathcolor="#cc0000"><mtext>\label</mtext></mstyle><mn>5</mn></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(5)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">\frac {\partial Loss(Y,\hat Y)}{\partial \hat Y} = [-\frac {y_1}{\hat y_1},\cdots,-\frac {y_i}{\hat y_i},\cdots,-\frac {y_n}{\hat y_n}]\label{5}\tag{5}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.4605em;vertical-align:-0.8368em"></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.6238em"><span style="top:-2.1632em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span></span><span style="top:-3.2523em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">L</span><span class="mord mathnormal">oss</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span></span><span style="top:-3.2523em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8368em"><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:1.988em;vertical-align:-0.8804em"></span><span class="mopen">[</span><span class="mord">−</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.1076em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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><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.1076em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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><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.1076em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">]</span><span class="mord text" style="color:#cc0000"><span class="mord" style="color:#cc0000">\label</span></span><span class="mord"><span class="mord">5</span></span></span><span class="tag"><span class="strut" style="height:2.5042em;vertical-align:-0.8804em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">5</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>后向传播推导中遇到的所有量都是变量,最终的目的是找到损失关于某变量的偏导,程序中也只用这个公式求得对应输入点的梯度</p>
<h2 class="rp-toc-include" id="softmax的偏导"><a href="#softmax的偏导" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Softmax的偏导</h2>
<p>求$\hat y_i​$对$z_i​$的偏导,根据{2}可得:</p>
<p>求$\hat Y$对$Z$的偏导(<a href="https://blog.vhcffh.com/hexo-ju-zhen-zhong-de-qiu-dao/" target="_blank" rel="noopener noreferrer" class="rp-link">向量对向量求导</a>)</p>
<p>这里把$y$的坐标写作$k$</p>
<p>$k=i$时:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>z</mi><mi>i</mi></msub></mrow></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msup><mi>e</mi><msub><mi>z</mi><mi>i</mi></msub></msup><mo>∗</mo><mfrac><mn>1</mn><mrow><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msup><mi>e</mi><msub><mi>z</mi><mi>j</mi></msub></msup></mrow></mfrac><mo>+</mo><msup><mi>e</mi><msub><mi>z</mi><mi>i</mi></msub></msup><mo>∗</mo><mo stretchy="false">(</mo><mo>−</mo><mfrac><mn>1</mn><mrow><mo stretchy="false">(</mo><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msup><mi>e</mi><msub><mi>z</mi><mi>j</mi></msub></msup><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow></mfrac><mo stretchy="false">)</mo><mo>∗</mo><msup><mi>e</mi><msub><mi>z</mi><mi>i</mi></msub></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><msup><mi>e</mi><msub><mi>z</mi><mi>i</mi></msub></msup><mrow><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msup><mi>e</mi><msub><mi>z</mi><mi>j</mi></msub></msup></mrow></mfrac><mo>−</mo><mo stretchy="false">(</mo><mfrac><msup><mi>e</mi><msub><mi>z</mi><mi>i</mi></msub></msup><mrow><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msup><mi>e</mi><msub><mi>z</mi><mi>j</mi></msub></msup></mrow></mfrac><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub><mo>−</mo><msubsup><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi><mn>2</mn></msubsup></mrow></mstyle></mtd></mtr></mtable></mtd><mtd width="50%"></mtd><mtd><mtext>(6)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{split}
\frac {\partial \hat y_i}{\partial z_i}
&amp;= e^{z_i} * \frac {1}{\sum_{j=1}^ne^{z_j}} +
   e^{z_i} * (-\frac {1}{(\sum_{j=1}^n e^{z_j})^2}) * e^{z_i} \cr
&amp;= \frac {e^{z_i}}{\sum_{j=1}^n e^{z_j}} - (\frac {e^{z_i}}{\sum_{j=1}^n e^{z_j}})^2 \cr
&amp;= \hat y_i - \hat y_i^2
\end{split}
\tag{6}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:7.0972em;vertical-align:-3.2986em"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.7986em"><span style="top:-5.7986em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</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.044em;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.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-3.0271em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"></span></span><span style="top:-0.7329em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.2986em"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.7986em"><span style="top:-5.7986em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord"><span class="mord mathnormal">e</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></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 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.3214em"><span style="top:-2.3057em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.8043em"><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><span class="mord mtight">1</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 mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6065em"><span style="top:-3.0051em;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 class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.2819em"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1301em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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"><span class="mord mathnormal">e</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></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 class="mopen">(</span><span class="mord">−</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.3214em"><span style="top:-2.3057em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mopen">(</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.8043em"><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><span class="mord mtight">1</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 mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6065em"><span style="top:-3.0051em;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 class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.2819em"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.989em;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></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1301em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></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 class="mord"><span class="mord mathnormal">e</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.0271em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></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.3414em"><span style="top:-2.3057em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.8043em"><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><span class="mord mtight">1</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 mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6065em"><span style="top:-3.0051em;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 class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.2819em"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal">e</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></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:1.1301em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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="mopen">(</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.3414em"><span style="top:-2.3057em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.8043em"><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><span class="mord mtight">1</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 mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6065em"><span style="top:-3.0051em;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 class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.2819em"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal">e</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></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:1.1301em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose"><span class="mclose">)</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">2</span></span></span></span></span></span></span></span></span></span><span style="top:-0.7329em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em"><span style="top:-2.453em;margin-left:-0.0359em;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 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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><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:3.2986em"><span></span></span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:7.0972em;vertical-align:-3.2986em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">6</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>$k \neq i$时:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>k</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>z</mi><mi>i</mi></msub></mrow></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msup><mi>e</mi><msub><mi>z</mi><mi>k</mi></msub></msup><mo>∗</mo><mo stretchy="false">(</mo><mo>−</mo><mfrac><mn>1</mn><mrow><mo stretchy="false">(</mo><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msup><mi>e</mi><msub><mi>z</mi><mi>j</mi></msub></msup><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow></mfrac><mo stretchy="false">)</mo><mo>∗</mo><msup><mi>e</mi><msub><mi>z</mi><mi>i</mi></msub></msup></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mo>−</mo><mfrac><mrow><msup><mi>e</mi><msub><mi>z</mi><mi>k</mi></msub></msup><mo>∗</mo><msup><mi>e</mi><msub><mi>z</mi><mi>i</mi></msub></msup></mrow><mrow><mo stretchy="false">(</mo><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msup><mi>e</mi><msub><mi>z</mi><mi>j</mi></msub></msup><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow></mfrac></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>k</mi></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub></mrow></mstyle></mtd></mtr></mtable></mtd><mtd width="50%"></mtd><mtd><mtext>(7)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{split}
\frac {\partial \hat y_k}{\partial z_i}
&amp;= e^{z_k} * (-\frac {1}{(\sum_{j=1}^n e^{z_j})^2}) * e^{z_i} \cr
&amp;= -\frac {e^{z_k}*e^{z_i}}{(\sum_{j=1}^n e^{z_j})^2} \cr
&amp;= - \hat y_k\hat y_i
\end{split}
\tag{7}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:7.0731em;vertical-align:-3.2865em"></span><span class="mord"><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.7865em"><span style="top:-5.7865em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</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.044em;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.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0359em;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 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-3.015em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"></span></span><span style="top:-0.7449em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.2865em"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.7865em"><span style="top:-5.7865em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord"><span class="mord mathnormal">e</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em"><span style="top:-2.3488em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em"><span></span></span></span></span></span></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 class="mopen">(</span><span class="mord">−</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.3214em"><span style="top:-2.3057em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mopen">(</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.8043em"><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><span class="mord mtight">1</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 mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6065em"><span style="top:-3.0051em;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 class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.2819em"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.989em;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></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1301em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></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 class="mord"><span class="mord mathnormal">e</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.015em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord">−</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.3414em"><span style="top:-2.3057em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mopen">(</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.8043em"><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><span class="mord mtight">1</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 mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6065em"><span style="top:-3.0051em;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 class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.2819em"><span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7401em"><span style="top:-2.989em;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></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal">e</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em"><span style="top:-2.3488em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1512em"><span></span></span></span></span></span></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 class="mord"><span class="mord mathnormal">e</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:-0.044em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></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:1.1301em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-0.7449em"><span class="pstrut" style="height:3.3714em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0359em;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 class="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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.2865em"><span></span></span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:7.0731em;vertical-align:-3.2865em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">7</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>写成矩阵:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><mover accent="true"><mi>Y</mi><mo>^</mo></mover></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>Z</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub></mrow></mfrac><mo>=</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center center center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><mo>−</mo><msubsup><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn><mn>2</mn></msubsup></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub><mo>−</mo><msubsup><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn><mn>2</mn></msubsup></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi mathvariant="normal">⋮</mi><mpadded height="0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi mathvariant="normal">⋮</mi><mpadded height="0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋱</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi mathvariant="normal">⋮</mi><mpadded height="0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub><mo>−</mo><msubsup><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi><mn>2</mn></msubsup></mrow></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(8)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">\frac {\partial \hat Y}{\partial Z_{in}} = 
\begin{bmatrix}
\hat y_1-\hat y_1^2 &amp; -\hat y_2\hat y_1 &amp; \cdots &amp; -\hat y_n\hat y_1\cr
-\hat y_1\hat y_2 &amp; \hat y_2-\hat y_2^2 &amp; \cdots &amp; -\hat y_n\hat y_2\cr
\vdots &amp; \vdots &amp; \ddots &amp; \vdots\cr
-\hat y_1\hat y_n &amp; -\hat y_2\hat y_n &amp; \cdots &amp; \hat y_n-\hat y_n^2\cr
\end{bmatrix}\tag{8}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.4598em;vertical-align:-0.836em"></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.6238em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</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.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">in</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 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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span></span><span style="top:-3.2523em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</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.836em"><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:5.46em;vertical-align:-2.48em"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.95em"><span style="top:-4.95em"><span class="pstrut" style="height:7.4em"></span><span style="width:0.667em;height:5.400em"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="5.400em" viewBox="0 0 667 5400"><path d="M403 1759 V84 H666 V0 H319 V1759 v1800 v1759 h347 v-84
H403z M403 1759 V0 H319 V1759 v1800 v1759 h84z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.45em"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.98em"><span style="top:-5.8275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141em"><span style="top:-2.4519em;margin-left:-0.0359em;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 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">2</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 style="top:-4.6275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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:-2.7675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0em;border-top-width:1.5em;bottom:0em"></span></span></span></span><span style="top:-1.5675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.48em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.98em"><span style="top:-5.8275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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:-4.6275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141em"><span style="top:-2.4519em;margin-left:-0.0359em;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 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">2</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 style="top:-2.7675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0em;border-top-width:1.5em;bottom:0em"></span></span></span></span><span style="top:-1.5675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.48em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.98em"><span style="top:-5.64em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span><span style="top:-4.44em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span><span style="top:-2.58em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋱</span></span></span><span style="top:-1.38em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.48em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.98em"><span style="top:-5.8275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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:-4.6275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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:-2.7675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0em;border-top-width:1.5em;bottom:0em"></span></span></span></span><span style="top:-1.5675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141em"><span style="top:-2.453em;margin-left:-0.0359em;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 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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><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:2.48em"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.95em"><span style="top:-4.95em"><span class="pstrut" style="height:7.4em"></span><span style="width:0.667em;height:5.400em"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="5.400em" viewBox="0 0 667 5400"><path d="M347 1759 V0 H0 V84 H263 V1759 v1800 v1759 H0 v84 H347z
M347 1759 V0 H263 V1759 v1800 v1759 h84z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.45em"><span></span></span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:5.46em;vertical-align:-2.48em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">8</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>这是一个对称矩阵,在链式求导时加不加转置都一样</p>
<p>根据(5)和(8),损失$L$对输入$Z$的偏导(<a href="https://blog.vhcffh.com/hexo-ju-zhen-zhong-de-qiu-dao/" target="_blank" rel="noopener noreferrer" class="rp-link">标量对向量求偏导</a>):</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd class="mtr-glue"></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi><mo stretchy="false">(</mo><mi>Y</mi><mo separator="true">,</mo><mover accent="true"><mi>Y</mi><mo>^</mo></mover><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">∂</mi><mi>Z</mi></mrow></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi><mo stretchy="false">(</mo><mi>Y</mi><mo separator="true">,</mo><mover accent="true"><mi>Y</mi><mo>^</mo></mover><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">∂</mi><mover accent="true"><mi>Y</mi><mo>^</mo></mover></mrow></mfrac><mo stretchy="false">(</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mover accent="true"><mi>Y</mi><mo>^</mo></mover></mrow><mrow><mi mathvariant="normal">∂</mi><mi>Z</mi></mrow></mfrac><msup><mo stretchy="false">)</mo><mi>T</mi></msup></mrow></mstyle></mtd><mtd class="mtr-glue"></mtd><mtd class="mml-eqn-num"></mtd></mtr><mtr><mtd class="mtr-glue"></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mo stretchy="false">[</mo><mo>−</mo><mfrac><msub><mi>y</mi><mn>1</mn></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub></mfrac><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><mo>−</mo><mfrac><msub><mi>y</mi><mi>i</mi></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>i</mi></msub></mfrac><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><mo>−</mo><mfrac><msub><mi>y</mi><mi>n</mi></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub></mfrac><mo stretchy="false">]</mo><msup><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center center center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><mo>−</mo><msubsup><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn><mn>2</mn></msubsup></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub><mo>−</mo><msubsup><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn><mn>2</mn></msubsup></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi mathvariant="normal">⋮</mi><mpadded height="0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi mathvariant="normal">⋮</mi><mpadded height="0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋱</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi mathvariant="normal">⋮</mi><mpadded height="0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mo>−</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub><mo>−</mo><msubsup><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi><mn>2</mn></msubsup></mrow></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow><mi>T</mi></msup></mrow></mstyle></mtd><mtd class="mtr-glue"></mtd><mtd class="mml-eqn-num"></mtd></mtr><mtr><mtd class="mtr-glue"></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mo stretchy="false">[</mo><mo stretchy="false">(</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><msub><mi>y</mi><mn>1</mn></msub><mo>+</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><msub><mi>y</mi><mn>2</mn></msub><mo>+</mo><mo>⋯</mo><mo>+</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><msub><mi>y</mi><mi>n</mi></msub><mo separator="true">,</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub><msub><mi>y</mi><mn>1</mn></msub><mo>+</mo><mo stretchy="false">(</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>2</mn></msub><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo><msub><mi>y</mi><mn>2</mn></msub><mo>+</mo><mo>⋯</mo><mo>+</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><msub><mi>y</mi><mi>n</mi></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo stretchy="false">]</mo></mrow></mstyle></mtd><mtd class="mtr-glue"></mtd><mtd class="mml-eqn-num"></mtd></mtr><mtr><mtd class="mtr-glue"></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mo stretchy="false">[</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msub><mi>y</mi><mi>i</mi></msub><mo>−</mo><msub><mi>y</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>j</mi></msub><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msub><mi>y</mi><mi>i</mi></msub><mo>−</mo><msub><mi>y</mi><mi>j</mi></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msub><mi>y</mi><mi>i</mi></msub><mo>−</mo><msub><mi>y</mi><mi>n</mi></msub><mo stretchy="false">]</mo></mrow></mstyle></mtd><mtd class="mtr-glue"></mtd><mtd class="mml-eqn-num"></mtd></mtr><mtr><mtd class="mtr-glue"></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mo stretchy="false">[</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mn>1</mn></msub><mo>−</mo><msub><mi>y</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>j</mi></msub><mo>−</mo><msub><mi>y</mi><mi>j</mi></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mover accent="true"><mi>y</mi><mo>^</mo></mover><mi>n</mi></msub><mo>−</mo><msub><mi>y</mi><mi>n</mi></msub><mo stretchy="false">]</mo><mtext>    </mtext><mo stretchy="false">(</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><msub><mi>y</mi><mi>i</mi></msub><mo>=</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></mstyle></mtd><mtd class="mtr-glue"></mtd><mtd class="mml-eqn-num"></mtd></mtr><mtr><mtd class="mtr-glue"></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mover accent="true"><mi>Y</mi><mo>^</mo></mover><mo>−</mo><mi>Y</mi></mrow></mstyle></mtd><mtd class="mtr-glue"></mtd><mtd class="mml-eqn-num"></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{align}
\frac {\partial L(Y,\hat Y)}{\partial Z}
&amp;= \frac {\partial L(Y,\hat Y)}{\partial \hat Y} (\frac {\partial \hat Y}{\partial Z})^T\cr
&amp;= [-\frac {y_1}{\hat y_1},\cdots,-\frac {y_i}{\hat y_i},\cdots,-\frac {y_n}{\hat y_n}]
\begin{bmatrix}
\hat y_1-\hat y_1^2 &amp; -\hat y_2\hat y_1 &amp; \cdots &amp; -\hat y_n\hat y_1\cr
-\hat y_1\hat y_2 &amp; \hat y_2-\hat y_2^2 &amp; \cdots &amp; -\hat y_n\hat y_2\cr
\vdots &amp; \vdots &amp; \ddots &amp; \vdots\cr
-\hat y_1\hat y_n &amp; -\hat y_2\hat y_n &amp; \cdots &amp; \hat y_n-\hat y_n^2\cr
\end{bmatrix}^T\cr
&amp;= [(\hat y_1-1)y_1+\hat y_1y_2+\cdots+\hat y_1y_n,\hat y_2y_1+(\hat y_2-1)y_2+\cdots+\hat y_1y_n,\cdots]\cr
&amp;= [\hat y_1\sum_{i=1}^ny_i-y_1,\cdots,\hat y_j\sum_{i=1}^ny_i-y_j,\cdots,\hat y_n\sum_{i=1}^ny_i-y_n]\cr
&amp;= [\hat y_1-y_1,\cdots,\hat y_j-y_j,\cdots,\hat y_n-y_n]\ \ \ \ (\sum_{i=1}^ny_i=1)\cr
&amp;= \hat Y-Y
\end{align}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:18.3167em;vertical-align:-8.9083em"></span><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:9.4083em"><span style="top:-12.9958em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"><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.6238em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.07153em">Z</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span></span><span style="top:-3.2523em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-8.6478em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"></span></span><span style="top:-5.0278em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"></span></span><span style="top:-2.7164em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"></span></span><span style="top:0.5127em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"></span></span><span style="top:3.0371em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:8.9083em"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:9.4083em"><span style="top:-12.9958em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></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.6238em"><span style="top:-2.1632em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span></span><span style="top:-3.2523em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span></span><span style="top:-3.2523em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8368em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mopen">(</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.6238em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.07153em">Z</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span></span><span style="top:-3.2523em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</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.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em"><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 mathnormal mtight" style="margin-right:0.13889em">T</span></span></span></span></span></span></span></span></span></span><span style="top:-8.6478em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mopen">[</span><span class="mord">−</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.1076em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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><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.1076em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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><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.1076em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">]</span><span class="mspace" style="margin-right:0.1667em"></span><span class="minner"><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.95em"><span style="top:-4.95em"><span class="pstrut" style="height:7.4em"></span><span style="width:0.667em;height:5.400em"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="5.400em" viewBox="0 0 667 5400"><path d="M403 1759 V84 H666 V0 H319 V1759 v1800 v1759 h347 v-84
H403z M403 1759 V0 H319 V1759 v1800 v1759 h84z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.45em"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.98em"><span style="top:-5.8275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141em"><span style="top:-2.4519em;margin-left:-0.0359em;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 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">2</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 style="top:-4.6275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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:-2.7675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0em;border-top-width:1.5em;bottom:0em"></span></span></span></span><span style="top:-1.5675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.48em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.98em"><span style="top:-5.8275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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:-4.6275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141em"><span style="top:-2.4519em;margin-left:-0.0359em;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 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">2</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 style="top:-2.7675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0em;border-top-width:1.5em;bottom:0em"></span></span></span></span><span style="top:-1.5675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.48em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.98em"><span style="top:-5.64em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span><span style="top:-4.44em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span><span style="top:-2.58em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋱</span></span></span><span style="top:-1.38em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.48em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.98em"><span style="top:-5.8275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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:-4.6275em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord">−</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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:-2.7675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0em;border-top-width:1.5em;bottom:0em"></span></span></span></span><span style="top:-1.5675em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8141em"><span style="top:-2.453em;margin-left:-0.0359em;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 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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><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:2.48em"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.95em"><span style="top:-4.95em"><span class="pstrut" style="height:7.4em"></span><span style="width:0.667em;height:5.400em"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="5.400em" viewBox="0 0 667 5400"><path d="M347 1759 V0 H0 V84 H263 V1759 v1800 v1759 H0 v84 H347z
M347 1759 V0 H263 V1759 v1800 v1759 h84z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.45em"><span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:3.2112em"><span style="top:-5.4329em;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.13889em">T</span></span></span></span></span></span></span></span></span></span><span style="top:-5.0278em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mopen">[(</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord">1</span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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 class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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.03588em">y</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.0359em;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 class="minner">⋯</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 class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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.03588em">y</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.0359em;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="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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 class="mopen">(</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord">1</span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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 class="minner">⋯</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 class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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.03588em">y</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.0359em;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="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="mclose">]</span></span></span><span style="top:-2.7164em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mopen">[</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><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.03588em">y</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.0359em;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 class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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="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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><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.03588em">y</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.0359em;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 class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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 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="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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><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.03588em">y</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.0359em;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 class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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 style="top:0.5127em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mopen">[</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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="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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 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 class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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 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="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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="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.0359em;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 class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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 class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mopen">(</span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><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.03588em">y</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.0359em;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 class="mord">1</span><span class="mclose">)</span></span></span><span style="top:3.0371em"><span class="pstrut" style="height:5.2112em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9468em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span></span><span style="top:-3.2523em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</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 class="mord mathnormal" style="margin-right:0.22222em">Y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:8.9083em"><span></span></span></span></span></span></span></span><span class="tag"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:9.4083em"><span style="top:-12.9958em"><span class="pstrut" style="height:5.2112em"></span><span class="eqn-num"></span></span><span style="top:-8.6478em"><span class="pstrut" style="height:5.2112em"></span><span class="eqn-num"></span></span><span style="top:-5.0278em"><span class="pstrut" style="height:5.2112em"></span><span class="eqn-num"></span></span><span style="top:-2.7164em"><span class="pstrut" style="height:5.2112em"></span><span class="eqn-num"></span></span><span style="top:0.5127em"><span class="pstrut" style="height:5.2112em"></span><span class="eqn-num"></span></span><span style="top:3.0371em"><span class="pstrut" style="height:5.2112em"></span><span class="eqn-num"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:8.9083em"><span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[矩阵中的求导]]></title>
        <id>/blog/2019/hexo-矩阵中的求导</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-矩阵中的求导"/>
        <updated>2019-10-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文简要介绍了矩阵微积分中的两种基本求导运算。第一种是标量对向量求导，其结果是一个行向量，包含了该标量对向量中每个元素求偏导数的值。第二种是向量对向量求导，其结果是一个雅可比（Jacobian）矩阵，矩阵的每一列是输出向量中的一个分量对输入向量求导的结果。文章明确了求导结果的维度和布局约定。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="矩阵中的求导"><a href="#矩阵中的求导" class="rp-header-anchor rp-link" aria-hidden="true">#</a>矩阵中的求导<!-- --> </h1>
<h3 class="rp-toc-include" id="标量对向量求导"><a href="#标量对向量求导" class="rp-header-anchor rp-link" aria-hidden="true">#</a>标量对向量求导</h3>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>y</mi><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">y = f(x_1,\cdots,x_i,\cdots,x_n)
</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 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="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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="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">x</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="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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">x</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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>X</mi><mo>=</mo><mo stretchy="false">[</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">X = [x_1,\cdots,x_i,\cdots,x_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.07847em">X</span><span 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">x</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="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">x</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="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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">x</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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>y</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>X</mi></mrow></mfrac><mo>=</mo><mo stretchy="false">[</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>f</mi></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>f</mi></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>x</mi><mi>i</mi></msub></mrow></mfrac><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>f</mi></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>x</mi><mi>n</mi></msub></mrow></mfrac><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">\frac {\partial y}{\partial X} = [\frac {\partial f}{\partial x_1},\cdots,\frac {\partial f}{\partial x_i},\cdots,\frac {\partial f}{\partial x_n}]
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.0574em;vertical-align:-0.686em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.07847em">X</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><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:2.2074em;vertical-align:-0.836em"></span><span class="mopen">[</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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal">x</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.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.10764em">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal">x</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.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.10764em">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal">x</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 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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.10764em">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">]</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="向量对向量求导"><a href="#向量对向量求导" class="rp-header-anchor rp-link" aria-hidden="true">#</a>向量对向量求导</h3>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>Y</mi><mo>=</mo><mo stretchy="false">[</mo><msub><mi>f</mi><mn>1</mn></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>f</mi><mi>i</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>f</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">Y = [f_1(x_1,\cdots,x_i,\cdots,x_n),\cdots,
f_i(x_1,\cdots,x_i,\cdots,x_n),\cdots,
f_m(x_1,\cdots,x_i,\cdots,x_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.22222em">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:1em;vertical-align:-0.25em"></span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em">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.1076em;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="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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="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">x</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="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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">x</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 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="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" style="margin-right:0.10764em">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.1076em;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">x</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="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">x</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="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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">x</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 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="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" style="margin-right:0.10764em">f</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.1076em;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="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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="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">x</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="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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">x</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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>X</mi><mo>=</mo><mo stretchy="false">[</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><msub><mi>x</mi><mi>n</mi></msub><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">X = [x_1,\cdots,x_i,\cdots,x_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.07847em">X</span><span 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">x</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="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">x</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="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></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">x</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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>Y</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>X</mi></mrow></mfrac><mo>=</mo><mrow><mo fence="true">[</mo><mtable rowspacing="0.16em" columnalign="center center center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>f</mi><mn>1</mn></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>f</mi><mn>2</mn></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>f</mi><mi>m</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>f</mi><mn>1</mn></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>x</mi><mn>2</mn></msub></mrow></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>f</mi><mn>2</mn></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>x</mi><mn>2</mn></msub></mrow></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>f</mi><mi>m</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi mathvariant="normal">⋮</mi><mpadded height="0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi mathvariant="normal">⋮</mi><mpadded height="0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋱</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi mathvariant="normal">⋮</mi><mpadded height="0em" voffset="0em"><mspace mathbackground="black" width="0em" height="1.5em"></mspace></mpadded></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>f</mi><mn>1</mn></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>x</mi><mi>n</mi></msub></mrow></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mo lspace="0em" rspace="0em">⋯</mo></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>f</mi><mi>m</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>x</mi><mi>n</mi></msub></mrow></mfrac></mstyle></mtd></mtr></mtable><mo fence="true">]</mo></mrow></mrow><annotation encoding="application/x-tex">\frac {\partial Y}{\partial X} = 
\begin{bmatrix}
\frac {\partial f_1}{\partial x_1} &amp; \frac {\partial f_2}{\partial x_1} &amp; \cdots &amp; \frac {\partial f_m}{\partial x_1}\cr
\frac {\partial f_1}{\partial x_2} &amp; \frac {\partial f_2}{\partial x_2} &amp; \cdots &amp; \frac {\partial f_m}{\partial x_1}\cr
\vdots &amp; \vdots &amp; \ddots &amp; \vdots\cr
\frac {\partial f_1}{\partial x_n} &amp; \cdots &amp; \cdots &amp; \frac {\partial f_m}{\partial x_n}\cr
\end{bmatrix}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.0574em;vertical-align:-0.686em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.07847em">X</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><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:6em;vertical-align:-2.75em"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.25em"><span style="top:-5.25em"><span class="pstrut" style="height:8em"></span><span style="width:0.667em;height:6.000em"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="6.000em" viewBox="0 0 667 6000"><path d="M403 1759 V84 H666 V0 H319 V1759 v2400 v1759 h347 v-84
H403z M403 1759 V0 H319 V1759 v2400 v1759 h84z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.75em"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.246em"><span style="top:-6.0013em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><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.9322em"><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" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3173em"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.4461em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3173em"><span style="top:-2.357em;margin-left:-0.1076em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.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.4451em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-4.6239em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><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.9322em"><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" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3173em"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.4461em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3173em"><span style="top:-2.357em;margin-left:-0.1076em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.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.4451em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-2.6788em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0em;border-top-width:1.5em;bottom:0em"></span></span></span></span><span style="top:-1.3866em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><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.9322em"><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" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight">x</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:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.4461em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3173em"><span style="top:-2.357em;margin-left:-0.1076em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.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.4451em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.746em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.246em"><span style="top:-6.0013em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><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.9322em"><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" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3173em"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.4461em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3173em"><span style="top:-2.357em;margin-left:-0.1076em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.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.4451em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-4.6239em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><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.9322em"><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" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3173em"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.4461em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3173em"><span style="top:-2.357em;margin-left:-0.1076em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.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.4451em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-2.6788em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0em;border-top-width:1.5em;bottom:0em"></span></span></span></span><span style="top:-1.3866em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="minner">⋯</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.746em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.246em"><span style="top:-5.8138em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span><span style="top:-4.4364em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span><span style="top:-2.4913em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋱</span></span></span><span style="top:-1.1991em"><span class="pstrut" style="height:3.5em"></span><span class="mord"><span class="minner">⋯</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.746em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.246em"><span style="top:-6.0013em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><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.9322em"><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" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3173em"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.4461em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em">f</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.1076em;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.4451em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-4.6239em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><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.9322em"><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" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3173em"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.4461em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em">f</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.1076em;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.4451em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-2.6788em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><span class="mord"><span class="mord">⋮</span><span class="mord rule" style="border-right-width:0em;border-top-width:1.5em;bottom:0em"></span></span></span></span><span style="top:-1.3866em"><span class="pstrut" style="height:3.6875em"></span><span class="mord"><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.9322em"><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" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight">x</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:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.143em"><span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.4461em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight" style="margin-right:0.05556em">∂</span><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.10764em">f</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.1076em;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.4451em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.746em"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.25em"><span style="top:-5.25em"><span class="pstrut" style="height:8em"></span><span style="width:0.667em;height:6.000em"><svg xmlns="http://www.w3.org/2000/svg" width="0.667em" height="6.000em" viewBox="0 0 667 6000"><path d="M347 1759 V0 H0 V84 H263 V1759 v2400 v1759 H0 v84 H347z
M347 1759 V0 H263 V1759 v2400 v1759 h84z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.75em"><span></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>这是一个n行m列的矩阵,有时也会写成m行n列,都是一样的,区别在于加不加转置</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[nvidia显卡驱动错误]]></title>
        <id>/blog/2019/hexo-nvidia显卡驱动错误</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-nvidia显卡驱动错误"/>
        <updated>2019-09-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了一次解决Linux系统下Nvidia显卡驱动错误的经历。在使用`bumblebee`进行双显卡切换时，`optirun`命令报错“Failed to load module "nouveau"”。作者通过修改`/etc/bumblebee/xorg.conf.nouveau`文件，取消对`BusID`的注释并正确指定显卡PCI地址，最终成功禁用了nouveau开源驱动，并加载了nvidia专有驱动。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="nvidia显卡驱动错误"><a href="#nvidia显卡驱动错误" class="rp-header-anchor rp-link" aria-hidden="true">#</a>nvidia显卡驱动错误<!-- --> </h1>
<p>系统使用<code>bumblebee</code>实现双显卡(N卡和集成显卡)切换，<br/>
同时有N卡的开源驱动nouveau和专有显卡驱动nvidia</p>
<p>使用命令</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>optirun glxspheres64</span></span>
<span class="line"><span># 或者optirun glxspher</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>出现错误<code>[XORG] (EE) Failed to load module &quot;nouveau&quot;</code><br/>
通过命令<code>lsmod |grep nouveau</code><br/>
显示模块已经加载</p>
<p>通过<code>/etc/modprobe.d/blacklist.conf</code>文件禁用<code>nouveau</code>(需要重建内核<code>mkinitcpio -P</code>并重启),但<code>nouveau</code>驱动仍然加载了，<code>nvidia</code>未加载</p>
<p>解决方法修改文件<code>/etc/bumblebee/xorg.conf.nouveau</code><br/>
去掉<code>BusID &quot;PCI:01:00:0&quot;</code>的注释<br/>
<code>PCI:01:00:0</code>通过命令<code>lspci | egrep (3D|VGA)</code></p>
<p>重启后<code>nvidia</code>驱动加载成功,<code>nouveau</code>没有加载</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[基于统计的分词方法]]></title>
        <id>/blog/2019/hexo-基于统计的分词方法</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-基于统计的分词方法"/>
        <updated>2019-09-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文主要介绍了基于统计的中文分词方法。首先讲解了N-gram语言模型（一元、二元、三元）的基本原理。接着，重点阐述了隐马尔可夫模型（HMM）在分词中的应用，详细定义了HMM的五个核心参数，并概述了其三大基本问题：概率计算、学习问题和解码问题，以及对应的算法（前向后向、鲍姆-韦尔奇、维特比），最后还对比了HMM、MEMM和CRF模型的特点。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="基于统计的分词方法"><a href="#基于统计的分词方法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>基于统计的分词方法<!-- --> </h1>
<h2 class="rp-toc-include" id="1n元语言模型n-gram"><a href="#1n元语言模型n-gram" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.n元语言模型(n-gram)</h2>
<p>假设$S$表示长度为$i$，由$(w_1,w_2,\dots,w_m)$字序列组成的句子，则代表$S​$的概率为：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>P</mi><mo stretchy="false">(</mo><mi>S</mi><mo stretchy="false">)</mo><mo>=</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>w</mi><mi>m</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>∗</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>2</mn></msub><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>∗</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>3</mn></msub><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>⋯</mo><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>w</mi><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(S) = P(w_1,w_2,\dots,w_m) = P(w_1)*P(w_2|w_1)*P(w_3|w_2,w_1)\cdots P(w_i|w_1,w_2,\dots,w_{m-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.13889em">P</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05764em">S</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="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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" style="margin-right:0.02691em">w</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.0269em;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="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" style="margin-right:0.02691em">w</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.0269em;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 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.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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="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="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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="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="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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 class="mord">∣</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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 class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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="mclose">)</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 mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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" style="margin-right:0.02691em">w</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.0269em;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="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" style="margin-right:0.02691em">w</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.0269em;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">m</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></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ul>
<li>$n=1$,uni-gram</li>
</ul>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>w</mi><mi>m</mi></msub><mo stretchy="false">)</mo><mo>=</mo><munderover><mo>∏</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(w_1,w_2,\dots,w_m) =\prod_{i=1}^mP(w_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="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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" style="margin-right:0.02691em">w</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.0269em;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="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" style="margin-right:0.02691em">w</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.0269em;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 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:2.9291em;vertical-align:-1.2777em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ul>
<li>$n=2$,bi-gram</li>
</ul>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>w</mi><mi>m</mi></msub><mo stretchy="false">)</mo><mo>=</mo><munderover><mo>∏</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(w_1,w_2,\dots,w_m) =\prod_{i=1}^mP(w_i|w_{i-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.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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" style="margin-right:0.02691em">w</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.0269em;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="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" style="margin-right:0.02691em">w</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.0269em;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 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:2.9291em;vertical-align:-1.2777em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ul>
<li>$n=3$,tri-gram</li>
</ul>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>w</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>w</mi><mi>m</mi></msub><mo stretchy="false">)</mo><mo>=</mo><munderover><mo>∏</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><mi>P</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mrow><mi>i</mi><mo>−</mo><mn>2</mn></mrow></msub><msub><mi>w</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(w_1,w_2,\dots,w_m) =\prod_{i=1}^mP(w_i|w_{i-2}w_{i-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.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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" style="margin-right:0.02691em">w</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.0269em;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="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" style="margin-right:0.02691em">w</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.0269em;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 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:2.9291em;vertical-align:-1.2777em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∏</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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">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 class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="2基于hmm的分词"><a href="#2基于hmm的分词" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.基于HMM的分词</h2>
<p><strong>HMM的参数</strong></p>
<p>观测序列(输出状态序列),状态序列(隐藏状态序列),初始概率,转移概率(转移概率矩阵),发射概率(发射概率矩阵)
<img src="/static/image/9_8_ma.6e0d7bb0f1.png"/></p>
<p><strong>数学定义</strong></p>
<p>状态值集合(隐藏状态):$Q={q_1,q_2,\cdots,q_N}$,$N$为可能的状态数,对应状态序列$I​$</p>
<p>观测值集合(输出状态):$V={v_1,v_2,\cdots,v_M}$,$M$为可能的观测数,对应观测序列$O$</p>
<p>转移概率矩阵:$A=[a*{ij}];i,j\in{1,2,\cdots,N}$,从$i$状态到$j$状态的转换概率($\sum*{j=1}^Na_{ij}=1$)</p>
<p>发射概率矩阵(观测概率矩阵):$B=[b_j(k)];j\in{1,2,\cdots,N},k\in{1,2,\cdots,M}$,从状态$j$生成观测$k$的概率</p>
<p>初始状态分布:$\pi$</p>
<p>模型:$\lambda=(A,B,\lambda)$,状态序列$I$,观测序列$O$</p>
<p><strong>HMM中的三个问题:</strong></p>
<ul>
<li>
<p>概率计算问题:已知模型,求观测序列$O$出现的概率;前向后向算法\</p>
</li>
<li>
<p>学习问题:已知观测序列,求模型参数,最大化$P(O|\lambda)$;鲍姆-韦尔奇(Baum-Welch)算法</p>
<ul>
<li>
<p>已知隐藏序列和观测序列(通过频数估计)</p>
<p>$A_{ij}$表示隐藏状态$q_i$转移到$q_j$的频率计数</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>A</mi><mo>=</mo><mo stretchy="false">[</mo><msub><mi>a</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mo stretchy="false">]</mo><mo separator="true">;</mo><msub><mi>a</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mo>=</mo><mfrac><msub><mi>A</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mrow><munderover><mo>∑</mo><mrow><mi>s</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><msub><mi>A</mi><mrow><mi>i</mi><mi>s</mi></mrow></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">A=[a_{ij}];a_{ij}=\frac{A_{ij}}{\sum_{s=1}^NA_{is}}
</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.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.0361em;vertical-align:-0.2861em"></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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em">ij</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mclose">]</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.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" style="margin-right:0.05724em">ij</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:2.5313em;vertical-align:-1.1709em"></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.3603em"><span style="top:-2.1288em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.9812em"><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">s</span><span class="mrel mtight">=</span><span class="mord mtight">1</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 mathnormal mtight" style="margin-right:0.10903em">N</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 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 mtight"><span class="mord mathnormal mtight">i</span><span class="mord mathnormal mtight">s</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 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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em">ij</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1709em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>$B_{jk}$表示隐藏状态$q_j$转移到观测状态$v_k$的频率计数</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>B</mi><mo>=</mo><mo stretchy="false">[</mo><msub><mi>b</mi><mi>j</mi></msub><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo><mo separator="true">;</mo><msub><mi>b</mi><mi>j</mi></msub><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><msub><mi>B</mi><mrow><mi>j</mi><mi>k</mi></mrow></msub><mrow><munderover><mo>∑</mo><mrow><mi>s</mi><mo>=</mo><mn>1</mn></mrow><mi>M</mi></munderover><msub><mi>B</mi><mrow><mi>j</mi><mi>s</mi></mrow></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">B=[b_j(k)];b_j(k)=\frac{B_{jk}}{\sum_{s=1}^MB_{js}}
</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.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:1.0361em;vertical-align:-0.2861em"></span><span class="mopen">[</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.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" 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 class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03148em">k</span><span class="mclose">)]</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em"></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.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" 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 class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03148em">k</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:2.5313em;vertical-align:-1.1709em"></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.3603em"><span style="top:-2.1288em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.9812em"><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">s</span><span class="mrel mtight">=</span><span class="mord mtight">1</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 mathnormal mtight" style="margin-right:0.10903em">M</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 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" style="margin-right:0.05724em">j</span><span class="mord mathnormal mtight">s</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.3361em"><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" style="margin-right:0.03148em">jk</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1709em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>$C(i)$为所有样本中初始隐藏状态$q_j$的频率计数</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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 mathvariant="normal">Π</mi><mo>=</mo><mi>π</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><mi>C</mi><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow><mrow><munderover><mo>∑</mo><mrow><mi>s</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mi>C</mi><mo stretchy="false">(</mo><mi>s</mi><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">\Pi = \pi(i)=\frac{C(i)}{\sum_{s=1}^NC(s)}
</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">Π</span><span 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.03588em">π</span><span class="mopen">(</span><span class="mord mathnormal">i</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:2.5979em;vertical-align:-1.1709em"></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.427em"><span style="top:-2.1288em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.9812em"><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">s</span><span class="mrel mtight">=</span><span class="mord mtight">1</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 mathnormal mtight" style="margin-right:0.10903em">N</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 mathnormal" style="margin-right:0.07153em">C</span><span class="mopen">(</span><span class="mord mathnormal">s</span><span class="mclose">)</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07153em">C</span><span class="mopen">(</span><span class="mord mathnormal">i</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1709em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>仅知观测序列(鲍姆-韦尔奇算法,EM算法)</p>
<p>EM算法:最大似然估计用于没有隐变量的概率模型,EM算法可以用于有隐变量的算法模型</p>
<p>模型参数:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>λ</mi><mo stretchy="true">‾</mo></mover><mo>=</mo><mi>a</mi><mi>r</mi><mi>g</mi><mtext>  </mtext><munder><mrow><mi>max</mi><mo>⁡</mo></mrow><mi>λ</mi></munder><munder><mo>∑</mo><mi>I</mi></munder><mi>P</mi><mo stretchy="false">(</mo><mi>I</mi><mi mathvariant="normal">∣</mi><mi>O</mi><mo separator="true">,</mo><mover accent="true"><mi>λ</mi><mo stretchy="true">‾</mo></mover><mo stretchy="false">)</mo><mi>l</mi><mi>o</mi><mi>g</mi><mi>P</mi><mo stretchy="false">(</mo><mi>O</mi><mo separator="true">,</mo><mi>I</mi><mi mathvariant="normal">∣</mi><mi>λ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\overline{\lambda} = arg\;\max_{\lambda}\sum\limits_{I}P(I|O,\overline{\lambda})logP(O,I|\lambda)
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8944em"></span><span class="mord overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">λ</span></span></span><span style="top:-3.8144em"><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:2.3443em;vertical-align:-1.2943em"></span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.4306em"><span style="top:-2.3479em;margin-left:0em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">λ</span></span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span><span class="mop">max</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7521em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em"><span style="top:-1.8557em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.07847em">I</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2943em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">I</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.02778em">O</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord overline"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">λ</span></span></span><span style="top:-3.8144em"><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="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em">O</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.07847em">I</span><span class="mord">∣</span><span class="mord mathnormal">λ</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
</ul>
</li>
<li>
<p>解码问题:已知模型$\lambda$与观测序列$O$,求状态序列$I$最大化$P(I|O)$;维特比(Viterbi)算法</p>
</li>
</ul>
<p>HMM是一种序列模型,不仅可以用到自然语言处理这个领域,其他领域的应用也很常见:<a href="http://tecdat.cn/%e7%94%a8%e6%9c%ba%e5%99%a8%e5%ad%a6%e4%b9%a0%e8%af%86%e5%88%ab%e4%b8%8d%e6%96%ad%e5%8f%98%e5%8c%96%e7%9a%84%e8%82%a1%e5%b8%82%e7%8a%b6%e5%86%b5-%e9%9a%90%e9%a9%ac%e5%b0%94%e7%a7%91%e5%a4%ab/" target="_blank" rel="noopener noreferrer" class="rp-link">股指预测</a>,<a href="https://www.jianshu.com/p/16fc3712fdf6" target="_blank" rel="noopener noreferrer" class="rp-link">语音识别</a>,<a href="http://www.c-a-m.org.cn/CN/abstract/abstract4637.shtml" target="_blank" rel="noopener noreferrer" class="rp-link">网络安全</a>,<a href="https://arxiv.org/abs/1901.06286" target="_blank" rel="noopener noreferrer" class="rp-link">基因序列</a>等方面</p>
<p>在自然语言处理中,HMM可以应用在分词,词性标注,命名实体识别等各个方面.</p>
<p>在分词方面可以这样理解HMM</p>
<p>观测序列(输出状态序列)----序列构成的句子或短文</p>
<p>状态序列(隐藏状态序列)----标注</p>
<p>初始概率----统计的第一个字序的概率</p>
<p>转移概率(转移概率矩阵)----第$i$个字序到第$i+1$个自序的标注变换概率</p>
<p>发射概率(发射概率矩阵)----从隐藏状态到输出状态的转换概率</p>
<p>如果把观测序列看作标注,状态序列看作句子,从解码问题转变成学习问题会怎样</p>
<p>在序列预测问题中</p>
<p>HMM模型:当前tag仅依赖前一个tag,当前输出仅依赖当前tag(文档的单词序列是由隐藏状态的标签决定的)</p>
<p>MEMM(最大熵马尔科夫模型)模型:当前tag取决于观察值x(单词)和前一个tag(序列的标签取决于前一个标签和当前的单词)</p>
<p>CRF模型:计算损失时把一句话看作一个整体计算损失</p>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<p>1.<a href="https://www.cnblogs.com/hiyoung/archive/2018/09/25/9703976.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.cnblogs.com/hiyoung/archive/2018/09/25/9703976.html</a></p>
<p>2.<a href="http://www.52nlp.cn/hmm-learn-best-practices-one-introduction" target="_blank" rel="noopener noreferrer" class="rp-link">http://www.52nlp.cn/hmm-learn-best-practices-one-introduction</a></p>
<p>3.<a href="https://www.cnblogs.com/en-heng/p/6164145.html?utm_source=debugrun&amp;utm_medium=referral" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.cnblogs.com/en-heng/p/6164145.html?utm_source=debugrun&amp;utm_medium=referral</a></p>
<p>4.<a href="http://www.wanguanglu.com/2017/01/03/crf-introduction/" target="_blank" rel="noopener noreferrer" class="rp-link">http://www.wanguanglu.com/2017/01/03/crf-introduction/</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[神经图灵机]]></title>
        <id>/blog/2019/hexo-神经图灵机</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-神经图灵机"/>
        <updated>2019-09-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文解读了神经图灵机（Neural Turing Machine, NTM）的核心机制。NTM通过一个外部记忆矩阵增强了神经网络的能力。文章详细介绍了其读、写操作过程，关键在于一个可微的定位向量（addressing vector）。该向量的生成结合了基于内容的寻址（通过余弦相似度）和基于位置的寻址（通过插值、循环卷积偏移和重塑），使得模型能够端到端地学习访问和修改记忆。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="神经图灵机"><a href="#神经图灵机" class="rp-header-anchor rp-link" aria-hidden="true">#</a>神经图灵机<!-- --> </h1>
<h3 class="rp-toc-include" id="neural-turing-machines原文"><a href="#neural-turing-machines原文" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Neural Turing Machines<a href="https://arxiv.org/abs/1410.5401" target="_blank" rel="noopener noreferrer" class="rp-link">原文</a></h3>
<ul>
<li>
<p>读记忆(Read Heads)</p>
<p>把时刻<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi></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.6151em"></span><span class="mord mathnormal">t</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><mi>M</mi></mrow><annotation encoding="application/x-tex">N \times M</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">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.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><msub><mi>M</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">M_t</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.2806em"><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">t</span></span></span></span><span 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>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.6833em"></span><span class="mord mathnormal" style="margin-right:0.10903em">N</span></span></span></span>的定位权重向量<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>w</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">w_t</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" style="margin-right:0.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span 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>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.6833em"></span><span class="mord mathnormal" style="margin-right:0.10903em">N</span></span></span></span>个记忆位置的权值大小,读出的记忆向量为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>r</mi><mi>t</mi></msub></mrow><annotation encoding="application/x-tex">r_t</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" style="margin-right:0.02778em">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><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">t</span></span></span></span><span 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>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>r</mi><mi>t</mi></msub><mo>=</mo><munderover><mo>∑</mo><mi>i</mi><mi>N</mi></munderover><msub><mi>w</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><msub><mi>M</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mtext>   </mtext><munder><mo>∑</mo><mi>i</mi></munder><msub><mi>w</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">r_t=\sum_i^Nw_t(i)M_t(i) \ \ \ \sum_iw_t(i)=1
</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" style="margin-right:0.02778em">r</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><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">t</span></span></span></span><span class="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:3.106em;vertical-align:-1.2777em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em"><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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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 mathnormal">i</span><span class="mclose">)</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.2806em"><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">t</span></span></span></span><span class="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 mathnormal">i</span><span class="mclose">)</span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em"><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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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 mathnormal">i</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</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>对$N$条记忆进行加权求和</p>
<ul>
<li>
<p>写记忆(Write Heads)</p>
<p>类似LSTM:擦除向量$e_t$,增加向量$a_t$</p>
<ul>
<li>擦除操作:</li>
</ul>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msubsup><mi>M</mi><mi>t</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msubsup><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>M</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><msub><mi>w</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><msub><mi>e</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">M_t&#x27;(i)=M_{t-1}(1-w_t(i)e_t(i))
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0519em;vertical-align:-0.25em"></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.8019em"><span style="top:-2.453em;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">t</span></span></span><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></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">i</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="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 mathnormal mtight">t</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="mopen">(</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:1em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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 mathnormal">i</span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><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">t</span></span></span></span><span class="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 mathnormal">i</span><span class="mclose">))</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ul>
<li>增加操作:</li>
</ul>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>M</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><msubsup><mi>M</mi><mi>t</mi><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msubsup><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>+</mo><msub><mi>w</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><msub><mi>a</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">M_t(i)=M_t&#x27;(i)+w_t(i)a_t(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="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.2806em"><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">t</span></span></span></span><span class="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 mathnormal">i</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.0519em;vertical-align:-0.25em"></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.8019em"><span style="top:-2.453em;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">t</span></span></span><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></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">i</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="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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 mathnormal">i</span><span class="mclose">)</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.2806em"><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">t</span></span></span></span><span class="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 mathnormal">i</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>神经图灵机的关键是定位向量$w_t$,其它的是由控制器(LSTM,MLP)输出</p>
</li>
<li>
<p>定位机制(Addressing Mechanism)</p>
<p>结合了基于内容和基于位置的两种方法</p>
<ul>
<li>
<p>基于内容(Content-based Addressing)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msubsup><mi>w</mi><mi>t</mi><mi>c</mi></msubsup><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><mi>exp</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mi>β</mi><mi>t</mi></msub><mi>K</mi><mo stretchy="false">[</mo><msub><mi>k</mi><mi>t</mi></msub><mo separator="true">,</mo><msub><mi>M</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow><mrow><munder><mo>∑</mo><mi>j</mi></munder><mi>exp</mi><mo>⁡</mo><mo stretchy="false">(</mo><msub><mi>β</mi><mi>t</mi></msub><mi>K</mi><mo stretchy="false">[</mo><msub><mi>k</mi><mi>t</mi></msub><mo separator="true">,</mo><msub><mi>M</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>j</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">w_t^c(i)=\frac {\exp(\beta_tK[k_t,M_t(i)])}{\sum_j\exp(\beta_tK[k_t,M_t(j)])}
</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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7144em"><span style="top:-2.453em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><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 mathnormal mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal">i</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:2.5488em;vertical-align:-1.1218em"></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.427em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.162em"><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 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.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop">exp</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0528em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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 mathnormal" style="margin-right:0.07153em">K</span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03148em">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0315em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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.10903em">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><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">t</span></span></span></span><span class="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 mathnormal" style="margin-right:0.05724em">j</span><span class="mclose">)])</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mop">exp</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0528em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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 mathnormal" style="margin-right:0.07153em">K</span><span class="mopen">[</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03148em">k</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0315em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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.10903em">M</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><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">t</span></span></span></span><span class="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 mathnormal">i</span><span class="mclose">)])</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1218em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>$K[...]$是余弦相似度计算:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>K</mi><mo stretchy="false">[</mo><mi>u</mi><mo separator="true">,</mo><mi>v</mi><mo stretchy="false">]</mo><mo>=</mo><mfrac><mrow><mi>u</mi><mo>⋅</mo><mi>v</mi></mrow><mrow><mi mathvariant="normal">∥</mi><mi>u</mi><mi mathvariant="normal">∥</mi><mo>⋅</mo><mi mathvariant="normal">∥</mi><mi>v</mi><mi mathvariant="normal">∥</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">K[u,v]=\frac{u \cdot v}{\Vert u\Vert \cdot \Vert v\Vert}
</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.07153em">K</span><span class="mopen">[</span><span class="mord mathnormal">u</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.03588em">v</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:2.0575em;vertical-align:-0.936em"></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.1215em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">∥</span><span class="mord mathnormal">u</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 class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.03588em">v</span><span class="mord">∥</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">u</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.03588em">v</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>$\beta_t$是控制器输出</p>
</li>
<li>
<p>基于位置(Location-based Addressing)</p>
<ul>
<li>
<p>插值(Interpolation)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msubsup><mi>w</mi><mi>t</mi><mi>g</mi></msubsup><mo>=</mo><msub><mi>g</mi><mi>t</mi></msub><msubsup><mi>w</mi><mi>t</mi><mi>c</mi></msubsup><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><msub><mi>g</mi><mi>t</mi></msub><mo stretchy="false">)</mo><msub><mi>w</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">w_t^g=g_tw_t^c+(1-g_t)w_{t-1}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.0281em;vertical-align:-0.2458em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7823em"><span style="top:-2.4542em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.1809em;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.03588em">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2458em"><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.9614em;vertical-align:-0.247em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7144em"><span style="top:-2.453em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><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 mathnormal mtight">c</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><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">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:1em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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">t</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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>$g_t$有控制器生成</p>
</li>
<li>
<p>偏移(shift)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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><mover accent="true"><mi>w</mi><mo>~</mo></mover><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mrow><mi>N</mi><mo>−</mo><mn>1</mn></mrow></munderover><msubsup><mi>w</mi><mi>t</mi><mi>g</mi></msubsup><mo stretchy="false">(</mo><mi>j</mi><mo stretchy="false">)</mo><msub><mi>s</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo>−</mo><mi>j</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\tilde w_t(i)=\sum_{j=0}^{N-1}w_t^g(j)s_t(i-j)
</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 accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.02691em">w</span></span><span style="top:-3.35em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1667em"><span class="mord">~</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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 mathnormal">i</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:3.2421em;vertical-align:-1.4138em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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><span class="mord mtight">0</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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="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:1.4138em"><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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7823em"><span style="top:-2.4542em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.1809em;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.03588em">g</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2458em"><span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05724em">j</span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal">s</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><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">t</span></span></span></span><span class="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 mathnormal">i</span><span 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.05724em">j</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>每一个$\tilde w_t(i)$都与相邻元素有关</p>
</li>
<li>
<p>重塑(Sharping)</p>
</li>
</ul>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>w</mi><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><msub><mover accent="true"><mi>w</mi><mo>~</mo></mover><mi>t</mi></msub><mo stretchy="false">(</mo><mi>i</mi><msup><mo stretchy="false">)</mo><msub><mi>γ</mi><mi>t</mi></msub></msup></mrow><mrow><munder><mo>∑</mo><mi>j</mi></munder><msub><mover accent="true"><mi>w</mi><mo>~</mo></mover><mi>t</mi></msub><mo stretchy="false">(</mo><mi>j</mi><msup><mo stretchy="false">)</mo><msub><mi>γ</mi><mi>t</mi></msub></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">w_t(i)=\frac{\tilde w_t(i)^{\gamma_t}}{\sum_j\tilde w_t(j)^{\gamma_t}}
</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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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 mathnormal">i</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:2.5488em;vertical-align:-1.1218em"></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.427em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.162em"><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 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.4358em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.02691em">w</span></span><span style="top:-3.35em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1667em"><span class="mord">~</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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 mathnormal" style="margin-right:0.05724em">j</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.5904em"><span style="top:-2.989em;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 class="mord mathnormal mtight" style="margin-right:0.05556em">γ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2963em"><span style="top:-2.357em;margin-left:-0.0556em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">t</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></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.02691em">w</span></span><span style="top:-3.35em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1667em"><span class="mord">~</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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 mathnormal">i</span><span class="mclose"><span class="mclose">)</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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05556em">γ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2963em"><span style="top:-2.357em;margin-left:-0.0556em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mathnormal mtight">t</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></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.1218em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
</ul>
</li>
</ul><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[小样本学习的边缘标签图神经网络]]></title>
        <id>/blog/2019/hexo-小样本学习的边缘标签图神经网络</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-小样本学习的边缘标签图神经网络"/>
        <updated>2019-09-06T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文解读了论文《Edge-Labeling Graph Neural Network for Few-shot Learning》。该方法将小样本分类问题转化为图节点标签预测任务，通过构建一个边标签图来学习样本间的关系。文章介绍了模型的核心思想：利用卷积网络提取特征，构建图结构，并通过图神经网络的邻域聚合框架迭代更新节点和边的特征，最终预测查询样本的类别。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="小样本学习的边缘标签图神经网络"><a href="#小样本学习的边缘标签图神经网络" class="rp-header-anchor rp-link" aria-hidden="true">#</a>小样本学习的边缘标签图神经网络<!-- --> </h1>
<h3 class="rp-toc-include" id="edge-labeling-graph-neural-network-for-few-shot-learning原文"><a href="#edge-labeling-graph-neural-network-for-few-shot-learning原文" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Edge-Labeling Graph Neural Network for Few-shot Learning[<a href="https://arxiv.org/abs/1905.01436" target="_blank" rel="noopener noreferrer" class="rp-link">原文</a>]</h3>
<p>小样本学习的边缘标签图神经网络</p>
<p>将样本映射到图中的节点,边表示节点之间的相似度,通过已知样本预测未知样本</p>
<h4 class="rp-toc-include" id="graph-neural-network"><a href="#graph-neural-network" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Graph Neural Network</h4>
<p>主要利用邻域聚合框架(通过对相邻节点特征的递归聚合和转换,计算出节点特征)进行表征学习</p>
<h4 class="rp-toc-include" id="edge-labeling-graph"><a href="#edge-labeling-graph" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Edge-Labeling Graph</h4>
<p><strong>Correlation clustering</strong></p>
<p>相关性聚类分析:一个通过同时最大化簇内相似性和簇间差异性来实现边标注推理的图分割算法</p>
<ul>
<li>通过结构化向量机实现名词短语聚类和新闻文章聚类</li>
</ul>
<h4 class="rp-toc-include" id="few-shot-learning"><a href="#few-shot-learning" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Few-Shot Learning</h4>
<p>C-way K-shot:一个meta-task,包括support
set随机抽取C个类别,每个类别K个样本(共CK个数据);和batch
set从这C各类别种抽取一批样本.</p>
<p>Mode Based, Metric Based,Optimization Based</p>
<h4 class="rp-toc-include" id="problem-definition-few-shot-classification"><a href="#problem-definition-few-shot-classification" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Problem definition: Few-shot classification</h4>
<ul>
<li>在每个类只有很少样本的情况下学习一个分类器</li>
<li>每一个few-shot分类任务<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">T</mi></mrow><annotation encoding="application/x-tex">\mathcal T</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 mathcal" style="margin-right:0.25417em">T</span></span></span></span>包括support set <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">S</mi></mrow><annotation encoding="application/x-tex">\mathcal S</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 mathcal" style="margin-right:0.075em">S</span></span></span></span>和query set <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">Q</mi></mrow><annotation encoding="application/x-tex">\mathcal Q</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7805em;vertical-align:-0.0972em"></span><span class="mord mathcal">Q</span></span></span></span></li>
<li>episodic training：在training task中抽样，模拟少样本测试时的场景
<ul>
<li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">T</mi><mo>=</mo><mi mathvariant="script">S</mi><mo>∪</mo><mi mathvariant="script">U</mi></mrow><annotation encoding="application/x-tex">\mathcal T = \mathcal S \cup \mathcal U</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 mathcal" style="margin-right:0.25417em">T</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span></span><span class="base"><span class="strut" style="height:0.6833em"></span><span class="mord mathcal" style="margin-right:0.075em">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:0.6833em"></span><span class="mord mathcal" style="margin-right:0.09931em">U</span></span></span></span>,
<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">S</mi><mo>=</mo><mrow><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>y</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><mi mathvariant="normal">_</mi><msup><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mrow><mi>N</mi><mo>×</mo><mi>K</mi></mrow></msup></mrow><annotation encoding="application/x-tex">\mathcal S = {(x_i,y_i)}\_{i=1} ^{N \times 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 mathcal" style="margin-right:0.075em">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:1.2008em;vertical-align:-0.31em"></span><span class="mord"><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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.03588em">y</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.0359em;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 class="mord" style="margin-right:0.02778em">_</span><span class="mord"><span class="mord"><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord">1</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8908em"><span style="top:-3.1124em;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.10903em">N</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.07153em">K</span></span></span></span></span></span></span></span></span></span></span></span>
and <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">Q</mi><mo>=</mo><mrow><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>y</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><mi mathvariant="normal">_</mi><msup><mrow><mi>i</mi><mo>=</mo><mi>N</mi><mo>×</mo><mi>K</mi><mo>+</mo><mn>1</mn></mrow><mrow><mi>N</mi><mo>×</mo><mi>K</mi><mo>+</mo><mi>T</mi></mrow></msup></mrow><annotation encoding="application/x-tex">\mathcal Q={(x_i,y_i)}\_{i=N \times K + 1}^{N \times K+T}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7805em;vertical-align:-0.0972em"></span><span class="mord mathcal">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:1.2246em;vertical-align:-0.31em"></span><span class="mord"><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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.03588em">y</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.0359em;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 class="mord" style="margin-right:0.02778em">_</span><span class="mord"><span class="mord"><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord mathnormal" style="margin-right:0.10903em">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 class="mord mathnormal" style="margin-right:0.07153em">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 class="mord">1</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9146em"><span style="top:-3.1362em;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.10903em">N</span><span class="mbin mtight">×</span><span class="mord mathnormal mtight" style="margin-right:0.07153em">K</span><span class="mbin mtight">+</span><span class="mord mathnormal mtight" style="margin-right:0.13889em">T</span></span></span></span></span></span></span></span></span></span></span></span></li>
<li>$x_i,y_i\in{C_1,...,C_N}=\mathcal C*{\mathcal
T}\subset\mathcal C$同时$\mathcal C*{train}\cap\mathcal
C*{test} = \empty$</li>
</ul>
</li>
</ul>
<h4 class="rp-toc-include" id="model"><a href="#model" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Model</h4>
<ol>
<li>通过卷积神经网络提取样本特征,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>θ</mi><mrow><mi>e</mi><mi>m</mi><mi>b</mi></mrow></msub></mrow><annotation encoding="application/x-tex">\theta_{emb}</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" style="margin-right:0.02778em">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0278em;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">e</span><span class="mord mathnormal mtight">mb</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>是卷积网络的参数</li>
</ol>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msubsup><mi mathvariant="bold">v</mi><mi>i</mi><mn>0</mn></msubsup><mo>=</mo><msub><mi>f</mi><mrow><mi>e</mi><mi>m</mi><mi>b</mi></mrow></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">;</mo><msub><mi>θ</mi><mrow><mi>e</mi><mi>m</mi><mi>b</mi></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathbf v_i^0=f_{emb}(x_i;\theta_{emb})
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1111em;vertical-align:-0.247em"></span><span class="mord"><span class="mord mathbf" style="margin-right:0.01597em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em"><span style="top:-2.453em;margin-left:-0.016em;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 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">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><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="mord"><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.1076em;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">e</span><span class="mord mathnormal mtight">mb</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"><span class="mord mathnormal">x</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.02778em">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0278em;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">e</span><span class="mord mathnormal mtight">mb</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></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<ol start="2">
<li>
<p>图构建:<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="script">g</mi><mo>=</mo><mo stretchy="false">(</mo><mi mathvariant="script">V</mi><mo separator="true">,</mo><mi mathvariant="script">E</mi><mo separator="true">;</mo><mi mathvariant="script">T</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\mathcal g=(\mathcal V,\mathcal E;\mathcal T)</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">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:1em;vertical-align:-0.25em"></span><span class="mopen">(</span><span class="mord mathcal" style="margin-right:0.08222em">V</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathcal" style="margin-right:0.08944em">E</span><span class="mpunct">;</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathcal" style="margin-right:0.25417em">T</span><span class="mclose">)</span></span></span></span>每一个节点代表一个样本，全连接图，每一条边代表一种关系种类</p>
<p>其中<span class="katex-error" title="ParseError: KaTeX parse error: Unexpected character: &#x27;\&#x27; at position 50: …|\\mathcal T\|}\̲" style="color:#cc0000"> \mathcal V :={V_i}\_{i=1,\\dots,\|\\mathcal T\|}\</span>,$\mathcal
E :={E*{ij}}*{i,j=1,\dots,|\mathcal T|}$,</p>
<ol>
<li>
<p>ground truth: edge-label</p>
</li>
<li>
<p>边特征$\mathbf e*{ij}={e*{ijd}}^2_{d=1} \in
[0,1]^2$是一个二维矩阵,表示两个之节点间的簇内关系和簇间关系的强弱,||表示连接</p>
</li>
</ol>
</li>
<li>
<p>传播:设从$\ell -1 $层得到的特征为 <span class="katex-error" title="ParseError: KaTeX parse error: Unexpected character: &#x27;\&#x27; at position 23: …f v\*i^{\ell-1}\̲" style="color:#cc0000"> \mathbf v\*i^{\ell-1}\</span>
和$\mathbf e*{ij}^{\ell-1}$</p>
<ol>
<li>
<p>更新节点特征</p>
<p>其中<span class="katex-error" title="ParseError: KaTeX parse error: Unexpected character: &#x27;\&#x27; at position 59: …\sum_ke\_{ikd}}\̲" style="color:#cc0000"> \tilde e\_{ij1}^{\ell-1}=\frac {e\_{ijd}}{\sum_ke\_{ikd}}\</span>,$f_v^\ell(\theta)$是节点特征的转变网络(MLP).</p>
</li>
<li>
<p>更新边特征</p>
<p>其中 $f_e^\ell$是metric network计算节点相似度</p>
</li>
</ol>
</li>
<li>
<p>输出结果:节点属于某个集合的分布$P(y_i=\mathcal C_k|\mathcal
T)=p_i^{(k)}$</p>
</li>
</ol>
<h4 class="rp-toc-include" id="training"><a href="#training" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Training</h4>
<p>其中模型参数有<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>θ</mi><mo>∗</mo><mrow><mi>e</mi><mi>m</mi><mi>b</mi></mrow><mo>∪</mo><mrow><msubsup><mi>θ</mi><mi>v</mi><mi mathvariant="normal">ℓ</mi></msubsup><mo separator="true">,</mo><msubsup><mi>θ</mi><mi>e</mi><mi mathvariant="normal">ℓ</mi></msubsup></mrow><mi mathvariant="normal">_</mi><msup><mrow><mi mathvariant="normal">ℓ</mi><mo>=</mo><mn>1</mn></mrow><mi>L</mi></msup></mrow><annotation encoding="application/x-tex">\theta*{emb}
\cup{\theta_v^\ell,\theta_e^\ell}\_{\ell=1}^L</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 mathnormal" style="margin-right:0.02778em">θ</span><span 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.6944em"></span><span class="mord"><span class="mord mathnormal">e</span><span class="mord mathnormal">mb</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.2357em;vertical-align:-0.31em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8491em"><span style="top:-2.453em;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.03588em">v</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></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><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.02778em">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8491em"><span style="top:-2.453em;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">e</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></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span></span><span class="mord" style="margin-right:0.02778em">_</span><span class="mord"><span class="mord"><span class="mord">ℓ</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord">1</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9257em"><span style="top:-3.1473em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">L</span></span></span></span></span></span></span></span></span></span></span>,对于M个训练任务<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msubsup><mi mathvariant="script">T</mi><mi>m</mi><mrow><mi>t</mi><mi>r</mi><mi>a</mi><mi>i</mi><mi>n</mi></mrow></msubsup><mi mathvariant="normal">_</mi><msup><mrow><mi>m</mi><mo>=</mo><mn>1</mn></mrow><mi>M</mi></msup></mrow><annotation encoding="application/x-tex">{ \mathcal T_m^{train}}\_{m=1}^M </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1857em;vertical-align:-0.31em"></span><span class="mord"><span class="mord"><span class="mord mathcal" style="margin-right:0.25417em">T</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8247em"><span style="top:-2.453em;margin-left:-0.2542em;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 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">t</span><span class="mord mathnormal mtight" style="margin-right:0.02778em">r</span><span class="mord mathnormal mtight">ain</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span></span><span class="mord" style="margin-right:0.02778em">_</span><span class="mord"><span class="mord"><span class="mord mathnormal">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 class="mord">1</span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8757em"><span style="top:-3.0973em;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.10903em">M</span></span></span></span></span></span></span></span></span></span></span>,损失函数:</p>
<p>其中$Y*{m,e}$和$\hat
Y*{m,e}^\ell$是m个任务,e条边的真实值和预测值(第$\mathcal
L$层的),$\mathcal L$是交叉熵损失函数</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[记一次GRUB引导修复]]></title>
        <id>/blog/2019/hexo-记一次GRUB引导修复</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-记一次GRUB引导修复"/>
        <updated>2019-09-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了一次在Arch Linux与Windows 10双系统环境下，因Windows更新和修复导致GRUB引导丢失的修复过程。作者在尝试多种方法失败后，最终通过在`grub-install`命令中添加`--removable`参数，或手动将GRUB文件移动到缺省/后备启动路径（EFI/BOOT/BOOTX64.EFI），成功解决了引导卡在`GRUB _`闪烁的问题，恢复了系统启动。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="记一次grub引导修复"><a href="#记一次grub引导修复" class="rp-header-anchor rp-link" aria-hidden="true">#</a>记一次GRUB引导修复<!-- --> </h1>
<p>使用Arch Linux已经2年多了，基本上已经习惯了，可前段时间英雄联盟也出了&quot;自走棋&quot;，想要体验一把。
于是就在硬盘剩余的60多个G上装了Windows 10，用了一两个月没有问题，最后在一次Windows 10更新后，蓝屏了。
又手惨的点了Windows 的修复功能。等了半天，结果是修复，重启，蓝屏无限循环。
而且Arch Linux的引导全都没了，感觉应该是Windows的修复动了efi分区。
无奈只能重新修复引导，各种方法尝试了好多遍，都是卡在了<code>GRUB _</code>一直闪这个状态，
最终在官网wiki找到了办法 <a href="https://wiki.archlinux.org/index.php/GRUB_#Default/fallback_boot_path" target="_blank" rel="noopener noreferrer" class="rp-link">缺省/后备启动路径</a> grub 安装时添加<code>--removable</code>参数</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">grub-install</span><span style="color:var(--shiki-token-string)"> --target=x86_64-efi</span><span style="color:var(--shiki-token-string)"> --efi-directory=esp</span><span style="color:var(--shiki-token-string)"> --removable</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>或者手动移动</p>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">mv</span><span style="color:var(--shiki-token-string)"> esp/EFI/grub</span><span style="color:var(--shiki-token-string)"> esp/EFI/BOOT</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">mv</span><span style="color:var(--shiki-token-string)"> esp/EFI/BOOT/grubx64.efi</span><span style="color:var(--shiki-token-string)"> esp/EFI/BOOT/BOOTX64.EFI</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>grub出现bug的原因应该会千奇百怪，要尽可能多的尝试网上的各种修改方法。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[深度学习在中文分词和词性标注中的应用]]></title>
        <id>/blog/2019/hexo-深度学习在中文分词和词性标注中的应用</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-深度学习在中文分词和词性标注中的应用"/>
        <updated>2019-08-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文概述了一种结合深度学习进行中文分词和词性标注的方法。其核心流程是：先将字转换为字向量，通过窗口方法获得包含上下文信息的向量，再经过神经网络层得到每个字的标签得分。模型引入了标签间的转移分数，并使用维特比（Viterbi）算法在全局上寻找最优的标签序列路径，通过最大化对数似然函数进行端到端的训练。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="深度学习在中文分词和词性标注中的应用"><a href="#深度学习在中文分词和词性标注中的应用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>深度学习在中文分词和词性标注中的应用<!-- --> </h1>
<p>得到字向量-&gt;通过窗口方法得到字与上下文有关的向量(矩阵)-&gt;通过两个线性层和一个非线性激活函数-&gt;字的标注得分(窗口方法)-&gt;一个句子的评分矩阵<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo>×</mo><mi>θ</mi><mo stretchy="false">(</mo><mi>c</mi><mo>×</mo><mrow><mo stretchy="false">[</mo><mn>1</mn><mo>:</mo><mi>n</mi><mo stretchy="false">]</mo></mrow><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f \times \theta (c \times {[1:n]})</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em"></span><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span 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">θ</span><span class="mopen">(</span><span class="mord mathnormal">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"><span class="mopen">[</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 class="mord mathnormal">n</span><span class="mclose">]</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><mi>i</mi></mrow><annotation encoding="application/x-tex">i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6595em"></span><span class="mord mathnormal">i</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></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.6151em"></span><span class="mord mathnormal">t</span></span></span></span>
的得分)-&gt;定义转换分数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub></mrow><annotation encoding="application/x-tex">A_{ij}</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">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 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em">ij</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></span></span>,得到tag path 得分 -&gt;最大化得分,得到最优tag path</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>s</mi><mo stretchy="false">(</mo><msub><mi>c</mi><mrow><mo stretchy="false">[</mo><mn>1</mn><mo>:</mo><mi>N</mi><mo stretchy="false">]</mo></mrow></msub><mo separator="true">,</mo><msub><mi>t</mi><mrow><mo stretchy="false">[</mo><mn>1</mn><mo>:</mo><mi>N</mi><mo stretchy="false">]</mo></mrow></msub><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>n</mi></munderover><mo stretchy="false">(</mo><msub><mi>A</mi><mrow><msub><mi>t</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><msub><mi>t</mi><mi>i</mi></msub></mrow></msub><mo>+</mo><msub><mi>f</mi><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>t</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><mi>i</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">s(c_{[1:N]},t_{[1:N]},\theta)=\sum_{i=1}^n(A_{t_{i-1}t_i}+f_\theta (t_i\vert i))
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1052em;vertical-align:-0.3552em"></span><span class="mord mathnormal">s</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">c</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em"><span style="top:-2.5198em;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="mopen mtight">[</span><span class="mord mtight">1</span><span class="mrel mtight">:</span><span class="mord mathnormal mtight" style="margin-right:0.10903em">N</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.3552em"><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">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3448em"><span style="top:-2.5198em;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="mopen mtight">[</span><span class="mord mtight">1</span><span class="mrel mtight">:</span><span class="mord mathnormal mtight" style="margin-right:0.10903em">N</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.3552em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.02778em">θ</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:2.9291em;vertical-align:-1.2777em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><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.2806em"><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"><span class="mord mathnormal mtight">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.2025em"><span></span></span></span></span></span></span><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.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.2918em"><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="mord"><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.1076em;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">θ</span></span></span></span><span class="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">t</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><span class="mord mathnormal">i</span><span class="mclose">))</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>log likelihood</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><munder><mo>∑</mo><mrow><mi mathvariant="normal">∀</mi><mo stretchy="false">(</mo><mi>c</mi><mo separator="true">,</mo><mi>t</mi><mo stretchy="false">)</mo><mo>∈</mo><mi>R</mi></mrow></munder><mi>log</mi><mo>⁡</mo><mi>p</mi><mo stretchy="false">(</mo><mi>t</mi><mi mathvariant="normal">∣</mi><mi>c</mi><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\sum_{\forall(c,t)\in R}\log p(t\vert c,\theta)
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.566em;vertical-align:-1.516em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em"><span style="top:-1.809em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">∀</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">c</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight">t</span><span class="mclose mtight">)</span><span class="mrel mtight">∈</span><span class="mord mathnormal mtight" style="margin-right:0.00773em">R</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.516em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></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 mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mord">∣</span><span class="mord mathnormal">c</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.02778em">θ</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>将目标函数转换为条件概率</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>p</mi><mo stretchy="false">(</mo><mi>t</mi><mi mathvariant="normal">∣</mi><mi>c</mi><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><msup><mi>e</mi><mrow><mi>s</mi><mo stretchy="false">(</mo><mi>c</mi><mo separator="true">,</mo><mi>t</mi><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow></msup><mrow><munder><mo>∑</mo><mover accent="true"><mi>t</mi><mo>~</mo></mover></munder><msup><mi>e</mi><mrow><mi>s</mi><mo stretchy="false">(</mo><mi>c</mi><mo separator="true">,</mo><mover accent="true"><mi>t</mi><mo>~</mo></mover><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac></mrow><annotation encoding="application/x-tex">p(t\vert c,\theta)=\frac {e^{s(c,t,\theta)}}{\sum_{\tilde t}{e^{s(c,\tilde t,\theta)}}}
</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">p</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mord">∣</span><span class="mord mathnormal">c</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.02778em">θ</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:2.6401em;vertical-align:-1.0751em"></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.565em"><span style="top:-2.2246em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.2966em"><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 accent mtight"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8519em"><span style="top:-2.7em"><span class="pstrut" style="height:2.7em"></span><span class="mord mathnormal mtight">t</span></span><span style="top:-3.2341em"><span class="pstrut" style="height:2.7em"></span><span class="accent-body" style="left:-0.1667em"><span class="mord mtight">~</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.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">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8854em"><span style="top:-2.989em;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">s</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">c</span><span class="mpunct mtight">,</span><span class="mord accent mtight"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8519em"><span style="top:-2.7em"><span class="pstrut" style="height:2.7em"></span><span class="mord mathnormal mtight">t</span></span><span style="top:-3.2341em"><span class="pstrut" style="height:2.7em"></span><span class="accent-body" style="left:-0.1667em"><span class="mord mtight">~</span></span></span></span></span></span></span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.02778em">θ</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em"><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">s</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">c</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight">t</span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.02778em">θ</span><span class="mclose mtight">)</span></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:1.0751em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>取对数</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>log</mi><mo>⁡</mo><mi>p</mi><mo stretchy="false">(</mo><mi>t</mi><mi mathvariant="normal">∣</mi><mi>c</mi><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mi>s</mi><mo stretchy="false">(</mo><mi>c</mi><mo separator="true">,</mo><mi>t</mi><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>−</mo><mi>l</mi><mi>o</mi><mi>g</mi><munder><mo>∑</mo><mover accent="true"><mi>t</mi><mo>~</mo></mover></munder><msup><mi>e</mi><mrow><mi>s</mi><mo stretchy="false">(</mo><mi>c</mi><mo separator="true">,</mo><mover accent="true"><mi>t</mi><mo>~</mo></mover><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow></msup></mrow><annotation encoding="application/x-tex">\log p(t\vert c,\theta) = s(c,t,\theta)-log\sum_{\tilde t}{e^{s(c,\tilde t,\theta)}}
</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">lo<span style="margin-right:0.01389em">g</span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal">t</span><span class="mord">∣</span><span class="mord mathnormal">c</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.02778em">θ</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="mord mathnormal">s</span><span class="mopen">(</span><span class="mord mathnormal">c</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">t</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.02778em">θ</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:2.4624em;vertical-align:-1.4124em"></span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em"><span style="top:-1.7376em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord accent mtight"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8519em"><span style="top:-2.7em"><span class="pstrut" style="height:2.7em"></span><span class="mord mathnormal mtight">t</span></span><span style="top:-3.2341em"><span class="pstrut" style="height:2.7em"></span><span class="accent-body" style="left:-0.1667em"><span class="mord mtight">~</span></span></span></span></span></span></span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4124em"><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">e</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.0094em"><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">s</span><span class="mopen mtight">(</span><span class="mord mathnormal mtight">c</span><span class="mpunct mtight">,</span><span class="mord accent mtight"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8519em"><span style="top:-2.7em"><span class="pstrut" style="height:2.7em"></span><span class="mord mathnormal mtight">t</span></span><span style="top:-3.2341em"><span class="pstrut" style="height:2.7em"></span><span class="accent-body" style="left:-0.1667em"><span class="mord mtight">~</span></span></span></span></span></span></span><span class="mpunct mtight">,</span><span class="mord mathnormal mtight" style="margin-right:0.02778em">θ</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>维特比算法(viterbi)</p>
<p>一种动态规划算法(穷举法,A*算法,beam search,Viterbi算法)</p>
<p><font color="red">A*算法和Viterbi算法的区别?</font></p>
<p>新的训练方法</p>
<p>将维特比算法在当前参数下得出的最优路径结果与正确结果进行比较对比,定义出损失函数对<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>A</mi><mrow><msub><mi>t</mi><mrow><mi>i</mi><mo>−</mo><mn>1</mn></mrow></msub><msub><mi>t</mi><mi>i</mi></msub></mrow></msub></mrow><annotation encoding="application/x-tex">A_{t_{i-1}t_i}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9751em;vertical-align:-0.2918em"></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.2806em"><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"><span class="mord mathnormal mtight">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.2025em"><span></span></span></span></span></span></span><span class="mord mtight"><span class="mord mathnormal mtight">t</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3281em"><span style="top:-2.357em;margin-left:0em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 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.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.2918em"><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><mi>θ</mi></msub><mo stretchy="false">(</mo><msub><mi>t</mi><mi>i</mi></msub><mi mathvariant="normal">∣</mi><mi>i</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f_\theta (t_i|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="mord"><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.1076em;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">θ</span></span></span></span><span class="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">t</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><span class="mord mathnormal">i</span><span class="mclose">)</span></span></span></span> 的偏导数,通过后向传播更新参数</p>
<p>收敛性的证明:Discriminative training methods for hidden Markov models</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[OWL基础]]></title>
        <id>/blog/2019/hexo-OWL基础</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-OWL基础"/>
        <updated>2019-08-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了Web本体语言（OWL）的基础知识。内容涵盖了OWL的基本元素，如类、个体和属性，并解释了其与RDF的关系。文章还详细介绍了RDF的多种序列化方法，包括RDF/XML、N-Triples、Turtle、RDFa和JSON-LD，并以RDF/XML和Turtle为例展示了具体的语法格式和使用方法，为理解语义网技术提供了入门指导。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="owl基础"><a href="#owl基础" class="rp-header-anchor rp-link" aria-hidden="true">#</a>OWL基础<!-- --> </h1>
<p>OWL基础</p>
<p>网络本体语言Web Ontologoy Language</p>
<p>OWL Lite -&gt; OWL DL -&gt; OWL Full 递进关系</p>
<p>基本元素</p>
<ol>
<li>
<p>类(Class)</p>
<p>任何东西都是类owl:Thing
的一个成员(实例);子类:Subclass;相等关系:equivalentClass</p>
</li>
<li>
<p>个体(Individual)</p>
<p>与实例的概念差不多</p>
<p>一个个体可以属于多个类(没有指名是哪个类)</p>
<p>某个类的实例(指名了类)</p>
<p>子类与个体是不同的东西</p>
</li>
<li>
<p>属性(Property)</p>
<p>一个二元关系,OWL中包括两种属性:</p>
<ol>
<li>类型属性（datatype properties）：描述类与其实例之间关系的属性。</li>
<li>对象属性（object
properties）：描述两个不同类的实例之间关系的属性。</li>
</ol>
<p>属性有两个端点:起点和终点,都应该是两个个体(实例)</p>
<p>用原集(domain)起点的实例的类,用象集(range)描述终点的实例的类.</p>
<p>属性也有子属性(Subproperty)</p>
</li>
</ol>
<p>公理和约束</p>
<p>rdf资源描述框架(Resource Description Framework)</p>
<p>W3C提出的一组标记语言的技术规范,是一种数据模型,rdf数据集的序列化方法</p>
<p>OWL是由DAML(DARPA Agent Markup Language)+OIL(Ontology Inference
Layer)演变而来。</p>
<p>OWL是RDF的扩张，为我们提供了更广泛的定义RDFS词汇的功能，更广泛意指可以定义词汇之间的关系，类与类间的关系，属性与属性之间的关系等</p>
<p>foaf(Friend-of-a-Friend)是一种XML/RDF词汇表,不管通过那种那种方法表示数据资源,都要指定词汇表</p>
<ol>
<li>
<p>RDF/XML</p>
<p>XML的技术程序;格式太冗长,不便于阅读</p>
</li>
<li>
<p><a href="https://www.w3.org/TR/n-triples/" target="_blank" rel="noopener noreferrer" class="rp-link">N-Triples</a></p>
<p>三元组表示;开放领域知识图谱<a href="https://wiki.dbpedia.org/" target="_blank" rel="noopener noreferrer" class="rp-link">DBpedia</a>通常使用这种格式发布数据.</p>
</li>
<li>
<p><a href="https://www.w3.org/TR/turtle/" target="_blank" rel="noopener noreferrer" class="rp-link">Turtle</a></p>
<p>使用最多的一种RDF序列化方法,比RDF/XML紧凑,可读性比N-Triples好</p>
</li>
<li>
<p>RDFa</p>
<p>The Resource Description Framework in
Attributes,HTML5的一个扩展,不改变任何显示效果的情况下,然网站更容易被搜索引擎解析</p>
</li>
<li>
<p>JSON-LD</p>
<p>JSON for Linking Data,用键值对的方法来存储RDF</p>
</li>
</ol>
<p>RDF/XML</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>&lt;?xml version=&quot;1.0&quot;?&gt;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>&lt;rdf:RDF</span></span>
<span class="line"><span>xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;</span></span>
<span class="line"><span>xmlns:cd=&quot;http://www.recshop.fake/cd#&quot;&gt;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>&lt;rdf:Description</span></span>
<span class="line"><span>rdf:about=&quot;http://www.recshop.fake/cd/Empire Burlesque&quot;&gt;</span></span>
<span class="line"><span>  &lt;cd:artist&gt;Bob Dylan&lt;/cd:artist&gt;</span></span>
<span class="line"><span>  &lt;cd:country&gt;USA&lt;/cd:country&gt;</span></span>
<span class="line"><span>  &lt;cd:company&gt;Columbia&lt;/cd:company&gt;</span></span>
<span class="line"><span>  &lt;cd:price&gt;10.90&lt;/cd:price&gt;</span></span>
<span class="line"><span>  &lt;cd:year&gt;1985&lt;/cd:year&gt;</span></span>
<span class="line"><span>&lt;/rdf:Description&gt;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>&lt;rdf:Description</span></span>
<span class="line"><span>rdf:about=&quot;http://www.recshop.fake/cd/Hide your heart&quot;&gt;</span></span>
<span class="line"><span>  &lt;cd:artist&gt;Bonnie Tyler&lt;/cd:artist&gt;</span></span>
<span class="line"><span>  &lt;cd:country&gt;UK&lt;/cd:country&gt;</span></span>
<span class="line"><span>  &lt;cd:company&gt;CBS Records&lt;/cd:company&gt;</span></span>
<span class="line"><span>  &lt;cd:price&gt;9.90&lt;/cd:price&gt;</span></span>
<span class="line"><span>  &lt;cd:year&gt;1988&lt;/cd:year&gt;</span></span>
<span class="line"><span>&lt;/rdf:Description&gt;</span></span>
<span class="line"><span>.</span></span>
<span class="line"><span>.</span></span>
<span class="line"><span>.</span></span>
<span class="line"><span>&lt;/rdf:RDF&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>RDF 文档的第一行是 XML 声明。这个 XML 声明之后是 RDF 文档的根元素：。</p>
<p><em>xmlns:rdf</em> 命名空间，规定了带有前缀 rdf 的元素来自命名空间
&quot;<a href="http://www.w3.org/1999/02/22-rdf-syntax-ns#%22%E3%80%82" target="_blank" rel="noopener noreferrer" class="rp-link">http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;。</a></p>
<p><em>xmlns:cd</em> 命名空间，规定了带有前缀 cd 的元素来自命名空间
&quot;<a href="http://www.recshop.fake/cd#%22%E3%80%82" target="_blank" rel="noopener noreferrer" class="rp-link">http://www.recshop.fake/cd#&quot;。</a></p>
<p>元素包含了对被 <em>rdf:about</em> 属性标识的资源的描述。</p>
<p>元素：、、 等是此资源的属性。</p>
<p>Turtle序列化方法总结</p>
<ul>
<li>
<p>URI用 <strong>&lt;&gt;</strong> 描述</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>&lt;http://example.org/path/&gt;</span></span>
<span class="line"><span>&lt;http://example.org/path/#fragment&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>前缀缩写(类似于RDF/XML的命名空间)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>@prefix foo:&lt;http://example.org/ns#&gt;</span></span>
<span class="line"><span>@prefix  : &lt;http://example.org/ns1#&gt;</span></span>
<span class="line"><span>:a :b :c</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>字面量</p>
<p>一行或者多行， <code>@en</code>限定其语言， <code>^^xsd:decimal</code>限定其数据类型</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>&quot;string&quot;</span></span>
<span class="line"><span>&quot;&quot;&quot;</span></span>
<span class="line"><span>many lines of string</span></span>
<span class="line"><span>many lines of string</span></span>
<span class="line"><span>many lines of string</span></span>
<span class="line"><span>&quot;&quot;&quot;</span></span>
<span class="line"><span>&quot;chat&quot;@en</span></span>
<span class="line"><span>&quot;chat&quot;@fr</span></span>
<span class="line"><span>&quot;10&quot;^^xsd:decimal</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>空节点(RDF模型可能会存在未命名的空节点)</p>
<p><code>_:me</code>,<code>_a1234</code>分别代表一个空节点</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>_:me</span></span>
<span class="line"><span>_:a1234</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>base URI</p>
<p>base URI定义后，接下来的<strong>URI, 前缀缩写，qualified names 和base
URI</strong>都要受其作用</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span># this is a complete turtle document</span></span>
<span class="line"><span></span></span>
<span class="line"><span>@base &lt;http://example.org/ns/&gt; .</span></span>
<span class="line"><span># base URIs 是 http://example.org/ns/</span></span>
<span class="line"><span></span></span>
<span class="line"><span>@base &lt;foo/&gt; .</span></span>
<span class="line"><span># base URI 是 http://example.org/ns/foo/</span></span>
<span class="line"><span></span></span>
<span class="line"><span>@prefix : &lt;bar#&gt; .</span></span>
<span class="line"><span>:a4 :b4 :c4.</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>对三元组进行缩写</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>:a :b :c,</span></span>
<span class="line"><span>      :d.</span></span>
<span class="line"><span>#the last triple is :a :b :d.</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
</li>
<li>
<p>一个简单的完整turtle标准文件</p>
</li>
</ul>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>@prefix info: &lt;http://zy.example.com/info#&gt;</span></span>
<span class="line"><span>@prefix rel: &lt;http://zy.example.com/rel#&gt;</span></span>
<span class="line"><span>@prefix person: &lt;http://zy.example.com/person#&gt;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>person:Tom info:name &quot;Tom&quot;;</span></span>
<span class="line"><span>          info:job &quot;worker&quot;;</span></span>
<span class="line"><span>          info:age 56;</span></span>
<span class="line"><span>          rel:fatherof person:Jim.</span></span>
<span class="line"><span></span></span>
<span class="line"><span>person:Jim info:name &quot;Jim&quot;;</span></span>
<span class="line"><span>          info:job &quot;programmer&quot;;</span></span>
<span class="line"><span>          info:age 28;</span></span>
<span class="line"><span>          rel:fatherof person:Cherry.</span></span>
<span class="line"><span></span></span>
<span class="line"><span>person:Cherry info:name &quot;Cherry&quot;;</span></span>
<span class="line"><span>             info:age 8;</span></span>
<span class="line"><span>             .</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[sklearn中的广义线性模型]]></title>
        <id>/blog/2019/hexo-sklearn中的广义线性模型</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-sklearn中的广义线性模型"/>
        <updated>2019-08-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文概述了scikit-learn库中的多种广义线性模型。内容从普通最小二乘法（LinearRegression）开始，依次介绍了岭回归（Ridge）、Lasso回归、多任务Lasso（MultiTaskLasso）、弹性网络（ElasticNet）以及多任务弹性网络（MultiTaskElasticNet）。文章对每种模型的目标函数进行了数学公式的展示，并解释了关键参数（如α和ρ）的作用，为理解和选择线性模型提供了清晰的指导。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="sklearn中的广义线性模型"><a href="#sklearn中的广义线性模型" class="rp-header-anchor rp-link" aria-hidden="true">#</a>sklearn中的广义线性模型<!-- --> </h1>
<p>模型的通用公式</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>y</mi><mo>^</mo></mover><mo stretchy="false">(</mo><mi>w</mi><mo separator="true">,</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>w</mi><mn>0</mn></msub><mo>+</mo><msub><mi>w</mi><mn>1</mn></msub><msub><mi>x</mi><mn>1</mn></msub><mo>+</mo><mo>⋯</mo><mo>+</mo><msub><mi>w</mi><mi>p</mi></msub><msub><mi>x</mi><mi>p</mi></msub></mrow><annotation encoding="application/x-tex">\hat y(w,x)=w_0+w_1x_1+\dots+w_px_p
</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 accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1944em"><span class="mord">^</span></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="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">x</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.7333em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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="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" style="margin-right:0.02691em">w</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.0269em;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">x</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.6667em;vertical-align:-0.0833em"></span><span class="minner">⋯</span><span 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.7167em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">p</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</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">p</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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>普通最小二乘法</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>w</mi><mo>=</mo><munder><mrow><mi>min</mi><mo>⁡</mo></mrow><mi>w</mi></munder><msup><mrow><mi mathvariant="normal">∥</mi><mi>X</mi><mi>w</mi><mo>−</mo><mi>y</mi><msub><mi mathvariant="normal">∥</mi><mn>2</mn></msub></mrow><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">w=\min_w{\Vert Xw-y\Vert_2}^2
</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.02691em">w</span><span 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.654em;vertical-align:-0.7em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-2.4em;margin-left:0em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em">w</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span><span class="mop">min</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord"><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.02691em">Xw</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.03588em">y</span><span class="mord"><span class="mord">∥</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 class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.954em"><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">2</span></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>LinearRegression</p>
<p>岭回归</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>w</mi><mo>=</mo><munder><mrow><mi>min</mi><mo>⁡</mo></mrow><mi>w</mi></munder><msup><mrow><mi mathvariant="normal">∥</mi><mi>X</mi><mi>w</mi><mo>−</mo><mi>y</mi><msub><mi mathvariant="normal">∥</mi><mn>2</mn></msub></mrow><mn>2</mn></msup><mo>+</mo><mi>α</mi><msup><mrow><mi mathvariant="normal">∥</mi><mi>w</mi><msub><mi mathvariant="normal">∥</mi><mn>2</mn></msub></mrow><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">w=\min_w{\Vert Xw-y\Vert_2}^2+\alpha {\Vert w \Vert_2}^2
</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.02691em">w</span><span 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.654em;vertical-align:-0.7em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-2.4em;margin-left:0em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em">w</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span><span class="mop">min</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord"><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.02691em">Xw</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.03588em">y</span><span class="mord"><span class="mord">∥</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 class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.954em"><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">2</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:1.204em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span class="mord"><span class="mord"><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="mord"><span class="mord">∥</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 class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.954em"><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">2</span></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</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.0037em">α</span></span></span></span> 是控制系数收缩量的复杂性参数: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</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.0037em">α</span></span></span></span> 的值越大，收缩量越大，模型对共线性的鲁棒性也更强。</p>
<p>共线性:线性回归模型中的解释变量之间由于存在精确相关关系或高度相关关系而使模型估计失真</p>
<p>Ridge,RigdeCV:广义交叉验证(GCV),默认留一验证(LOO-CV)</p>
<p>Lasso</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>w</mi><mo>=</mo><munder><mrow><mi>min</mi><mo>⁡</mo></mrow><mi>w</mi></munder><mfrac><mn>1</mn><mrow><mn>2</mn><msub><mi>n</mi><mrow><mi>s</mi><mi>a</mi><mi>m</mi><mi>p</mi><mi>l</mi><mi>e</mi><mi>s</mi></mrow></msub></mrow></mfrac><mi mathvariant="normal">∥</mi><mi>X</mi><mi>w</mi><mo>−</mo><mi>y</mi><msubsup><mi mathvariant="normal">∥</mi><mn>2</mn><mn>2</mn></msubsup><mo>+</mo><mi>α</mi><mi mathvariant="normal">∥</mi><mi>w</mi><msub><mi mathvariant="normal">∥</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">w = \min_w\frac{1}{2n_{samples}}\Vert Xw-y \Vert_2^2 + \alpha \Vert w \Vert_1
</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.02691em">w</span><span 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:2.2935em;vertical-align:-0.9721em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-2.4em;margin-left:0em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em">w</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span><span class="mop">min</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></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.3214em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</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 mtight"><span class="mord mathnormal mtight">s</span><span class="mord mathnormal mtight">am</span><span class="mord mathnormal mtight" style="margin-right:0.01968em">pl</span><span class="mord mathnormal mtight">es</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9721em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.02691em">Xw</span><span 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.1141em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em"><span style="top:-2.453em;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 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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><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="mord mathnormal" style="margin-right:0.0037em">α</span><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="mord"><span class="mord">∥</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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</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.0037em">α</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>w</mi><mi mathvariant="normal">∥</mi><mover accent="true"><mn>1</mn><mo>˙</mo></mover></mrow><annotation encoding="application/x-tex">\Vert w \Vert \dot 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1313em;vertical-align:-0.25em"></span><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="mord">∥</span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8813em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord">1</span></span><span style="top:-3.2134em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1389em"><span class="mord">˙</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>l</mi><mover accent="true"><mrow><mn>1</mn><mo>−</mo><mi>n</mi><mi>o</mi><mi>r</mi><mi>m</mi></mrow><mo>˙</mo></mover></mrow><annotation encoding="application/x-tex">l \dot {1-norm}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9646em;vertical-align:-0.0833em"></span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8813em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord"><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 class="mord mathnormal">n</span><span class="mord mathnormal" style="margin-right:0.02778em">or</span><span class="mord mathnormal">m</span></span></span><span style="top:-3.2134em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.1389em"><span class="mord">˙</span></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>Lasso,lasso_path:通过搜索所有可能的路径上的值来计算系数</p>
<p>LassoCV,LassoLarsCV,LassoLarsIC</p>
<p>多任务Lasso</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>w</mi><mo>=</mo><munder><mrow><mi>min</mi><mo>⁡</mo></mrow><mi>w</mi></munder><mfrac><mn>1</mn><mrow><mn>2</mn><msub><mi>n</mi><mrow><mi>s</mi><mi>a</mi><mi>m</mi><mi>p</mi><mi>l</mi><mi>e</mi><mi>s</mi></mrow></msub></mrow></mfrac><mi mathvariant="normal">∥</mi><mi>X</mi><mi>W</mi><mo>−</mo><mi>Y</mi><msubsup><mi mathvariant="normal">∥</mi><mrow><mi>F</mi><mi>r</mi><mi>o</mi></mrow><mn>2</mn></msubsup><mo>+</mo><mi>α</mi><mi mathvariant="normal">∥</mi><mi>W</mi><msub><mi mathvariant="normal">∥</mi><mn>21</mn></msub></mrow><annotation encoding="application/x-tex">w = \min_w\frac{1}{2n_{samples}}\Vert XW-Y\Vert_{Fro}^2+\alpha\Vert W \Vert_{21}
</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.02691em">w</span><span 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:2.2935em;vertical-align:-0.9721em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-2.4em;margin-left:0em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em">w</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span><span class="mop">min</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></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.3214em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</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 mtight"><span class="mord mathnormal mtight">s</span><span class="mord mathnormal mtight">am</span><span class="mord mathnormal mtight" style="margin-right:0.01968em">pl</span><span class="mord mathnormal mtight">es</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9721em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span 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.1141em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em"><span style="top:-2.453em;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.13889em">F</span><span class="mord mathnormal mtight">ro</span></span></span></span><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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><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="mord mathnormal" style="margin-right:0.0037em">α</span><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="mord"><span class="mord">∥</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">21</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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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 mathvariant="normal">∥</mi><mi>A</mi><msub><mi mathvariant="normal">∥</mi><mrow><mi>F</mi><mi>r</mi><mi>o</mi></mrow></msub><mo>=</mo><msqrt><mrow><munder><mo>∑</mo><mrow><mi>i</mi><mi>j</mi></mrow></munder><msubsup><mi>a</mi><mrow><mi>i</mi><mi>j</mi></mrow><mn>2</mn></msubsup></mrow></msqrt></mrow><annotation encoding="application/x-tex">\Vert A \Vert_{Fro}=\sqrt{\sum_{ij}a_{ij}^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="mord">∥</span><span class="mord mathnormal">A</span><span class="mord"><span class="mord">∥</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 mathnormal mtight" style="margin-right:0.13889em">F</span><span class="mord mathnormal mtight">ro</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:3.04em;vertical-align:-1.588em"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.452em"><span class="svg-align" style="top:-5em"><span class="pstrut" style="height:5em"></span><span class="mord" style="padding-left:1em"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em">ij</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4138em"><span></span></span></span></span></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.7959em"><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" style="margin-right:0.05724em">ij</span></span></span></span><span style="top:-3.0448em;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.413em"><span></span></span></span></span></span></span></span></span><span style="top:-3.412em"><span class="pstrut" style="height:5em"></span><span class="hide-tail" style="min-width:1.02em;height:3.08em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="3.08em" viewBox="0 0 400000 3240" preserveAspectRatio="xMinYMin slice"><path d="M473,2793
c339.3,-1799.3,509.3,-2700,510,-2702 l0 -0
c3.3,-7.3,9.3,-11,18,-11 H400000v40H1017.7
s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9
c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200
c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26
s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,
606zM1001 80h400000v40H1017.7z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.588em"><span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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 mathvariant="normal">∥</mi><mi>A</mi><msub><mi mathvariant="normal">∥</mi><mn>21</mn></msub><mo>=</mo><munder><mo>∑</mo><mi>i</mi></munder><msqrt><mrow><munder><mo>∑</mo><mi>j</mi></munder><msubsup><mi>a</mi><mrow><mi>i</mi><mi>j</mi></mrow><mn>2</mn></msubsup></mrow></msqrt></mrow><annotation encoding="application/x-tex">\Vert A \Vert_{21}= \sum_i\sqrt{\sum_j a_{ij}^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="mord">∥</span><span class="mord mathnormal">A</span><span class="mord"><span class="mord">∥</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">21</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:3.04em;vertical-align:-1.588em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.452em"><span class="svg-align" style="top:-5em"><span class="pstrut" style="height:5em"></span><span class="mord" style="padding-left:1em"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05724em">j</span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4138em"><span></span></span></span></span></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.7959em"><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" style="margin-right:0.05724em">ij</span></span></span></span><span style="top:-3.0448em;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.413em"><span></span></span></span></span></span></span></span></span><span style="top:-3.412em"><span class="pstrut" style="height:5em"></span><span class="hide-tail" style="min-width:1.02em;height:3.08em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="3.08em" viewBox="0 0 400000 3240" preserveAspectRatio="xMinYMin slice"><path d="M473,2793
c339.3,-1799.3,509.3,-2700,510,-2702 l0 -0
c3.3,-7.3,9.3,-11,18,-11 H400000v40H1017.7
s-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9
c-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200
c0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26
s76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,
606zM1001 80h400000v40H1017.7z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.588em"><span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>MultiTaskLasso</p>
<p>弹性网络</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>w</mi><mo>=</mo><munder><mrow><mi>min</mi><mo>⁡</mo></mrow><mi>w</mi></munder><mfrac><mn>1</mn><mrow><mn>2</mn><msub><mi>n</mi><mrow><mi>s</mi><mi>a</mi><mi>m</mi><mi>p</mi><mi>l</mi><mi>e</mi><mi>s</mi></mrow></msub></mrow></mfrac><mi mathvariant="normal">∥</mi><mi>X</mi><mi>w</mi><mo>−</mo><mi>Y</mi><msubsup><mi mathvariant="normal">∥</mi><mn>2</mn><mn>2</mn></msubsup><mo>+</mo><mi>α</mi><mi>ρ</mi><mi mathvariant="normal">∥</mi><mi>w</mi><msub><mi mathvariant="normal">∥</mi><mn>1</mn></msub><mo>+</mo><mfrac><mrow><mi>α</mi><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>ρ</mi><mo stretchy="false">)</mo></mrow><mn>2</mn></mfrac><mi mathvariant="normal">∥</mi><mi>w</mi><msubsup><mi mathvariant="normal">∥</mi><mn>2</mn><mn>2</mn></msubsup></mrow><annotation encoding="application/x-tex">w = \min_w\frac{1}{2n_{samples}}\Vert Xw-Y\Vert_2^2+\alpha\rho\Vert w \Vert_{1}+\frac{\alpha(1-\rho)}{2}\Vert w\Vert_2^2
</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.02691em">w</span><span 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:2.2935em;vertical-align:-0.9721em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-2.4em;margin-left:0em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em">w</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span><span class="mop">min</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></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.3214em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</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 mtight"><span class="mord mathnormal mtight">s</span><span class="mord mathnormal mtight">am</span><span class="mord mathnormal mtight" style="margin-right:0.01968em">pl</span><span class="mord mathnormal mtight">es</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9721em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.02691em">Xw</span><span 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.1141em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em"><span style="top:-2.453em;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 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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><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="mord mathnormal" style="margin-right:0.0037em">α</span><span class="mord mathnormal">ρ</span><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="mord"><span class="mord">∥</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">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:2.113em;vertical-align:-0.686em"></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.427em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span class="mopen">(</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 class="mord mathnormal">ρ</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em"><span style="top:-2.453em;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 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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>ElasticNetCV通过交叉验证来设置参数<code>alpha</code>(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</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.0037em">α</span></span></span></span>)和<code>l1_rati0</code>(<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>ρ</mi></mrow><annotation encoding="application/x-tex">\rho</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">ρ</span></span></span></span>)</p>
<p>多任务弹性网络</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>W</mi><mo>=</mo><munder><mrow><mi>min</mi><mo>⁡</mo></mrow><mi>W</mi></munder><mfrac><mn>1</mn><mrow><mn>2</mn><msub><mi>n</mi><mrow><mi>s</mi><mi>a</mi><mi>m</mi><mi>p</mi><mi>l</mi><mi>e</mi><mi>s</mi></mrow></msub></mrow></mfrac><mi mathvariant="normal">∥</mi><mi>X</mi><mi>W</mi><mo>−</mo><mi>Y</mi><msubsup><mi mathvariant="normal">∥</mi><mrow><mi>F</mi><mi>r</mi><mi>o</mi></mrow><mn>2</mn></msubsup><mo>+</mo><mi>α</mi><mi>ρ</mi><mi mathvariant="normal">∥</mi><mi>W</mi><msub><mi mathvariant="normal">∥</mi><mn>21</mn></msub><mo>+</mo><mfrac><mrow><mi>α</mi><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>ρ</mi><mo stretchy="false">)</mo></mrow><mn>2</mn></mfrac><mi mathvariant="normal">∥</mi><mi>w</mi><msubsup><mi mathvariant="normal">∥</mi><mrow><mi>F</mi><mi>r</mi><mi>o</mi></mrow><mn>2</mn></msubsup></mrow><annotation encoding="application/x-tex">W = \min_W\frac{1}{2n_{samples}}\Vert XW-Y\Vert_{Fro}^2+\alpha\rho\Vert W \Vert_{21}+\frac{\alpha(1-\rho)}{2}\Vert w\Vert_{Fro}^2
</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">W</span><span 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:2.2935em;vertical-align:-0.9721em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-2.3557em;margin-left:0em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.13889em">W</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span><span class="mop">min</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7443em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></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.3214em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</span><span class="mord"><span class="mord mathnormal">n</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 mtight"><span class="mord mathnormal mtight">s</span><span class="mord mathnormal mtight">am</span><span class="mord mathnormal mtight" style="margin-right:0.01968em">pl</span><span class="mord mathnormal mtight">es</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.9721em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span 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.1141em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em"><span style="top:-2.453em;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.13889em">F</span><span class="mord mathnormal mtight">ro</span></span></span></span><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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><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="mord mathnormal" style="margin-right:0.0037em">α</span><span class="mord mathnormal">ρ</span><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="mord"><span class="mord">∥</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">21</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:2.113em;vertical-align:-0.686em"></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.427em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span class="mopen">(</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 class="mord mathnormal">ρ</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord">∥</span><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="mord"><span class="mord">∥</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em"><span style="top:-2.453em;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.13889em">F</span><span class="mord mathnormal mtight">ro</span></span></span></span><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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>MultiTaskElasticNet</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[集成学习算法总结]]></title>
        <id>/blog/2019/hexo-集成学习算法总结</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-集成学习算法总结"/>
        <updated>2019-08-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文总结了集成学习中的几种核心算法。内容主要介绍了Bagging（如随机森林）和Boosting（如AdaBoost）两大类方法的思想和区别。此外，还详细阐述了梯度提升（Gradient Boosting）算法的原理和步骤，并点明了随机森林、提升树和GBDT等模型分别是Bagging或Boosting与决策树结合的产物，为理解集成学习提供了清晰的框架。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="集成学习算法总结"><a href="#集成学习算法总结" class="rp-header-anchor rp-link" aria-hidden="true">#</a>集成学习算法总结<!-- --> </h1>
<p>集成学习算法是指使用多个分类器提高整体的泛化能力</p>
<h2 class="rp-toc-include" id="1baggingbootstrap-aggregating算法"><a href="#1baggingbootstrap-aggregating算法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.Bagging（Bootstrap Aggregating）算法</h2>
<p>通过组合随机生成的训练集而改进分类的集成算法(bootstrap)</p>
<p>使用训练集中的某个子集作为当前训练集（有放回随机抽样）;经过T次训练后,得到T个不同的分类器</p>
<p>调用这T个分类器,把这T个分类结果中出现次数多的类赋予测试样例</p>
<p>有效减少噪声影响</p>
<h2 class="rp-toc-include" id="2boosting算法"><a href="#2boosting算法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.Boosting算法</h2>
<p>初始化样本权重,生成一个弱分类器;</p>
<p>利用弱分类器增加分类错误的样本的权重;</p>
<p>不断重复,生成T个弱分类器;</p>
<p>对噪声敏感</p>
<p>改进算法-AdaBoosting算法</p>
<ul>
<li>对每一次的训练数据样本赋予一个权重，并且每一次样本的权重分布依赖上一次的分类结果</li>
<li>基分类器之间采用序列的线性加权方式来组合</li>
</ul>
<h2 class="rp-toc-include" id="3gradient-boosting"><a href="#3gradient-boosting" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.Gradient Boosting</h2>
<p>1,初始化</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>f</mi><mn>0</mn></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mi>arg</mi><mo>⁡</mo><munder><mrow><mi>min</mi><mo>⁡</mo></mrow><mi>γ</mi></munder><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mi>L</mi><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo separator="true">,</mo><mi>γ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f_0(x)=\arg\min_\gamma\sum_{i=1}^NL(y_i,\gamma)
</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.10764em">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.1076em;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="mopen">(</span><span class="mord mathnormal">x</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:3.106em;vertical-align:-1.2777em"></span><span class="mop">ar<span style="margin-right:0.01389em">g</span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-2.4em;margin-left:0em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.05556em">γ</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span><span class="mop">min</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8361em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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 mathnormal" style="margin-right:0.05556em">γ</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.1计算负梯度</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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><mover accent="true"><mi>y</mi><mo stretchy="true">~</mo></mover><mi>i</mi></msub><mo>=</mo><mo>−</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>f</mi><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">∂</mi><msub><mi>f</mi><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow></mfrac><mo separator="true">,</mo><mi>i</mi><mo>=</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mo>⋯</mo><mi>N</mi></mrow><annotation encoding="application/x-tex">\widetilde y_i = -\frac{\partial L(y_i,f_{m-1}(x_i))}{\partial f_{m-1}(x_i)}, i=1,2,\cdots N
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.885em;vertical-align:-0.1944em"></span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6906em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span class="svg-align" style="width:calc(100% - 0.1111em);margin-left:0.1111em;top:-3.4306em"><span class="pstrut" style="height:3em"></span><span style="height:0.26em"><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="0.26em" viewBox="0 0 600 260" preserveAspectRatio="none"><path d="M200 55.538c-77 0-168 73.953-177 73.953-3 0-7
-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0
 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0
 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128
-68.267.847-113-73.952-191-73.952z"></path></svg></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="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.0359em;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:2.363em;vertical-align:-0.936em"></span><span class="mord">−</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.427em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em">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.1076em;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">m</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="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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 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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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.10764em">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.1076em;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">m</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="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">i</span><span 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">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="minner">⋯</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.10903em">N</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.2用基学习器<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>h</mi><mi>m</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">h_m(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"><span class="mord mathnormal">h</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">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="mopen">(</span><span class="mord mathnormal">x</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><mover accent="true"><mi>y</mi><mo stretchy="true">~</mo></mover><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">\widetilde y_i</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.885em;vertical-align:-0.1944em"></span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6906em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span class="svg-align" style="width:calc(100% - 0.1111em);margin-left:0.1111em;top:-3.4306em"><span class="pstrut" style="height:3em"></span><span style="height:0.26em"><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="0.26em" viewBox="0 0 600 260" preserveAspectRatio="none"><path d="M200 55.538c-77 0-168 73.953-177 73.953-3 0-7
-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0
 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0
 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128
-68.267.847-113-73.952-191-73.952z"></path></svg></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="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.0359em;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>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>w</mi><mi>m</mi></msub><mo>=</mo><munder><mo><mi>arg</mi><mo>⁡</mo><mi>min</mi><mo>⁡</mo></mo><mi>w</mi></munder><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mo stretchy="false">[</mo><msub><mover accent="true"><mi>y</mi><mo stretchy="true">~</mo></mover><mi>i</mi></msub><mo>−</mo><msub><mi>h</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo separator="true">;</mo><mi>w</mi><mo stretchy="false">)</mo><msup><mo stretchy="false">]</mo><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">w_m=\mathop{\arg\min}\limits_w\sum_{i=1}^N[\widetilde y_i-h_m(x_i;w)]^2
</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" style="margin-right:0.02691em">w</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.0269em;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="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:3.106em;vertical-align:-1.2777em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-2.2056em;margin-left:0em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em">w</span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span><span class="mop"><span class="mop">ar<span style="margin-right:0.01389em">g</span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop">min</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8944em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight" style="margin-right:0.10903em">N</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em"><span></span></span></span></span></span><span class="mopen">[</span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6906em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span class="svg-align" style="width:calc(100% - 0.1111em);margin-left:0.1111em;top:-3.4306em"><span class="pstrut" style="height:3em"></span><span style="height:0.26em"><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="0.26em" viewBox="0 0 600 260" preserveAspectRatio="none"><path d="M200 55.538c-77 0-168 73.953-177 73.953-3 0-7
-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0
 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0
 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128
-68.267.847-113-73.952-191-73.952z"></path></svg></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="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.0359em;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:1.1141em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal">h</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">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="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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 mathnormal" style="margin-right:0.02691em">w</span><span class="mclose">)</span><span class="mclose"><span class="mclose">]</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">2</span></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.3确定步长<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>ρ</mi><mi>m</mi></msub></mrow><annotation encoding="application/x-tex">\rho_m</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">ρ</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">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></span></span></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>ρ</mi><mi>m</mi></msub><mo>=</mo><munder><mo><mi>arg</mi><mo>⁡</mo><mi>min</mi><mo>⁡</mo></mo><mi>ρ</mi></munder><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mi>L</mi><mo stretchy="false">(</mo><msub><mi>y</mi><mi>i</mi></msub><mo separator="true">,</mo><msub><mi>f</mi><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>+</mo><mi>ρ</mi><msub><mi>h</mi><mi>m</mi></msub><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mtext> </mtext><mo separator="true">;</mo><mtext> </mtext><msub><mi>w</mi><mi>m</mi></msub><mo stretchy="false">)</mo><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\rho_m = \mathop{\arg\min}\limits_{\rho} \sum\limits_{i=1}^{N} L(y_i,f_{m-1}(x_i) + \rho h_m(x_i\,;\,w_m))
</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">ρ</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">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="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:3.106em;vertical-align:-1.2777em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6679em"><span style="top:-2.2056em;margin-left:0em"><span class="pstrut" style="height:3em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">ρ</span></span></span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span><span class="mop"><span class="mop">ar<span style="margin-right:0.01389em">g</span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop">min</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.0305em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">y</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.0359em;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.10764em">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.1076em;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">m</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="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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.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">ρ</span><span class="mord"><span class="mord mathnormal">h</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">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="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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="mpunct">;</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.4更新<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>f</mi><mi>m</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f_m(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"><span class="mord mathnormal" style="margin-right:0.10764em">f</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.1076em;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="mopen">(</span><span class="mord mathnormal">x</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>f</mi><mi>M</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f_M(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"><span class="mord mathnormal" style="margin-right:0.10764em">f</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.1076em;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.10903em">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="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span></span></span></span></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>f</mi><mi>m</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>f</mi><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>+</mo><msub><mi>ρ</mi><mi>m</mi></msub><msub><mi>h</mi><mi>m</mi></msub><mo stretchy="false">(</mo><mi>x</mi><mtext> </mtext><mo separator="true">;</mo><mtext> </mtext><msub><mi>w</mi><mi>m</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f_m(x) = f_{m-1}(x) + \rho_m h_m(x\,;\,w_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="mord"><span class="mord mathnormal" style="margin-right:0.10764em">f</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.1076em;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="mopen">(</span><span class="mord mathnormal">x</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="mord"><span class="mord mathnormal" style="margin-right:0.10764em">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.1076em;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">m</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="mopen">(</span><span class="mord mathnormal">x</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="mord"><span class="mord mathnormal">ρ</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">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="mord"><span class="mord mathnormal">h</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">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="mopen">(</span><span class="mord mathnormal">x</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="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>Bagging + 决策树 = 随机森林</p>
<p>AdaBoost + 决策树 = 提升树</p>
<p>Gradient Boosting + 决策树 = GBDT</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[信息论的一些基本概念]]></title>
        <id>/blog/2019/hexo-信息论的一些基本概念</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-信息论的一些基本概念"/>
        <updated>2019-08-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文简明扼要地介绍了信息论中的几个核心基本概念。内容涵盖了信息熵、条件熵、信息增益、基尼系数（基尼不纯度）、信息增益比率、分裂信息、边界熵以及边界多样性（Accessor Variety, AV）的定义和数学公式。这些概念是机器学习，特别是决策树和自然语言处理中进行特征选择和模型评估的基础。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="信息论的一些基本概念"><a href="#信息论的一些基本概念" class="rp-header-anchor rp-link" aria-hidden="true">#</a>信息论的一些基本概念<!-- --> </h1>
<p><strong>信息熵</strong></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>H</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><mi>E</mi><mo stretchy="false">[</mo><mi>I</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo><mo>=</mo><mi>E</mi><mo stretchy="false">[</mo><mo>−</mo><mi>l</mi><mi>n</mi><mo stretchy="false">(</mo><mi>P</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">H(X)=E[I(X)]=E[-ln(P(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.08125em">H</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</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="mord mathnormal" style="margin-right:0.05764em">E</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.07847em">I</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</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="mord mathnormal" style="margin-right:0.05764em">E</span><span class="mopen">[</span><span class="mord">−</span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal">n</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mclose">))]</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></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.6833em"></span><span class="mord mathnormal" style="margin-right:0.13889em">P</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.6833em"></span><span class="mord mathnormal" style="margin-right:0.07847em">X</span></span></span></span>的概率质量函数,<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi></mrow><annotation encoding="application/x-tex">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.05764em">E</span></span></span></span>为期望函数,而<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>I</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">I(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.07847em">I</span><span class="mopen">(</span><span class="mord mathnormal">x</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>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.6833em"></span><span class="mord mathnormal" style="margin-right:0.07847em">X</span></span></span></span>的信息量(又称自信息).</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>H</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><munder><mo>∑</mo><mi>i</mi></munder><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mi>I</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><munder><mo>∑</mo><mi>i</mi></munder><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo><msub><mrow><mi>log</mi><mo>⁡</mo></mrow><mi>b</mi></msub><mi>P</mi><mo stretchy="false">(</mo><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(X)=\sum_iP(x_i)I(x_i)=-\sum_iP(x_i)\log_bP(x_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="mord mathnormal" style="margin-right:0.08125em">H</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</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:2.3277em;vertical-align:-1.2777em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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="mord mathnormal" style="margin-right:0.07847em">I</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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:2.3277em;vertical-align:-1.2777em"></span><span class="mord">−</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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.1667em"></span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.242em"><span style="top:-2.4559em;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.2441em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable rowspacing="0.16em" columnalign="center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>b</mi></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>S</mi></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>2</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>b</mi><mi>i</mi><mi>t</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mi>e</mi></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>n</mi><mi>a</mi><mi>t</mi></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mn>10</mn></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mi>H</mi><mi>a</mi><mi>r</mi><mi>t</mi></mrow></mstyle></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{matrix}
b &amp; S\cr
2 &amp; bit\cr
e &amp; nat\cr
10 &amp; Hart
\end{matrix}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:4.8em;vertical-align:-2.15em"></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em"><span style="top:-4.81em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">b</span></span></span><span style="top:-3.61em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-2.41em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">e</span></span></span><span style="top:-1.21em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord">10</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.65em"><span style="top:-4.81em"><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.61em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">bi</span><span class="mord mathnormal">t</span></span></span><span style="top:-2.41em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal">na</span><span class="mord mathnormal">t</span></span></span><span style="top:-1.21em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.08125em">H</span><span class="mord mathnormal">a</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span><span class="mord mathnormal">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:2.15em"><span></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><strong>条件熵(Conditional Entropy)</strong></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><msub><mi>x</mi><mi>i</mi></msub></mrow><annotation encoding="application/x-tex">x_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">x</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><mi>H</mi><mo stretchy="false">(</mo><mi>c</mi><mi mathvariant="normal">∣</mi><msub><mi>x</mi><mi>i</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(c|x_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="mord mathnormal" style="margin-right:0.08125em">H</span><span class="mopen">(</span><span class="mord mathnormal">c</span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal">x</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></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>H</mi><mo stretchy="false">(</mo><mi>x</mi><mi mathvariant="normal">∣</mi><mi>X</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">H(x|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.08125em">H</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mclose">)</span></span></span></span></p>
<p><strong>信息增益(Information Gain)</strong></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>I</mi><mi>G</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><mi>H</mi><mo stretchy="false">(</mo><mi>c</mi><mo stretchy="false">)</mo><mo>−</mo><mi>H</mi><mo stretchy="false">(</mo><mi>c</mi><mi mathvariant="normal">∣</mi><mi>X</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">IG(X) = H(c)-H(c|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.07847em">I</span><span class="mord mathnormal">G</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</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="mord mathnormal" style="margin-right:0.08125em">H</span><span class="mopen">(</span><span class="mord mathnormal">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="mord mathnormal" style="margin-right:0.08125em">H</span><span class="mopen">(</span><span class="mord mathnormal">c</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><strong>基尼系数(基尼不纯度Gini impurity)</strong></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>G</mi><mi>i</mi><mi>n</mi><mi>i</mi><mo stretchy="false">(</mo><mi>D</mi><mo stretchy="false">)</mo><mo>=</mo><mn>1</mn><mo>−</mo><munderover><mo>∑</mo><mi>i</mi><mi>n</mi></munderover><msubsup><mi>p</mi><mi>i</mi><mn>2</mn></msubsup></mrow><annotation encoding="application/x-tex">Gini(D)=1-\sum_i^np_i^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="mord mathnormal">G</span><span class="mord mathnormal">ini</span><span class="mopen">(</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.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:2.9291em;vertical-align:-1.2777em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><span></span></span></span></span></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.8641em"><span style="top:-2.453em;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 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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>G</mi><mi>i</mi><mi>n</mi><mi>i</mi><mo stretchy="false">(</mo><mi>D</mi><mi mathvariant="normal">∣</mi><mi>A</mi><mo stretchy="false">)</mo><mo>=</mo><munderover><mo>∑</mo><mi>i</mi><mi>n</mi></munderover><mfrac><msub><mi>D</mi><mi>i</mi></msub><mi>D</mi></mfrac></mrow><annotation encoding="application/x-tex">Gini(D|A)=\sum_i^n\frac {D_i}{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">G</span><span class="mord mathnormal">ini</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em">D</span><span class="mord">∣</span><span class="mord mathnormal">A</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:2.9291em;vertical-align:-1.2777em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></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.3603em"><span style="top:-2.314em"><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.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><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 class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><strong>信息增益比率(Information Gain Ratio)与分裂信息(Split information)</strong></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>G</mi><mi>R</mi><mo stretchy="false">(</mo><mi>D</mi><mi mathvariant="normal">∣</mi><mi>A</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mrow><mi>I</mi><mi>G</mi><mo stretchy="false">(</mo><mi>D</mi><mi mathvariant="normal">∣</mi><mi>A</mi><mo stretchy="false">)</mo></mrow><mrow><mi>S</mi><mi>I</mi><mo stretchy="false">(</mo><mi>D</mi><mi mathvariant="normal">∣</mi><mi>A</mi><mo stretchy="false">)</mo></mrow></mfrac></mrow><annotation encoding="application/x-tex">GR(D|A)=\frac {IG(D|A)}{SI(D|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="mord mathnormal" style="margin-right:0.00773em">GR</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em">D</span><span class="mord">∣</span><span class="mord mathnormal">A</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:2.363em;vertical-align:-0.936em"></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.427em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05764em">S</span><span class="mord mathnormal" style="margin-right:0.07847em">I</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em">D</span><span class="mord">∣</span><span class="mord mathnormal">A</span><span class="mclose">)</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.07847em">I</span><span class="mord mathnormal">G</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em">D</span><span class="mord">∣</span><span class="mord mathnormal">A</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>S</mi><mi>I</mi><mo stretchy="false">(</mo><mi>D</mi><mi mathvariant="normal">∣</mi><mi>A</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><munderover><mo>∑</mo><mi>i</mi><mi>n</mi></munderover><mfrac><msub><mi>N</mi><mi>i</mi></msub><mi>N</mi></mfrac><msub><mrow><mi>log</mi><mo>⁡</mo></mrow><mn>2</mn></msub><mfrac><msub><mi>N</mi><mi>i</mi></msub><mi>N</mi></mfrac></mrow><annotation encoding="application/x-tex">SI(D|A)=-\sum_i^n\frac {N_i}{N}\log_2\frac{N_i}{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.05764em">S</span><span class="mord mathnormal" style="margin-right:0.07847em">I</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em">D</span><span class="mord">∣</span><span class="mord mathnormal">A</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:2.9291em;vertical-align:-1.2777em"></span><span class="mord">−</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.6514em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">i</span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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:1.2777em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></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.3603em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em">N</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em">N</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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop"><span class="mop">lo<span style="margin-right:0.01389em">g</span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.207em"><span style="top:-2.4559em;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.2441em"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></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.3603em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em">N</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.10903em">N</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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><strong>边界熵(boundary entropy)</strong></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>B</mi><mi>E</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>2</mn></msub><mo>⋯</mo><msub><mi>w</mi><mi>k</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><munder><mo>∑</mo><mrow><mi>w</mi><mo>∈</mo><mi>C</mi></mrow></munder><mi>p</mi><mo stretchy="false">(</mo><mi>w</mi><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>2</mn></msub><mo>⋯</mo><msub><mi>w</mi><mi>k</mi></msub><mo stretchy="false">)</mo><mi>log</mi><mo>⁡</mo><mi>p</mi><mo stretchy="false">(</mo><mi>w</mi><mi mathvariant="normal">∣</mi><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>2</mn></msub><mo>⋯</mo><msub><mi>w</mi><mi>k</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">BE(w_1w_2\cdots w_k) = -\sum_{w \in C}p(w\vert w_1w_2\cdots w_k)\log p(w\vert w_1w_2\cdots w_k)
</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.05764em">BE</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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.02691em">w</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.0269em;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.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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0269em;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 class="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:2.3717em;vertical-align:-1.3217em"></span><span class="mord">−</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.05em"><span style="top:-1.8557em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight" style="margin-right:0.02691em">w</span><span class="mrel mtight">∈</span><span class="mord mathnormal mtight" style="margin-right:0.07153em">C</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.3217em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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.02691em">w</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.0269em;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.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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0269em;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 class="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.1667em"></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 mathnormal">p</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02691em">w</span><span class="mord">∣</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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.02691em">w</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.0269em;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.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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0269em;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 class="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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>w</mi></mrow><annotation encoding="application/x-tex">w</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.02691em">w</span></span></span></span>是邻接于<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>2</mn></msub><mo>⋯</mo><msub><mi>w</mi><mi>k</mi></msub></mrow><annotation encoding="application/x-tex">w_1w_2 \cdots w_k</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" style="margin-right:0.02691em">w</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.0269em;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.02691em">w</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.0269em;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.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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0269em;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 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><strong>边界多样性(Accessor veriety,AV)</strong></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>A</mi><mi>V</mi><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>2</mn></msub><mo>⋯</mo><msub><mi>w</mi><mi>k</mi></msub><mo stretchy="false">)</mo><mo>=</mo><mi>log</mi><mo>⁡</mo><mi>R</mi><msub><mi>L</mi><mrow><mi>a</mi><mi>v</mi></mrow></msub><mo stretchy="false">(</mo><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>2</mn></msub><mo>⋯</mo><msub><mi>w</mi><mi>k</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">AV(w_1w_2\cdots w_k)=\log RL_{av}(w_1w_2\cdots w_k)
</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="mord mathnormal" style="margin-right:0.22222em">V</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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.02691em">w</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.0269em;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.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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0269em;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 class="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:1em;vertical-align:-0.25em"></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 mathnormal" style="margin-right:0.00773em">R</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.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 mtight"><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.03588em">v</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"><span class="mord mathnormal" style="margin-right:0.02691em">w</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.0269em;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.02691em">w</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.0269em;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.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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0269em;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 class="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></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>R</mi><msub><mi>L</mi><mrow><mi>a</mi><mi>v</mi></mrow></msub></mrow><annotation encoding="application/x-tex">RL_{av}</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.00773em">R</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.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 mtight"><span class="mord mathnormal mtight">a</span><span class="mord mathnormal mtight" style="margin-right:0.03588em">v</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><msub><mi>w</mi><mn>1</mn></msub><msub><mi>w</mi><mn>2</mn></msub><mo>⋯</mo><msub><mi>w</mi><mi>k</mi></msub></mrow><annotation encoding="application/x-tex">w_1w_2 \cdots w_k</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" style="margin-right:0.02691em">w</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.0269em;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.02691em">w</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.0269em;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.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.02691em">w</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3361em"><span style="top:-2.55em;margin-left:-0.0269em;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 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><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[mathjax配置问题]]></title>
        <id>/blog/2019/hexo-mathjax配置问题</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-mathjax配置问题"/>
        <updated>2019-08-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文解决了在使用Hexo时MathJax无法正确渲染单行公式的问题。文章指出，MathJax自2.3版本后配置方式发生变化，旧的`MathJax.Hub.Config`配置不再适用。文中提供了新的配置方法，即使用`window.MathJax`对象进行设置，并提及了解决Hexo默认转义问题的方法，确保公式能正确显示。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="mathjax配置问题"><a href="#mathjax配置问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>mathjax配置问题<!-- --> </h1>
<p>使用hexo时，想要实现网页中公式的渲染<br/>
发现不管怎么改，都不能渲染单行公式<br/>
最后发现是在mathjax的2.3版本以后，配置方法变了</p>
<p>mathjax的配置方法</p>
<p>一般网上大部分的mathjax的配置如下</p>
<div class="rp-codeblock language-html"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="html"><code><span class="line"><span style="color:var(--shiki-foreground)">    &lt;</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-token-function)"> type</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;text/x-mathjax-config&quot;</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      MathJax.Hub.Config({</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        tex2jax: {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">          inlineMath: [ [&#x27;$&#x27;,&#x27;$&#x27;], [&quot;\\(&quot;,&quot;\\)&quot;] ],</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">          processEscapes: true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      });</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    &lt;/</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    &lt;</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-token-function)"> type</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;text/javascript&quot;</span><span style="color:var(--shiki-token-function)"> src</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;path-to-MathJax/MathJax.js?config=TeX-AMS_HTML&quot;</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    &lt;/</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-foreground)">&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>其中配置中这一句主要是增加对单行公式的渲染</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>inlineMath: [ [&#x27;$&#x27;,&#x27;$&#x27;], [&quot;\\(&quot;,&quot;\\)&quot;] ],</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>有时候会发现无论如修改单行公式总是不能渲染<br/>
原因是在mathjax的2.3版本以后，应该这样配置</p>
<div class="rp-codeblock language-html"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="html"><code><span class="line"><span style="color:var(--shiki-foreground)">    &lt;</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-token-function)"> type</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;text/javascript&quot;</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">      window</span><span style="color:var(--shiki-foreground)">.MathJax </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        tex2jax</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">          inlineMath</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> [ [</span><span style="color:var(--shiki-token-string-expression)">&#x27;$&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&#x27;$&#x27;</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> [</span><span style="color:var(--shiki-token-string-expression)">&quot;\\(&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;\\)&quot;</span><span style="color:var(--shiki-foreground)">] ]</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">          processEscapes</span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-token-constant)"> true</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">      };</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    &lt;/</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    &lt;</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-token-function)"> type</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;text/javascript&quot;</span><span style="color:var(--shiki-token-function)"> src</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;path-to-MathJax/MathJax.js?config=TeX-AMS_HTML&quot;</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    &lt;/</span><span style="color:var(--shiki-token-string-expression)">script</span><span style="color:var(--shiki-foreground)">&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>对于<code>hexo</code>默认转义规则使单行公式显示错误的问题,查看<a href="https://ranmaosong.github.io/2017/11/29/hexo-support-mathjax/" target="_blank" rel="noopener noreferrer" class="rp-link">这篇博客</a></p>
<p>参考资料</p>
<p>1,<a href="https://docs.mathjax.org/en/latest/configuration.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://docs.mathjax.org/en/latest/configuration.html</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[pytorch使用和损失函数]]></title>
        <id>/blog/2019/hexo-pytorch使用和损失函数</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-pytorch使用和损失函数"/>
        <updated>2019-07-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文总结了PyTorch框架中的常用操作和损失函数。内容首先介绍了激活函数和BatchNorm2d等层，以及`normalize`, `cat`, `stack`等张量操作。接着，详细列举并解释了多种损失函数，如L1Loss, MSELoss, CrossEntropyLoss, NLLLoss, BCELoss, HingeEmbeddingLoss, CosineEmbeddingLoss等，并给出了它们的数学公式，为PyTorch使用者提供了全面的参考。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="pytorch使用和损失函数"><a href="#pytorch使用和损失函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>pytorch使用和损失函数<!-- --> </h1>
<h1 class="rp-toc-include" id="激励函数"><a href="#激励函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>激励函数<!-- --> </h1>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-comment)">#激活函数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">x</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">arange</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-constant)">12.5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">12.5</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0.05</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">tanh </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">power</span><span style="color:var(--shiki-token-punctuation)">(np.e,x)</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">power</span><span style="color:var(--shiki-token-punctuation)">(np.e,</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-punctuation)">x)</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">(np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">power</span><span style="color:var(--shiki-token-punctuation)">(np.e,x)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">power</span><span style="color:var(--shiki-token-punctuation)">(np.e,</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-punctuation)">x)</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">relu </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">maximum</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">0.0</span><span style="color:var(--shiki-token-punctuation)">,x)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">sigmoid </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1.0</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1.0</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">power</span><span style="color:var(--shiki-token-punctuation)">(np.e,</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-punctuation)">x)</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Sigmoid</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Tanh</span><span style="color:var(--shiki-token-punctuation)">()</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>BatchNorm2d</p>
<p>对每一个特征进行正则</p>
<p>pytorch中的正则化函数</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">functional</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">normalize</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">input</span><span style="color:var(--shiki-token-punctuation)">, p</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">, dim</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">, eps</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1e-12</span><span style="color:var(--shiki-token-punctuation)">, out</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">norm</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">input</span><span style="color:var(--shiki-token-punctuation)">, p</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;fro&#x27;</span><span style="color:var(--shiki-token-punctuation)">, dim</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, keepdim</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">False</span><span style="color:var(--shiki-token-punctuation)">, out</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, dtype</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 对维度dim求p范数</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Tensor</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">squeeze</span><span style="color:var(--shiki-token-punctuation)">()</span><span style="color:var(--shiki-foreground)">-&gt;Tensor</span><span style="color:var(--shiki-token-comment)">#维度压缩</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">cat</span><span style="color:var(--shiki-token-punctuation)">(tensors, dim</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">, out</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-foreground)">-&gt;Tensor </span><span style="color:var(--shiki-token-comment)">#维度拼接</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">stack</span><span style="color:var(--shiki-token-punctuation)">(tensors,dim</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">,out</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-foreground)">-&gt;Tensor </span><span style="color:var(--shiki-token-comment)">#张量拼接</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># cat是把多张纸拼成一张纸,stack是把纸摞起来</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Tensor</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">repeat</span><span style="color:var(--shiki-token-punctuation)">()</span><span style="color:var(--shiki-foreground)">-&gt;Tensor </span><span style="color:var(--shiki-token-comment)">#矩阵扩展</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">Tensor</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">transpose</span><span style="color:var(--shiki-token-punctuation)">()</span><span style="color:var(--shiki-foreground)">-&gt;Tensor </span><span style="color:var(--shiki-token-comment)">#矩阵转置</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">eq</span><span style="color:var(--shiki-token-punctuation)">()</span><span style="color:var(--shiki-token-comment)"> #张量比较</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">chunk</span><span style="color:var(--shiki-token-punctuation)">()</span><span style="color:var(--shiki-token-comment)"> #张量分块</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">split</span><span style="color:var(--shiki-token-punctuation)">(tensor, split_size_or_sections, dim</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-comment)"> #张量分块</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h1 class="rp-toc-include" id="损失函数"><a href="#损失函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>损失函数<!-- --> </h1>
<p>L1Loss</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">L1Loss</span><span style="color:var(--shiki-token-punctuation)">(size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>MSELoss</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">MSELoss</span><span style="color:var(--shiki-token-punctuation)">(size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>CrossEntropyLoss</p>
<p>交叉熵损失函数,多分类</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">CrossEntropyLoss</span><span style="color:var(--shiki-token-punctuation)">(weight</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, ignore_index</span><span style="color:var(--shiki-token-keyword)">=-</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">CTCLoss</span><span style="color:var(--shiki-token-punctuation)">(blank</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">, zero_infinity</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">False</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>NLLLoss</p>
<p>负对数似然损失函数(Negative Loss Likelihood),多分类</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">NLLLoss</span><span style="color:var(--shiki-token-punctuation)">(weight</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, ignore_index</span><span style="color:var(--shiki-token-keyword)">=-</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>PoissonNLLLoss</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">PoissonNLLLoss</span><span style="color:var(--shiki-token-punctuation)">(log_input</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">True</span><span style="color:var(--shiki-token-punctuation)">, full</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">False</span><span style="color:var(--shiki-token-punctuation)">, size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, eps</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1e-08</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>KLDivLoss</p>
<p>KL散度,又叫相对熵,计算两个分布之间的距离,越相近越接近零</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">KLDivLoss</span><span style="color:var(--shiki-token-punctuation)">(size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>BCELoss</p>
<p>二分类用的交叉熵</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">BCELoss</span><span style="color:var(--shiki-token-punctuation)">(weight</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>BCEWithLogitsLoss</p>
<p>增加了一个Sigmoid层</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">BCEWithLogitsLoss</span><span style="color:var(--shiki-token-punctuation)">(weight</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">, pos_weight</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>MarginRankingLoss</p>
<p>评价相似度的损失</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">MarginRankingLoss</span><span style="color:var(--shiki-token-punctuation)">(margin</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0.0</span><span style="color:var(--shiki-token-punctuation)">, size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>HingeEmbeddingLoss</p>
<p>用于学习非线性嵌入或半监督学习</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">HingeEmbeddingLoss</span><span style="color:var(--shiki-token-punctuation)">(margin</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1.0</span><span style="color:var(--shiki-token-punctuation)">, size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>MultiLabelMarginLoss</p>
<p>多类别多分类的Hinge损失</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">MultiLabelMarginLoss</span><span style="color:var(--shiki-token-punctuation)">(size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>∈</mo><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mtext>  </mtext><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><mtext>  </mtext><mtext>x.size</mtext><mo stretchy="false">(</mo><mn>0</mn><mo stretchy="false">)</mo><mo>−</mo><mn>1</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">x \in \lbrace 0, \; \cdots , \; \text{x.size}(0) - 1 \rbrace</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="mord mathnormal">x</span><span 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">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em"></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="mspace" style="margin-right:0.1667em"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord text"><span class="mord">x.size</span></span><span class="mopen">(</span><span class="mord">0</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="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>y</mi><mo>∈</mo><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mtext>  </mtext><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><mtext>  </mtext><mtext>y.size</mtext><mo stretchy="false">(</mo><mn>0</mn><mo stretchy="false">)</mo><mo>−</mo><mn>1</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">y \in \lbrace 0, \; \cdots , \; \text{y.size}(0) - 1 \rbrace</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7335em;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:1em;vertical-align:-0.25em"></span><span class="mopen">{</span><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em"></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="mspace" style="margin-right:0.1667em"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord text"><span class="mord">y.size</span></span><span class="mopen">(</span><span class="mord">0</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="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><mn>0</mn><mo>≤</mo><mi>y</mi><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo><mo>≤</mo><mtext>x.size</mtext><mo stretchy="false">(</mo><mn>0</mn><mo stretchy="false">)</mo><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">0 \leq y[j] \leq \text{x.size}(0)-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7804em;vertical-align:-0.136em"></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:1em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em">j</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="mord text"><span class="mord">x.size</span></span><span class="mopen">(</span><span class="mord">0</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.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>i</mi><mo mathvariant="normal">≠</mo><mi>y</mi><mo stretchy="false">[</mo><mi>j</mi><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">i \neq y[j] </annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</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="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.05724em">j</span><span class="mclose">]</span></span></span></span></p>
<p>SmoothL1Loss</p>
<p>也叫Huber Loss,误差在(-1,1)上是平方损失,其他情况是L1损失</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">SmoothL1Loss</span><span style="color:var(--shiki-token-punctuation)">(size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>SoftMarginLoss</p>
<p>多标签二分类问题</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">SoftMarginLoss</span><span style="color:var(--shiki-token-punctuation)">(size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>MultiLabelSoftMarginLoss</p>
<p>多标签多分类</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">MultiLabelSoftMarginLoss</span><span style="color:var(--shiki-token-punctuation)">(weight</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>i</mi><mo>∈</mo><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mtext>  </mtext><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><mtext>  </mtext><mtext>x.nElement</mtext><mo stretchy="false">(</mo><mo stretchy="false">)</mo><mo>−</mo><mn>1</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">i \in \lbrace 0, \; \cdots , \; \text{x.nElement}() - 1\rbrace</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6986em;vertical-align:-0.0391em"></span><span class="mord mathnormal">i</span><span 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">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em"></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="mspace" style="margin-right:0.1667em"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord text"><span class="mord">x.nElement</span></span><span class="mopen">(</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="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>y</mi><mo stretchy="false">[</mo><mi>i</mi><mo stretchy="false">]</mo><mo>∈</mo><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mtext>  </mtext><mn>1</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">y[i] \in \lbrace 0, \; 1 \rbrace</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.03588em">y</span><span class="mopen">[</span><span class="mord mathnormal">i</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">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord">1</span><span class="mclose">}</span></span></span></span></p>
<p>CosineEmbeddingLoss</p>
<p>余玄相似度损失</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">CosineEmbeddingLoss</span><span style="color:var(--shiki-token-punctuation)">(margin</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0.0</span><span style="color:var(--shiki-token-punctuation)">, size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>MultiMarginLoss</p>
<p>多分类的Hinge损失</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">MultiMarginLoss</span><span style="color:var(--shiki-token-punctuation)">(p</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">, margin</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1.0</span><span style="color:var(--shiki-token-punctuation)">, weight</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>∈</mo><mo stretchy="false">{</mo><mn>0</mn><mo separator="true">,</mo><mtext>  </mtext><mo>⋯</mo><mtext> </mtext><mo separator="true">,</mo><mtext>  </mtext><mtext>x.size</mtext><mo stretchy="false">(</mo><mn>0</mn><mo stretchy="false">)</mo><mo>−</mo><mn>1</mn><mo stretchy="false">}</mo></mrow><annotation encoding="application/x-tex">x \in \lbrace 0, \; \cdots , \; \text{x.size}(0) - 1 \rbrace </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="mord mathnormal">x</span><span 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">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em"></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="mspace" style="margin-right:0.1667em"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord text"><span class="mord">x.size</span></span><span class="mopen">(</span><span class="mord">0</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="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>i</mi><mo mathvariant="normal">≠</mo><mi>y</mi></mrow><annotation encoding="application/x-tex">i \neq y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em"></span><span class="mord mathnormal">i</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></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">y</span></span></span></span></p>
<p>TripletMarginLoss</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">TripletMarginLoss</span><span style="color:var(--shiki-token-punctuation)">(margin</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1.0</span><span style="color:var(--shiki-token-punctuation)">, p</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">2.0</span><span style="color:var(--shiki-token-punctuation)">, eps</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1e-06</span><span style="color:var(--shiki-token-punctuation)">, swap</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">False</span><span style="color:var(--shiki-token-punctuation)">, size_average</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduce</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">None</span><span style="color:var(--shiki-token-punctuation)">, reduction</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;mean&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[常见损失函数]]></title>
        <id>/blog/2019/hexo-常见损失函数</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-常见损失函数"/>
        <updated>2019-07-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了机器学习中常见的几种损失函数。内容包括0-1损失函数、平方损失函数、绝对损失函数以及对数损失函数（或称对数似然损失函数），并给出了它们的数学表达式。此外，文章还引入了风险函数的概念，即损失函数的期望值，并区分了经验风险和结构风险，为理解模型评估和优化提供了基础。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="常见损失函数"><a href="#常见损失函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>常见损失函数<!-- --> </h1>
<p>1.损失函数</p>
<blockquote>
<p><strong>损失函数</strong>是指一种将一个事件（在一个<a href="https://wiki.mbalib.com/wiki/%E6%A0%B7%E6%9C%AC" target="_blank" rel="noopener noreferrer" class="rp-link">样本</a>空间中的一个元素）映射到一个表达与其事件<a href="https://wiki.mbalib.com/wiki/%E7%9B%B8%E5%85%B3" target="_blank" rel="noopener noreferrer" class="rp-link">相关</a>的<a href="https://wiki.mbalib.com/wiki/%E7%BB%8F%E6%B5%8E%E6%88%90%E6%9C%AC" target="_blank" rel="noopener noreferrer" class="rp-link">经济成本</a>或<a href="https://wiki.mbalib.com/wiki/%E6%9C%BA%E4%BC%9A%E6%88%90%E6%9C%AC" target="_blank" rel="noopener noreferrer" class="rp-link">机会成本</a>的实数上的一种函数,较常运用在<a href="https://wiki.mbalib.com/wiki/%E7%BB%9F%E8%AE%A1%E5%AD%A6" target="_blank" rel="noopener noreferrer" class="rp-link">统计学</a>，<a href="https://wiki.mbalib.com/wiki/%E7%BB%9F%E8%AE%A1%E5%86%B3%E7%AD%96%E7%90%86%E8%AE%BA" target="_blank" rel="noopener noreferrer" class="rp-link">统计决策理论</a>和<a href="https://wiki.mbalib.com/wiki/%E7%BB%8F%E6%B5%8E%E5%AD%A6" target="_blank" rel="noopener noreferrer" class="rp-link">经济学</a>中。损失函数参数的真值为（θ），<a href="https://wiki.mbalib.com/wiki/%E5%86%B3%E7%AD%96" target="_blank" rel="noopener noreferrer" class="rp-link">决策</a>的结果为<em>d</em>
，两者的不一致会带来一定的损失，这种损失是一个<a href="https://wiki.mbalib.com/wiki/%E9%9A%8F%E6%9C%BA%E5%8F%98%E9%87%8F" target="_blank" rel="noopener noreferrer" class="rp-link">随机变量</a>，用<em>L</em>(θ,<em>d</em>)表示。</p>
</blockquote>
<p>1.1 0-1损失函数(0-1 loss function)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>L</mi><mo stretchy="false">(</mo><mi>Y</mi><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mrow><mo fence="true">{</mo><mtable rowspacing="0.36em" columnalign="left left" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>1</mn><mo separator="true">,</mo><mi>Y</mi><mo mathvariant="normal">≠</mo><mi>f</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mrow><mn>0</mn><mo separator="true">,</mo><mi>Y</mi><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo></mrow></mstyle></mtd></mtr></mtable></mrow></mrow><annotation encoding="application/x-tex">L(Y,f(X))=
\begin{cases}
1,Y \neq f(X)\cr
0,Y = f(X)
\end{cases}
</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">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</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:3em;vertical-align:-1.25em"></span><span class="minner"><span class="mopen delimcenter" style="top:0em"><span class="delimsizing size4">{</span></span><span class="mord"><span class="mtable"><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.69em"><span style="top:-3.69em"><span class="pstrut" style="height:3.008em"></span><span class="mord"><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel"><span class="mrel"><span class="mord vbox"><span class="thinbox"><span class="rlap"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em"></span><span class="inner"><span class="mord"><span class="mrel"></span></span></span><span class="fix"></span></span></span></span></span><span class="mrel">=</span></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mclose">)</span></span></span><span style="top:-2.25em"><span class="pstrut" style="height:3.008em"></span><span class="mord"><span class="mord">0</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.22222em">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 class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.19em"><span></span></span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>1.2平方损失函数(quadratic loss function)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>L</mi><mo stretchy="false">(</mo><mi>Y</mi><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mo stretchy="false">(</mo><mi>Y</mi><mo>−</mo><mi>f</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><msup><mo stretchy="false">)</mo><mn>2</mn></msup></mrow><annotation encoding="application/x-tex">L(Y,f(X))=(Y-f(X))^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="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</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" style="margin-right:0.22222em">Y</span><span 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.1141em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mclose">)</span><span class="mclose"><span class="mclose">)</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">2</span></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>1.3绝对损失函数(absolute loss function)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>L</mi><mo stretchy="false">(</mo><mi>Y</mi><mo separator="true">,</mo><mi>f</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mi mathvariant="normal">∣</mi><mi>Y</mi><mo>−</mo><mi>f</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mi mathvariant="normal">∣</mi></mrow><annotation encoding="application/x-tex">L(Y,f(X))=|Y-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">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</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="mord">∣</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span 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.10764em">f</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mclose">)</span><span class="mord">∣</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>1.4对数损失函数(logarithmic loss function)或对数似然损失函数(log likelihood loss function)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>L</mi><mo stretchy="false">(</mo><mi>Y</mi><mo separator="true">,</mo><mi>P</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><mi>X</mi><mo stretchy="false">)</mo><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><mi>l</mi><mi>o</mi><mi>g</mi><mi>P</mi><mo stretchy="false">(</mo><mi>Y</mi><mi mathvariant="normal">∣</mi><mi>X</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">L(Y,P(Y|X))=-logP(Y|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">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.07847em">X</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="mord">−</span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mord mathnormal">o</span><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="mord mathnormal" style="margin-right:0.13889em">P</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.22222em">Y</span><span class="mord">∣</span><span class="mord mathnormal" style="margin-right:0.07847em">X</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.风险函数
<strong>风险函数</strong>是损失函数的期望值，表示为：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>R</mi><mo stretchy="false">(</mo><mi>θ</mi><mo separator="true">,</mo><mi>d</mi><mo stretchy="false">)</mo><mo>=</mo><mi>E</mi><mo stretchy="false">[</mo><mi>L</mi><mo stretchy="false">(</mo><mi>d</mi><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo></mrow><annotation encoding="application/x-tex">R(\theta,d)=E[L(d,\theta)]
</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.00773em">R</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.02778em">θ</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">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:1em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.05764em">E</span><span class="mopen">[</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal">d</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.02778em">θ</span><span class="mclose">)]</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>决策的目标是要找出一个决策方案<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.6944em"></span><span class="mord mathnormal">d</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 stretchy="false">(</mo><mi>d</mi><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">r(d,\theta)</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">r</span><span class="mopen">(</span><span class="mord mathnormal">d</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.02778em">θ</span><span class="mclose">)</span></span></span></span>达到最小，其中：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>r</mi><mo stretchy="false">(</mo><mi>d</mi><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo><mo>=</mo><mi>E</mi><mo stretchy="false">[</mo><mi>R</mi><mo stretchy="false">(</mo><mi>d</mi><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo><mo stretchy="false">]</mo><mo>=</mo><munderover><mo>∑</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>L</mi></munderover><mi>R</mi><mo stretchy="false">(</mo><mi>d</mi><mo separator="true">,</mo><mi>θ</mi><mo stretchy="false">)</mo><mi>p</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mi>j</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">r(d,\theta) = E[R(d,\theta)]=\sum_{j=1}^LR(d,\theta)p(\theta_j)
</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">r</span><span class="mopen">(</span><span class="mord mathnormal">d</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.02778em">θ</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="mord mathnormal" style="margin-right:0.05764em">E</span><span class="mopen">[</span><span class="mord mathnormal" style="margin-right:0.00773em">R</span><span class="mopen">(</span><span class="mord mathnormal">d</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.02778em">θ</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:3.2421em;vertical-align:-1.4138em"></span><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.8283em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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><span class="mord mtight">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">L</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.4138em"><span></span></span></span></span></span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.00773em">R</span><span class="mopen">(</span><span class="mord mathnormal">d</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.02778em">θ</span><span class="mclose">)</span><span class="mord mathnormal">p</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em">θ</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" 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 class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>有结构风险函数和经验风险函数</p>
<p>参考资料</p>
<p>1,<a href="http://www.csuldw.com/2016/03/26/2016-03-26-loss-function/" target="_blank" rel="noopener noreferrer" class="rp-link">http://www.csuldw.com/2016/03/26/2016-03-26-loss-function/</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[神经网络中的前向传播与后向传播]]></title>
        <id>/blog/2019/hexo-神经网络中的前向传播与后向传播</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-神经网络中的前向传播与后向传播"/>
        <updated>2019-07-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文详细阐述了神经网络中的前向传播和后向传播算法。文章首先通过数学公式清晰地描述了数据在多层神经网络中逐层前向传播的过程。接着，重点推导了后向传播的核心，即如何计算每一层的误差项（δ），并利用链式法则得出了损失函数对权重（W）和偏置（b）的偏导数计算公式，最后给出了参数更新的完整步骤。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="神经网络中的前向传播与后向传播"><a href="#神经网络中的前向传播与后向传播" class="rp-header-anchor rp-link" aria-hidden="true">#</a>神经网络中的前向传播与后向传播<!-- --> </h1>
<p><img alt="img" src="/static/image/7_10_neu.6989d16b0d.png"/></p>
<p><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>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">f(z)</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" style="margin-right:0.04398em">z</span><span class="mclose">)</span></span></span></span>为激励函数，关于激励函数(又称激活函数)的总结<br/>
隐藏层1输入</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><msup><mi>W</mi><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><msup><mi>x</mi><mi>T</mi></msup><mo>+</mo><msup><mi>b</mi><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(1)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">z^{(1)}=W^{(1)}x^T+b^{(1)}\tag{1}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.938em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">1</span><span class="mclose 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:1.0213em;vertical-align:-0.0833em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em"><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 mathnormal mtight" style="margin-right:0.13889em">T</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.938em"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:1.188em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">1</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>隐藏层1输出</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><msup><mi>n</mi><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><msup><mi>f</mi><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">(</mo><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">)</mo></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(2)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">n^{(1)}=f^{(1)}(z^{(1)})\tag{2}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.938em"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">1</span><span class="mclose 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:1.188em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span><span class="tag"><span class="strut" style="height:1.188em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">2</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>隐藏层2输入</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><msup><mi>W</mi><mrow><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo></mrow></msup><msup><mi>n</mi><mrow><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><mo>+</mo><msup><mi>b</mi><mrow><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo></mrow></msup></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(3)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">z^{(2)}=W^{(2)}n^{(1)}+b^{(2)}\tag{3}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.938em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">2</span><span class="mclose 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:1.0213em;vertical-align:-0.0833em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">2</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">1</span><span class="mclose mtight">)</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.938em"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">2</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:1.188em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">3</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>隐藏层2输出</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><msup><mi>n</mi><mrow><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><msup><mi>f</mi><mrow><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">(</mo><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">)</mo></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(4)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">n^{(2)}=f^{(2)}(z^{(2)})\tag{4}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.938em"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">2</span><span class="mclose 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:1.188em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">2</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">2</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span><span class="tag"><span class="strut" style="height:1.188em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">4</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>隐藏层3输入</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mn>3</mn><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><msup><mi>W</mi><mrow><mo stretchy="false">(</mo><mn>3</mn><mo stretchy="false">)</mo></mrow></msup><msup><mi>n</mi><mrow><mo stretchy="false">(</mo><mn>2</mn><mo stretchy="false">)</mo></mrow></msup><mo>+</mo><msup><mi>b</mi><mrow><mo stretchy="false">(</mo><mn>3</mn><mo stretchy="false">)</mo></mrow></msup></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(5)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">z^{(3)}=W^{(3)}n^{(2)}+b^{(3)}\tag{5}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.938em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">3</span><span class="mclose 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:1.0213em;vertical-align:-0.0833em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">3</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">2</span><span class="mclose mtight">)</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.938em"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">3</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:1.188em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">5</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>隐藏层3输出即输出层</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mover accent="true"><mi>y</mi><mo stretchy="true">^</mo></mover><mo>=</mo><msup><mi>n</mi><mrow><mo stretchy="false">(</mo><mn>3</mn><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><msup><mi>f</mi><mrow><mo stretchy="false">(</mo><mn>3</mn><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">(</mo><mi>z</mi><mrow><mo stretchy="false">(</mo><mn>3</mn><mo stretchy="false">)</mo></mrow><mo stretchy="false">)</mo></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(6)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">\widehat y = n^{(3)}= f^{(3)}(z{(3)})\tag{6}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.865em;vertical-align:-0.1944em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6706em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span class="svg-align" style="width:calc(100% - 0.1111em);margin-left:0.1111em;top:-3.4306em"><span class="pstrut" style="height:3em"></span><span style="height:0.24em"><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="0.24em" viewBox="0 0 1062 239" preserveAspectRatio="none"><path d="M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z"></path></svg></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.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.938em"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">3</span><span class="mclose 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:1.188em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mtight">3</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="mord"><span class="mopen">(</span><span class="mord">3</span><span class="mclose">)</span></span><span class="mclose">)</span></span><span class="tag"><span class="strut" style="height:1.188em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">6</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>损失函数</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mi>L</mi><mo stretchy="false">(</mo><mi>y</mi><mo separator="true">,</mo><mover accent="true"><mi>y</mi><mo stretchy="true">^</mo></mover><mo stretchy="false">)</mo></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(7)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">L(y,\widehat y)\tag{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">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6706em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span class="svg-align" style="width:calc(100% - 0.1111em);margin-left:0.1111em;top:-3.4306em"><span class="pstrut" style="height:3em"></span><span style="height:0.24em"><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="0.24em" viewBox="0 0 1062 239" preserveAspectRatio="none"><path d="M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z"></path></svg></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="mclose">)</span></span><span class="tag"><span class="strut" style="height:1em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">7</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>即隐藏层k+1输入</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><msup><mi>W</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><msup><mi>n</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><mo>+</mo><msup><mi>b</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(8)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">z^{(k+1)}=W^{(k+1)}n^{(k)}+b^{(k+1)}\tag{8}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.938em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mclose 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:1.0213em;vertical-align:-0.0833em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</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.938em"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:1.188em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">8</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>隐藏层k+1输出</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><msup><mi>n</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><msup><mi>f</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">(</mo><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><mo stretchy="false">)</mo></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(9)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">n^{(k+1)}= f^{(k+1)}(z{(k+1)})\tag{9}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.938em"></span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mclose 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:1.188em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="mord"><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 class="mord">1</span><span class="mclose">)</span></span><span class="mclose">)</span></span><span class="tag"><span class="strut" style="height:1.188em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">9</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>对损失函数进行总结<a href="https://blog.csdn.net/lien0906/article/details/78429768" target="_blank" rel="noopener noreferrer" class="rp-link">https://blog.csdn.net/lien0906/article/details/78429768</a><br/>
计算偏导数</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow><mrow><mi mathvariant="normal">∂</mi><msup><mi>b</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac><mo>=</mo><mi>d</mi><mi>i</mi><mi>a</mi><mi>g</mi><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>1</mn><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(10)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">\frac {\partial z^{(k)}}{\partial b^{(k)}}=
diag(1,1, \ldots ,1)\tag{10}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.269em;vertical-align:-0.704em"></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.565em"><span style="top:-2.296em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em"><span style="top:-2.989em;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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></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.704em"><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:1em;vertical-align:-0.25em"></span><span class="mord mathnormal">d</span><span class="mord mathnormal">ia</span><span class="mord mathnormal" style="margin-right:0.03588em">g</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">1</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">1</span><span class="mclose">)</span></span><span class="tag"><span class="strut" style="height:2.269em;vertical-align:-0.704em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">10</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>列向量对列向量求导参见矩阵中的求导</p>
<p>计算偏导数<span class="katex-error" title="ParseError: KaTeX parse error: Unexpected character: &#x27;\&#x27; at position 51: …artial z^{(k)}}\̲" style="color:#cc0000">\frac {\partial L(y,\widehat y)}{\partial z^{(k)}}\</span></p>
<p>偏导数<span class="katex-error" title="ParseError: KaTeX parse error: Unexpected character: &#x27;\&#x27; at position 51: …artial z^{(k)}}\̲" style="color:#cc0000">\frac {\partial L(y,\widehat y)}{\partial z^{(k)}}\</span>
又称误差项(error term,也称&quot;灵敏度&quot;),一般用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>δ</mi></mrow><annotation encoding="application/x-tex">\delta</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 mathnormal" style="margin-right:0.03785em">δ</span></span></span></span>
表示,用<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msup><mi>δ</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow><annotation encoding="application/x-tex">\delta^{(k)}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.888em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03785em">δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span></span>
表示第k层神经元的误差项,其值的大小代表了<strong>第k层神经元对最终总误差的影响大小</strong></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mtable rowspacing="0.25em" columnalign="right left" columnspacing="0em"><mtr><mtd class="mtr-glue"></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><msup><mi>δ</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi><mo stretchy="false">(</mo><mi>y</mi><mo separator="true">,</mo><mover accent="true"><mi>y</mi><mo stretchy="true">^</mo></mover><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">∂</mi><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac></mrow></mstyle></mtd><mtd class="mtr-glue"></mtd><mtd class="mml-eqn-num"></mtd></mtr><mtr><mtd class="mtr-glue"></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msup><mi>n</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow><mrow><mi mathvariant="normal">∂</mi><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac><mo>∗</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup></mrow><mrow><mi mathvariant="normal">∂</mi><msup><mi>n</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac><mo>∗</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi><mo stretchy="false">(</mo><mi>y</mi><mo separator="true">,</mo><mover accent="true"><mi>y</mi><mo stretchy="true">^</mo></mover><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">∂</mi><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac></mrow></mstyle></mtd><mtd class="mtr-glue"></mtd><mtd class="mml-eqn-num"></mtd></mtr><mtr><mtd class="mtr-glue"></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow></mrow></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="true"><mrow><mrow></mrow><mo>=</mo><msup><msup><mi>f</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><msup><mrow></mrow><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup></msup><mo stretchy="false">(</mo><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">)</mo><mo>∗</mo><mo stretchy="false">(</mo><msup><mi>W</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><msup><mo stretchy="false">)</mo><mi>T</mi></msup><mo>∗</mo><msup><mi>δ</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>+</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup></mrow></mstyle></mtd><mtd class="mtr-glue"></mtd><mtd class="mml-eqn-num"></mtd></mtr></mtable></mtd><mtd width="50%"></mtd><mtd><mtext>(11)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">\begin{align}
\delta^{(k)} &amp; = \frac {\partial L(y,\widehat y)}{\partial z^{(k)}}\cr
&amp; =\frac {\partial n^{(k)}}{\partial z^{(k)}}*
\frac {\partial z^{(k+1)}}{\partial n^{(k)}}*
\frac {\partial L(y,\widehat y)}{\partial z^{(k+1)}}\cr
&amp; = {f^{(k)}}^{&#x27;}(z^{(k)}) * (W^{(k+1)})^T * \delta^{(k+1)}
\end{align}\tag{11}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:6.9304em;vertical-align:-3.2152em"></span><span class="mtable"><span class="col-align-r"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.7152em"><span style="top:-5.8532em"><span class="pstrut" style="height:3.565em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03785em">δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.2842em"><span class="pstrut" style="height:3.565em"></span><span class="mord"></span></span><span style="top:-1.0098em"><span class="pstrut" style="height:3.565em"></span><span class="mord"></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:3.2152em"><span></span></span></span></span></span><span class="col-align-l"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:3.7152em"><span style="top:-5.8532em"><span class="pstrut" style="height:3.565em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></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.427em"><span style="top:-2.296em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em"><span style="top:-2.989em;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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6706em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span class="svg-align" style="width:calc(100% - 0.1111em);margin-left:0.1111em;top:-3.4306em"><span class="pstrut" style="height:3em"></span><span style="height:0.24em"><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="0.24em" viewBox="0 0 1062 239" preserveAspectRatio="none"><path d="M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z"></path></svg></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="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.704em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-3.2842em"><span class="pstrut" style="height:3.565em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></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.565em"><span style="top:-2.296em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em"><span style="top:-2.989em;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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></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.704em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.565em"><span style="top:-2.296em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em"><span style="top:-2.989em;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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></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.704em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.427em"><span style="top:-2.296em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em"><span style="top:-2.989em;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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6706em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span class="svg-align" style="width:calc(100% - 0.1111em);margin-left:0.1111em;top:-3.4306em"><span class="pstrut" style="height:3em"></span><span style="height:0.24em"><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="0.24em" viewBox="0 0 1062 239" preserveAspectRatio="none"><path d="M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z"></path></svg></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="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.704em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-1.0098em"><span class="pstrut" style="height:3.565em"></span><span class="mord"><span class="mord"></span><span class="mspace" style="margin-right:0.2778em"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord"><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.2704em"><span style="top:-3.2704em;margin-right:0.05em"><span class="pstrut" style="height:2.5795em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight"><span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8278em"><span style="top:-2.931em;margin-right:0.0714em"><span class="pstrut" style="height:2.5em"></span><span class="sizing reset-size3 size1 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></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 class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em"><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 mathnormal mtight" style="margin-right:0.13889em">T</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 class="mord"><span class="mord mathnormal" style="margin-right:0.03785em">δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mbin mtight">+</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></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:3.2152em"><span></span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:6.9304em;vertical-align:-3.2152em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">11</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>最终需要用的两个导数</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi><mo stretchy="false">(</mo><mi>y</mi><mo separator="true">,</mo><mover accent="true"><mi>y</mi><mo stretchy="true">^</mo></mover><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">∂</mi><msup><mi>W</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac><mo>=</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi><mo stretchy="false">(</mo><mi>y</mi><mo separator="true">,</mo><mover accent="true"><mi>y</mi><mo stretchy="true">^</mo></mover><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">∂</mi><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac><mo>∗</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow><mrow><mi mathvariant="normal">∂</mi><msup><mi>W</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac><mo>=</mo><msup><mi>δ</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><mo>∗</mo><mo stretchy="false">(</mo><msup><mi>n</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><msup><mo stretchy="false">)</mo><mi>T</mi></msup></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(12)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">\frac {\partial L(y,\widehat y)}{\partial W^{(k)}}
=\frac {\partial L(y,\widehat y)}{\partial z^{(k)}}*
\frac {\partial z^{(k)}}{\partial W^{(k)}}
=\delta^{(k)}*(n^{(k-1)})^T\tag{12}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.131em;vertical-align:-0.704em"></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.427em"><span style="top:-2.296em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em"><span style="top:-2.989em;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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6706em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span class="svg-align" style="width:calc(100% - 0.1111em);margin-left:0.1111em;top:-3.4306em"><span class="pstrut" style="height:3em"></span><span style="height:0.24em"><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="0.24em" viewBox="0 0 1062 239" preserveAspectRatio="none"><path d="M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z"></path></svg></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="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.704em"><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:2.131em;vertical-align:-0.704em"></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.427em"><span style="top:-2.296em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em"><span style="top:-2.989em;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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6706em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span class="svg-align" style="width:calc(100% - 0.1111em);margin-left:0.1111em;top:-3.4306em"><span class="pstrut" style="height:3em"></span><span style="height:0.24em"><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="0.24em" viewBox="0 0 1062 239" preserveAspectRatio="none"><path d="M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z"></path></svg></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="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.704em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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:2.269em;vertical-align:-0.704em"></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.565em"><span style="top:-2.296em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em"><span style="top:-2.989em;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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></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.704em"><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.938em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03785em">δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</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:1.188em;vertical-align:-0.25em"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mbin mtight">−</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em"><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 mathnormal mtight" style="margin-right:0.13889em">T</span></span></span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:2.269em;vertical-align:-0.704em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">12</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi><mo stretchy="false">(</mo><mi>y</mi><mo separator="true">,</mo><mover accent="true"><mi>y</mi><mo stretchy="true">^</mo></mover><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">∂</mi><msup><mi>b</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac><mo>=</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>L</mi><mo stretchy="false">(</mo><mi>y</mi><mo separator="true">,</mo><mover accent="true"><mi>y</mi><mo stretchy="true">^</mo></mover><mo stretchy="false">)</mo></mrow><mrow><mi mathvariant="normal">∂</mi><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac><mo>∗</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msup><mi>z</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow><mrow><mi mathvariant="normal">∂</mi><msup><mi>b</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mfrac><mo>=</mo><msup><mi>δ</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(13)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">\frac {\partial L(y,\widehat y)}{\partial b^{(k)}}
=\frac {\partial L(y,\widehat y)}{\partial z^{(k)}}*
\frac {\partial z^{(k)}}{\partial b^{(k)}}
=\delta^{(k)}\tag{13}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.131em;vertical-align:-0.704em"></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.427em"><span style="top:-2.296em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em"><span style="top:-2.989em;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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6706em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span class="svg-align" style="width:calc(100% - 0.1111em);margin-left:0.1111em;top:-3.4306em"><span class="pstrut" style="height:3em"></span><span style="height:0.24em"><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="0.24em" viewBox="0 0 1062 239" preserveAspectRatio="none"><path d="M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z"></path></svg></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="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.704em"><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:2.131em;vertical-align:-0.704em"></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.427em"><span style="top:-2.296em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em"><span style="top:-2.989em;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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">L</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.6706em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span></span><span class="svg-align" style="width:calc(100% - 0.1111em);margin-left:0.1111em;top:-3.4306em"><span class="pstrut" style="height:3em"></span><span style="height:0.24em"><svg xmlns="http://www.w3.org/2000/svg" width="100%" height="0.24em" viewBox="0 0 1062 239" preserveAspectRatio="none"><path d="M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z"></path></svg></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="mclose">)</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.704em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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:2.269em;vertical-align:-0.704em"></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.565em"><span style="top:-2.296em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.814em"><span style="top:-2.989em;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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span></span><span style="top:-3.23em"><span class="pstrut" style="height:3em"></span><span class="frac-line" style="border-bottom-width:0.04em"></span></span><span style="top:-3.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></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.704em"><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.938em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03785em">δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:2.269em;vertical-align:-0.704em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">13</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>后向传播参数更新</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><msup><mi>W</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><msup><mi>W</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><mo>−</mo><mi>α</mi><mo stretchy="false">(</mo><msup><mi>δ</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">(</mo><msup><mi>n</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo>−</mo><mn>1</mn><mo stretchy="false">)</mo></mrow></msup><msup><mo stretchy="false">)</mo><mi>T</mi></msup><mo>+</mo><msup><mi>W</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><mo stretchy="false">)</mo></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(14)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">W^{(k)} = W^{(k)} - \alpha(\delta^{(k)}(n^{(k-1)})^T + W^{(k)})\tag{14}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.938em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose 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:1.0213em;vertical-align:-0.0833em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</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:1.188em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03785em">δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">n</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mbin mtight">−</span><span class="mord mtight">1</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8913em"><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 mathnormal mtight" style="margin-right:0.13889em">T</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:1.188em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.13889em">W</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span><span class="tag"><span class="strut" style="height:1.188em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">14</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mtable width="100%"><mtr><mtd width="50%"></mtd><mtd><mrow><msup><mi>b</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><mo>=</mo><msup><mi>b</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup><mo>−</mo><mi>α</mi><msup><mi>δ</mi><mrow><mo stretchy="false">(</mo><mi>k</mi><mo stretchy="false">)</mo></mrow></msup></mrow></mtd><mtd width="50%"></mtd><mtd><mtext>(15)</mtext></mtd></mtr></mtable><annotation encoding="application/x-tex">b^{(k)} = b^{(k)}-\alpha\delta^{(k)}\tag{15}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.938em"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose 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:1.0213em;vertical-align:-0.0833em"></span><span class="mord"><span class="mord mathnormal">b</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</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.938em"></span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03785em">δ</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.938em"><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="mopen mtight">(</span><span class="mord mathnormal mtight" style="margin-right:0.03148em">k</span><span class="mclose mtight">)</span></span></span></span></span></span></span></span></span></span><span class="tag"><span class="strut" style="height:1.188em;vertical-align:-0.25em"></span><span class="mord text"><span class="mord">(</span><span class="mord"><span class="mord">15</span></span><span class="mord">)</span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>α</mi></mrow><annotation encoding="application/x-tex">\alpha</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.0037em">α</span></span></span></span> 是学习率</p>
<p>后向传播中的正则化,L1正则化,L2正则化</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[深度学习中 Keras vs Pytorch]]></title>
        <id>/blog/2019/hexo-深度学习中Keras-vs-Pytorch</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-深度学习中Keras-vs-Pytorch"/>
        <updated>2019-07-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文翻译并对比了深度学习框架Keras和PyTorch的四个主要不同点。内容包括：模型定义方式（Keras的函数式API vs PyTorch的类继承）、底层操作（Keras隐藏细节 vs PyTorch的张量和动态图）、模型训练流程（Keras的`.fit()` vs PyTorch的显式循环）以及CPU/GPU模式的控制。文章建议初学者从Keras入手，而需要更高灵活性的开发者则可以选择PyTorch。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="深度学习中-keras-vs-pytorch"><a href="#深度学习中-keras-vs-pytorch" class="rp-header-anchor rp-link" aria-hidden="true">#</a>深度学习中 Keras vs Pytorch<!-- --> </h1>
<p>深度学习框架 Keras 与 Pytorch 的区别与优劣<a href="https://towardsdatascience.com/keras-vs-pytorch-for-deep-learning-a013cb63870d" target="_blank" rel="noopener noreferrer" class="rp-link">翻译</a><br/>
<img alt="img" src="/static/image/7_11_pytorchvskears.64934bd8b6.png"/></p>
<p>对于许多科学家，工程师和开发人员来说，TensorFlow 是他们的第一个深度学习框架。
TensorFlow 1.0 于 2017 年 2 月发布;但它对用户来说不是很友好。</p>
<p>在过去几年中，两个主要的深度学习库已经获得了巨大的普及，主要是因为它们比 TensorFlow 更容易使用：<strong>Keras</strong>和<strong>Pytorch</strong>。</p>
<p>本文将介绍 Keras 与 Pytorch 的 4 个不同点，以及为什么您可以选择一个库而不是另一个库。</p>
<h2 class="rp-toc-include" id="keras"><a href="#keras" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Keras</h2>
<p>Keras 本身不是一个框架，但实际上是一个位于其他 Deep
Learning 框架之上的高级 API。目前它支持<a href="https://www.tensorflow.org/" target="_blank" rel="noopener noreferrer" class="rp-link">TensorFlow</a>，<a href="http://deeplearning.net/software/theano/" target="_blank" rel="noopener noreferrer" class="rp-link">Theano</a>和<a href="https://github.com/microsoft/CNTK" target="_blank" rel="noopener noreferrer" class="rp-link">CNTK</a>。</p>
<p>Keras 的优势在于它的易用性。它是迄今为止最容易去快速启动和运行的框架。定义神经网络非常直观，使用功能 API 允许人们将层定义为函数。</p>
<h2 class="rp-toc-include" id="pytorch"><a href="#pytorch" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Pytorch</h2>
<p>Pytorch 是由 Facebook 的 AI 研究小组开发的深度学习框架（如 TensorFlow）。像 Keras 一样，它也对深度网络编程中比较复杂的一大部分进行了抽象。</p>
<p>在高级和低级编码风格方面，Pytorch 位于 Keras 和 TensorFlow 之间。你比 Keras 有更多的灵活性和控制力，但与此同时你不必做任何疯狂的声明性编程。</p>
<p>深度学习练习者整天都在争论应该使用哪个框架。一般来说，这取决于个人喜好。但是在选择时你应该记住 Keras 和 Pytorch 的一些特性。</p>
<p><img alt="img" src="/static/image/7_10_keras.d289dd6596.jpeg"/></p>
<p><img alt="img" src="/static/image/7_10_pytorch.0945acfb38.jpeg"/></p>
<h2 class="rp-toc-include" id="1用于定义模型的-类pytorch-vs-函数keras"><a href="#1用于定义模型的-类pytorch-vs-函数keras" class="rp-header-anchor rp-link" aria-hidden="true">#</a>(1)用于定义模型的 类(Pytorch) vs 函数(Keras)</h2>
<p>要定义深度学习模型，Keras 提供 Functional API。 使用 Functional
API，神经网络被定义为一组顺序函数，一个接一个地应用。
例如，第一层的输出是第二层的输入。</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">img_input </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> layers</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Input</span><span style="color:var(--shiki-token-punctuation)">(shape</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">input_shape)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">x </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> layers</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Conv2D</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">, (</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">), activation</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;relu&#x27;</span><span style="color:var(--shiki-token-punctuation)">)(img_input)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">x </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> layers</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Conv2D</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">, (</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">), activation</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;relu&#x27;</span><span style="color:var(--shiki-token-punctuation)">)(x)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">x </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> layers</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">MaxPooling2D</span><span style="color:var(--shiki-token-punctuation)">((</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">), strides</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">))(x)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>在 Pytorch 中，您将网络设置为一个类，该类继承了 Torch 库中的 torch.nn.Module。
与 Keras 类似，Pytorch 为您提供了层作为构建块，但由于它们位于 Python 类中，因此它们在类的__init__()方法中引用，并由类的 forward()方法执行。</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">class</span><span style="color:var(--shiki-token-function)"> Net</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Module</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> __init__</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        super</span><span style="color:var(--shiki-token-punctuation)">(Net, self).</span><span style="color:var(--shiki-token-function)">__init__</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">conv1 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Conv2d</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">conv2 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Conv2d</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">pool </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> nn</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">MaxPool2d</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">, </span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    def</span><span style="color:var(--shiki-token-function)"> forward</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-parameter)"> x</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        x </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> F</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">relu</span><span style="color:var(--shiki-token-punctuation)">(self.</span><span style="color:var(--shiki-token-function)">conv1</span><span style="color:var(--shiki-token-punctuation)">(x))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        x </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">pool</span><span style="color:var(--shiki-token-punctuation)">(F.</span><span style="color:var(--shiki-token-function)">relu</span><span style="color:var(--shiki-token-punctuation)">(self.</span><span style="color:var(--shiki-token-function)">conv2</span><span style="color:var(--shiki-token-punctuation)">(x)))</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> x</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">model </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> Net</span><span style="color:var(--shiki-token-punctuation)">()</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>因为 Pytorch 允许您访问所有 Python 的类功能而不是简单的函数调用，所以定义网络可以更清晰，更优雅地包含。
这真的没什么不好的，除非你觉得最重要的是尽可能快地编写代码，那么 Keras 会更容易使用。</p>
<h2 class="rp-toc-include" id="2张量和计算图pytorch-vs-标准阵列keras"><a href="#2张量和计算图pytorch-vs-标准阵列keras" class="rp-header-anchor rp-link" aria-hidden="true">#</a>(2)张量和计算图(Pytorch) vs 标准阵列(Keras)</h2>
<p>Keras
API 对程序员隐藏了的许多复杂细节。定义网络层非常直观，默认设置通常足以让您入门。</p>
<p>只有当你需要实现一个相当尖端或&quot;异国情调&quot;的模型时，你才真正需要去了解底层的 TensorFlow。</p>
<p>棘手的部分是，当你真正去了解底层的 TensorFlow 代码时，你将获得随之而来的所有非常具有挑战性的部分！
您需要确保所有矩阵乘法都排成一行。
哦，甚至不要去考虑尝试打印出图层的一个输出，因为您只能在终端上打印出一个漂亮的 Tensor 定义。</p>
<p>Pytorch 在这些方面倾向于更加方便。
您需要知道每个层的输入和输出大小，但这可以很快掌握。
您不必处理构建一个您无法在调试中看到的抽象计算图。</p>
<p>Pytorch 的另一个好处是你可以在 Torch Tensors 和 Numpy 阵列之间来回滑动。
如果你需要实现自定义的东西，那么在 TF 张量和 Numpy 阵列之间来回转换可能会很麻烦，需要开发人员对 TensorFlow 的 Session 有充分的了解。</p>
<p>Pytorch 的交互性比想象中要简单得多。 您只需要知道两个操作：一个将 Torch
Tensor（一个 Variable 对象）转变到 Numpy，另一个是相反的转换。</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">Tensor</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(a)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">numpy</span><span style="color:var(--shiki-token-punctuation)">()</span><span style="color:var(--shiki-token-comment)"> #tensor 变为numpy</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(b)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(torch.</span><span style="color:var(--shiki-token-function)">from_numpy</span><span style="color:var(--shiki-token-punctuation)">(b))</span><span style="color:var(--shiki-token-comment)"> # numpy 变为tensor</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>当然，如果你不需要实现任何花哨的东西，那么 Keras 会做得很好，因为你不会遇到任何 TensorFlow 障碍。
但如果你这样做，那么 Pytorch 可能会更顺畅。</p>
<h2 class="rp-toc-include" id="3-training-models"><a href="#3-training-models" class="rp-header-anchor rp-link" aria-hidden="true">#</a>(3) Training models</h2>
<p>在 Keras 训练模型非常容易！
只是一个简单的.fit()函数，你可以很轻松的进行训练。</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">history </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> model</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">fit_generator</span><span style="color:var(--shiki-token-punctuation)">(</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    generator</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">train_generator,</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    epochs</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-punctuation)">    validation_data</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">validation_generator)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>在 Pytorch 中训练一些模型需要一些步骤</p>
<ul>
<li>每一批次的训练开始时初始化梯度</li>
<li>在模型中运行前向传播</li>
<li>运行后向传播</li>
<li>计算损失和更新权重</li>
</ul>
<p>所以，就训练模型来说，PyTorch 较为繁琐。</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> epoch </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">):</span><span style="color:var(--shiki-token-comment)">  # loop over the dataset multiple times</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    running_loss </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0.0</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> data </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> enumerate</span><span style="color:var(--shiki-token-punctuation)">(trainloader, </span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # Get the inputs; data is a list of [inputs, labels]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        inputs</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> labels </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> data</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # (1) Initialise gradients</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        optimizer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">zero_grad</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # (2) Forward pass</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        outputs </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> net</span><span style="color:var(--shiki-token-punctuation)">(inputs)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        loss </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> criterion</span><span style="color:var(--shiki-token-punctuation)">(outputs, labels)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # (3) Backward</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        loss</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">backward</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        # (4) Compute the loss and update the weights</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        optimizer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">step</span><span style="color:var(--shiki-token-punctuation)">()</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="4控制-cpu-vs-gpu-模式"><a href="#4控制-cpu-vs-gpu-模式" class="rp-header-anchor rp-link" aria-hidden="true">#</a>(4)控制 CPU vs GPU 模式</h2>
<p>如果你已经安装了 tensorflow-gpu，则在 Keras 中能够使用 GPU
并且会默认完成。然后，如果你想要将某些运算转移至
CPU，则可以以单行方式完成。</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">with</span><span style="color:var(--shiki-foreground)"> tf</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">device</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;/cpu:0&#x27;</span><span style="color:var(--shiki-token-punctuation)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    y </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> apply_non_max_suppression</span><span style="color:var(--shiki-token-punctuation)">(x)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>但对于 PyTorch 来说，你必须显式地为每个 torch 张量和 numpy 变量启动
GPU。这样代码会比较混乱。并且如果你想在 CPU 和 GPU
之间来回移动以执行不同运算，则很容易出错。</p>
<p>例如，为了将之前的模型转移到 GPU 上运行，则需要以下步骤：</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-comment)"># Get the GPU device</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">device </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> torch</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">device</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;cuda:0&quot;</span><span style="color:var(--shiki-token-keyword)"> if</span><span style="color:var(--shiki-token-punctuation)"> torch.cuda.</span><span style="color:var(--shiki-token-function)">is_available</span><span style="color:var(--shiki-token-punctuation)">() </span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-token-string-expression)"> &quot;cpu&quot;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># Transfer the network to GPU</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">net</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">to</span><span style="color:var(--shiki-token-punctuation)">(device)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># Transfer the inputs and labels to GPU</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">inputs</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> labels </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> data</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">].</span><span style="color:var(--shiki-token-function)">to</span><span style="color:var(--shiki-token-punctuation)">(device),</span><span style="color:var(--shiki-foreground)"> data</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">].</span><span style="color:var(--shiki-token-function)">to</span><span style="color:var(--shiki-token-punctuation)">(device)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>因而，Keras 在简洁性和默认设置方面优于 PyTorch。</p>
<h2 class="rp-toc-include" id="选择-keras-或-pytorch-的一般性建议"><a href="#选择-keras-或-pytorch-的一般性建议" class="rp-header-anchor rp-link" aria-hidden="true">#</a>选择 Keras 或 PyTorch 的一般性建议</h2>
<p>作者通常建议初学者从 Keras 开始。Keras
绝对是理解和使用起来最简单的框架，能够很快地上手运行。你完全不需要担心
GPU 设置、处理抽象代码以及其他任何复杂的事情。你甚至可以在不接触任何
TensorFlow 单行代码的情况下，实现自定义层和损失函数。</p>
<p>但如果你开始深度了解到深度网络的更细粒度层面或者正在实现一些非标准的事情，则
PyTorch 是你的首选库。使用 PyTorch
需要进行一些额外操作，但这不会减缓你的进程。你依然能够快速实现、训练和测试网络，并享受简单调试带来的额外益处。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[优化算法总结]]></title>
        <id>/blog/2019/hexo-优化算法总结</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-优化算法总结"/>
        <updated>2019-07-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文总结了深度学习中几种主流的优化算法。内容详细介绍了AdaGrad、RMSProp和Adam优化器的核心思想和数学更新公式，解释了它们如何自适应地调整学习率。此外，文章还通过Python代码示例，模拟并对比了随机梯度下降（SGD）、小批量梯度下降（MSGD）和批量梯度下降（BGD）这三种基本的梯度下降方法在参数更新上的不同之处。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="优化算法总结"><a href="#优化算法总结" class="rp-header-anchor rp-link" aria-hidden="true">#</a>优化算法总结<!-- --> </h1>
<h3 class="rp-toc-include" id="adagrad-adaptive-gradient-自适应梯度"><a href="#adagrad-adaptive-gradient-自适应梯度" class="rp-header-anchor rp-link" aria-hidden="true">#</a>AdaGrad-Adaptive-Gradient-自适应梯度</h3>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>t</mi></msub><mo>=</mo><msub><mi mathvariant="normal">∇</mi><mi>θ</mi></msub><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g_t = \nabla_\theta J(\theta_{t-1})
</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" style="margin-right:0.03588em">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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="mord"><span class="mord">∇</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" style="margin-right:0.02778em">θ</span></span></span></span><span class="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 mathnormal" style="margin-right:0.09618em">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em">θ</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.0278em;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">t</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></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>θ</mi><mrow><mi>t</mi><mo>+</mo><mn>1</mn></mrow></msub><mo>=</mo><msub><mi>θ</mi><mi>t</mi></msub><mo>−</mo><mi>α</mi><mo>⋅</mo><msub><mi>g</mi><mi>t</mi></msub><mi mathvariant="normal">/</mi><msqrt><mrow><munderover><mo>∑</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>t</mi></munderover><msubsup><mi>g</mi><mi>t</mi><mn>2</mn></msubsup></mrow></msqrt><mtext>     </mtext><mo stretchy="false">(</mo><mi>α</mi><mo>=</mo><mn>0.01</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\theta_{t+1} = \theta_t-\alpha\cdot g_t/\sqrt{\sum_{i=1}^tg_t^2} \ \ \ \ \ (\alpha=0.01)
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9028em;vertical-align:-0.2083em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em">θ</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.0278em;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">t</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.8444em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><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">t</span></span></span></span><span class="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.4445em"></span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span 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:3.286em;vertical-align:-1.2777em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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 sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.0083em"><span class="svg-align" style="top:-5.246em"><span class="pstrut" style="height:5.246em"></span><span class="mord" style="padding-left:1.056em"><span class="mop op-limits"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.7806em"><span style="top:-1.8723em;margin-left:0em"><span class="pstrut" style="height:3.05em"></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">1</span></span></span></span><span style="top:-3.05em"><span class="pstrut" style="height:3.05em"></span><span><span class="mop op-symbol large-op">∑</span></span></span><span style="top:-4.3em;margin-left:0em"><span class="pstrut" style="height:3.05em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em"><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.03588em">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.7959em"><span style="top:-2.4542em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><span style="top:-3.0448em;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.2458em"><span></span></span></span></span></span></span></span></span><span style="top:-3.9683em"><span class="pstrut" style="height:5.246em"></span><span class="hide-tail" style="min-width:0.742em;height:3.326em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="3.326em" viewBox="0 0 400000 3325" preserveAspectRatio="xMinYMin slice"><path d="M702 80H40000040
H742v3191l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1
h-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170
c-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667
219 661 l218 661zM702 80H400000v40H742z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.2777em"><span></span></span></span></span></span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span 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">0.01</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>随梯度的变化改变学习率</p>
<h3 class="rp-toc-include" id="rmsprop"><a href="#rmsprop" class="rp-header-anchor rp-link" aria-hidden="true">#</a>RMSProp</h3>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>t</mi></msub><mo>=</mo><msub><mi mathvariant="normal">∇</mi><mi>θ</mi></msub><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g_t = \nabla_\theta J(\theta_{t-1})
</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" style="margin-right:0.03588em">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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="mord"><span class="mord">∇</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" style="margin-right:0.02778em">θ</span></span></span></span><span class="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 mathnormal" style="margin-right:0.09618em">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em">θ</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.0278em;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">t</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></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>v</mi><mi>t</mi></msub><mo>=</mo><mi>γ</mi><mo stretchy="false">(</mo><msub><mi>v</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><mi>γ</mi><mo stretchy="false">)</mo><msubsup><mi>g</mi><mi>t</mi><mn>2</mn></msubsup><mtext>     </mtext><mo stretchy="false">(</mo><mi>γ</mi><mo>=</mo><mn>0.9</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">v_t= \gamma(v_{t-1})+(1-\gamma)g_t^2 \ \ \ \ \ (\gamma=0.9)
</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" style="margin-right:0.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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="mord mathnormal" style="margin-right:0.05556em">γ</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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">t</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.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">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:1.1141em;vertical-align:-0.25em"></span><span class="mord mathnormal" style="margin-right:0.05556em">γ</span><span class="mclose">)</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em"><span style="top:-2.453em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.05556em">γ</span><span 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">0.9</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>θ</mi><mi>t</mi></msub><mo>=</mo><msub><mi>θ</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>−</mo><mi>α</mi><mo>∗</mo><msub><mi>g</mi><mi>t</mi></msub><mi mathvariant="normal">/</mi><mo stretchy="false">(</mo><msub><msqrt><mi>v</mi></msqrt><mi>t</mi></msub><mo>+</mo><mi>ε</mi><mo stretchy="false">)</mo><mtext>     </mtext><mo stretchy="false">(</mo><mi>α</mi><mo>=</mo><mn>0.001</mn><mo separator="true">,</mo><mi>ε</mi><mo>=</mo><msup><mn>10</mn><mrow><mo>−</mo><mn>8</mn></mrow></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\theta_{t} = \theta_{t-1}-\alpha* g_t/(\sqrt v_t + \varepsilon) \ \ \ \ \ (\alpha=0.001,\varepsilon=10^{-8})
</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" style="margin-right:0.02778em">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><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 mtight"><span class="mord mathnormal mtight">t</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.9028em;vertical-align:-0.2083em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em">θ</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.0278em;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">t</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.4653em"></span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span 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.0992em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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"><span class="mord sqrt"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8492em"><span class="svg-align" style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em;padding-left:0.833em">v</span></span><span style="top:-2.8092em"><span class="pstrut" style="height:3em"></span><span class="hide-tail" style="min-width:0.853em;height:1.08em"><svg xmlns="http://www.w3.org/2000/svg" width="400em" height="1.08em" viewBox="0 0 400000 1080" preserveAspectRatio="xMinYMin slice"><path d="M95,702
c-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14
c0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54
c44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10
s173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429
c69,-144,104.5,-217.7,106.5,-221
l0 -0
c5.3,-9.3,12,-14,20,-14
H400000v40H845.2724
s-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7
c-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z
M834 80h400000v40h-400000z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.1908em"><span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.19em"><span style="top:-2.4595em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2405em"><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="mord mathnormal">ε</span><span class="mclose">)</span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span 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.8389em;vertical-align:-0.1944em"></span><span class="mord">0.001</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">ε</span><span 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.1141em;vertical-align:-0.25em"></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.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">8</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>结合梯度平方的指数移动平均数来调节学习率的变化</p>
<p>克服AdaGrad梯度急剧减小的问题</p>
<h3 class="rp-toc-include" id="adam优化器"><a href="#adam优化器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Adam优化器</h3>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>t</mi></msub><mo>=</mo><msub><mi mathvariant="normal">∇</mi><mi>θ</mi></msub><mi>J</mi><mo stretchy="false">(</mo><msub><mi>θ</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">g_t = \nabla_\theta J(\theta_{t-1})
</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" style="margin-right:0.03588em">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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="mord"><span class="mord">∇</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" style="margin-right:0.02778em">θ</span></span></span></span><span class="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 mathnormal" style="margin-right:0.09618em">J</span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em">θ</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.0278em;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">t</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></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>m</mi><mi>t</mi></msub><mo>=</mo><msub><mi>β</mi><mn>1</mn></msub><msub><mi>m</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><msub><mi>β</mi><mn>1</mn></msub><mo stretchy="false">)</mo><msub><mi>g</mi><mi>t</mi></msub><mtext>     </mtext><mo stretchy="false">(</mo><msub><mi>β</mi><mn>1</mn></msub><mo>=</mo><mn>0.9</mn><mo separator="true">,</mo><msub><mi>m</mi><mn>0</mn></msub><mo>=</mo><mn>0</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">m_t = \beta_1m_{t-1}+(1-\beta_1)g_t \ \ \ \ \ (\beta_1=0.9,m_0=0)
</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.2806em"><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">t</span></span></span></span><span class="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.9028em;vertical-align:-0.2083em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</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.0528em;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">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 mathnormal mtight">t</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:1em;vertical-align:-0.25em"></span><span class="mopen">(</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:1em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</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.0528em;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="mclose">)</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</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.0528em;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.8389em;vertical-align:-0.1944em"></span><span class="mord">0.9</span><span class="mpunct">,</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.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="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">0</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>v</mi><mi>t</mi></msub><mo>=</mo><msub><mi>β</mi><mn>2</mn></msub><msub><mi>v</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>+</mo><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><msub><mi>β</mi><mn>2</mn></msub><mo stretchy="false">)</mo><msubsup><mi>g</mi><mi>t</mi><mn>2</mn></msubsup><mtext>     </mtext><mo stretchy="false">(</mo><msub><mi>β</mi><mn>2</mn></msub><mo>=</mo><mn>0.999</mn><mo separator="true">,</mo><msub><mi>v</mi><mn>0</mn></msub><mo>=</mo><mn>0</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">v_t=\beta_2v_{t-1}+(1-\beta_2)g_t^2 \ \ \ \ \ (\beta_2=0.999,v_0=0)
</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" style="margin-right:0.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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.9028em;vertical-align:-0.2083em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</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.0528em;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 class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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">t</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:1em;vertical-align:-0.25em"></span><span class="mopen">(</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:1.1141em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</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.0528em;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="mclose">)</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">g</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8641em"><span style="top:-2.453em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span><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">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</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.0528em;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.8389em;vertical-align:-0.1944em"></span><span class="mord">0.999</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.03588em">v</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.0359em;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="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">0</span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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><mover accent="true"><mi>m</mi><mo>^</mo></mover><mi>t</mi></msub><mo>=</mo><msub><mi>m</mi><mi>t</mi></msub><mi mathvariant="normal">/</mi><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><msubsup><mi>β</mi><mn>1</mn><mi>t</mi></msubsup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\hat m_t = m_t/(1-\beta_1^t)
</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 accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">m</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><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">t</span></span></span></span><span class="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="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.2806em"><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">t</span></span></span></span><span class="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">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:1.0936em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8436em"><span style="top:-2.453em;margin-left:-0.0528em;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 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 mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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><mover accent="true"><mi>v</mi><mo>^</mo></mover><mi>t</mi></msub><mo>=</mo><msub><mi>v</mi><mi>t</mi></msub><mi mathvariant="normal">/</mi><mo stretchy="false">(</mo><mn>1</mn><mo>−</mo><msubsup><mi>β</mi><mn>2</mn><mi>t</mi></msubsup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\hat v_t = v_t/(1-\beta_2^t)
</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 accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">v</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2222em"><span class="mord">^</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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">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:1.0936em;vertical-align:-0.25em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.05278em">β</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8436em"><span style="top:-2.453em;margin-left:-0.0528em;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 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 mathnormal mtight">t</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.247em"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><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>θ</mi><mi>t</mi></msub><mo>=</mo><msub><mi>θ</mi><mrow><mi>t</mi><mo>−</mo><mn>1</mn></mrow></msub><mo>−</mo><mi>α</mi><mo>∗</mo><msub><mover accent="true"><mi>m</mi><mo>^</mo></mover><mi>t</mi></msub><mi mathvariant="normal">/</mi><mo stretchy="false">(</mo><msub><mover accent="true"><mi>v</mi><mo>^</mo></mover><mi>t</mi></msub><mo>+</mo><mi>ε</mi><mo stretchy="false">)</mo><mtext>     </mtext><mo stretchy="false">(</mo><mi>α</mi><mo>=</mo><mn>0.001</mn><mo separator="true">,</mo><mi>ε</mi><mo>=</mo><msup><mn>10</mn><mrow><mo>−</mo><mn>8</mn></mrow></msup><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\theta_t = \theta_{t-1}-\alpha * \hat m_t/(\hat v_t + \varepsilon) \ \ \ \ \ (\alpha=0.001,\varepsilon=10^{-8})
</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" style="margin-right:0.02778em">θ</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><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">t</span></span></span></span><span class="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.9028em;vertical-align:-0.2083em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.02778em">θ</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.0278em;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">t</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.4653em"></span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span 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"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">m</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.25em"><span class="mord">^</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><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">t</span></span></span></span><span class="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"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.6944em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">v</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2222em"><span class="mord">^</span></span></span></span></span></span></span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.2806em"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">t</span></span></span></span><span class="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="mord mathnormal">ε</span><span class="mclose">)</span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mspace"> </span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.0037em">α</span><span 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.8389em;vertical-align:-0.1944em"></span><span class="mord">0.001</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal">ε</span><span 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.1141em;vertical-align:-0.25em"></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.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">8</span></span></span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>对梯度的一阶矩估计（First Moment Estimation，即梯度的均值）和二阶矩估计（Second Moment Estimation，即梯度的未中心化的方差）进行综合考虑，计算出更新步长。</p>
<h3 class="rp-toc-include" id="下面是对几种梯度下降算法的模拟"><a href="#下面是对几种梯度下降算法的模拟" class="rp-header-anchor rp-link" aria-hidden="true">#</a>下面是对几种梯度下降算法的模拟</h3>
<p>其中包括随机梯度下降算法SGD，小批量梯度下降算法MSGD，批量梯度下降算法BGD</p>
<p>都是根据损失函数计算参数梯度，更新参数;不一样的地方是他们使用使用训练集的方式</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-comment)"># 随机梯度下降算法SGD</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">x</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">rand</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">10000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">w</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">array</span><span style="color:var(--shiki-token-punctuation)">([[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">],[</span><span style="color:var(--shiki-token-constant)">20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">40</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">60</span><span style="color:var(--shiki-token-punctuation)">]])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">b</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">array</span><span style="color:var(--shiki-token-punctuation)">([[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">],[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">]])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">y</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">(w</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">dot</span><span style="color:var(--shiki-token-punctuation)">(x.T)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">b)</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">T </span><span style="color:var(--shiki-token-comment)">#100,2</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">lr</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0.5</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">ww </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">rand</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">bb </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">rand</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">mb</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">master_bar</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">1000000</span><span style="color:var(--shiki-token-punctuation)">))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">mb</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">names</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-string-expression)">&#x27;loss&#x27;</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">lossy</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">[]</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-foreground)"> mb</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    r</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">randint</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">1000</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    xi</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">x</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,:]</span><span style="color:var(--shiki-token-comment)"> #1,5</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    yi</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">y</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,:]</span><span style="color:var(--shiki-token-comment)"> #1,2</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    yy </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ww</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">dot</span><span style="color:var(--shiki-token-punctuation)">(xi.T)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">bb </span><span style="color:var(--shiki-token-comment)">#2,1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    loss </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">mean</span><span style="color:var(--shiki-token-punctuation)">(np.</span><span style="color:var(--shiki-token-function)">power</span><span style="color:var(--shiki-token-punctuation)">(yy</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-punctuation)">yi.T,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    lossy</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(loss)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    graphs </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [[np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">arange</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(lossy)),</span><span style="color:var(--shiki-foreground)">lossy]]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    mb</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">update_graph</span><span style="color:var(--shiki-token-punctuation)">(graphs)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    ww</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">  ww </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)"> lr</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">(yy</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">yi</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">T)</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">dot</span><span style="color:var(--shiki-token-punctuation)">(xi)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    bb</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">  bb </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)"> lr</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">(yy</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">yi</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">T)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> loss </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)"> 1e-10</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        break</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #print(loss)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(ww,bb)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(w,b)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 小批量梯度下降算法MSGD</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">x</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">rand</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">1000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">w</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">array</span><span style="color:var(--shiki-token-punctuation)">([[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">],[</span><span style="color:var(--shiki-token-constant)">20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">40</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">60</span><span style="color:var(--shiki-token-punctuation)">]])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">b</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">array</span><span style="color:var(--shiki-token-punctuation)">([[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">],[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">]])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">y</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">(w</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">dot</span><span style="color:var(--shiki-token-punctuation)">(x.T)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">b)</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">T </span><span style="color:var(--shiki-token-comment)">#100,2</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">lr</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0.3</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">ww </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">rand</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">bb </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">rand</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">mb</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">master_bar</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">200</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">mb</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">names</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-string-expression)">&#x27;loss&#x27;</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">lossy</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">[]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">batch </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 50</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-foreground)"> mb</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    lossg</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">wwg</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">bbg</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> progress_bar</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">range</span><span style="color:var(--shiki-token-punctuation)">(batch),parent</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">mb):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        r</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">randint</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">1000</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        xi</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">x</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,:]</span><span style="color:var(--shiki-token-comment)"> #1,5</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        yi</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">y</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,:]</span><span style="color:var(--shiki-token-comment)"> #1,2</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        yy </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ww</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">dot</span><span style="color:var(--shiki-token-punctuation)">(xi.T)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">bb </span><span style="color:var(--shiki-token-comment)">#2,10</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        lossg </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">mean</span><span style="color:var(--shiki-token-punctuation)">(np.</span><span style="color:var(--shiki-token-function)">power</span><span style="color:var(--shiki-token-punctuation)">(yy</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-punctuation)">yi.T,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        wwg </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> (yy</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">yi</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">T)</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">dot</span><span style="color:var(--shiki-token-punctuation)">(xi)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        bbg </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> (yy</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">yi</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">T)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    lossy</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(lossg</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-token-punctuation)">batch)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    graphs </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [[np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">arange</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(lossy)),</span><span style="color:var(--shiki-foreground)">lossy]]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    mb</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">update_graph</span><span style="color:var(--shiki-token-punctuation)">(graphs)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    ww</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">  ww </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)"> lr</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">wwg</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">batch</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    bb</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">  bb </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)"> lr</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">bbg</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">batch</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> lossg</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">batch </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)"> 1e-4</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        break</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #print(loss)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(ww,bb)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(w,b)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)"># 批量梯度下降算法BGD</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">x</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">random</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">rand</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">1000</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">w</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">array</span><span style="color:var(--shiki-token-punctuation)">([[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-punctuation)">],[</span><span style="color:var(--shiki-token-constant)">20</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">30</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">40</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">50</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">60</span><span style="color:var(--shiki-token-punctuation)">]])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">b</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">array</span><span style="color:var(--shiki-token-punctuation)">([[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-punctuation)">],[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">]])</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">y</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">(w</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">dot</span><span style="color:var(--shiki-token-punctuation)">(x.T)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">b)</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">T </span><span style="color:var(--shiki-token-comment)">#100,2</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">lr</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0.3</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">#ww = np.random.rand(2,5)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">#bb = np.random.rand(2,1)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">mb</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">master_bar</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">range</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-constant)">200</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-punctuation)">))</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">mb</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">names</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-string-expression)">&#x27;loss&#x27;</span><span style="color:var(--shiki-foreground)">]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">lossy</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">[]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">batch </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 1000</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">for</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-foreground)"> mb</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    lossg</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">wwg</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">bbg</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    for</span><span style="color:var(--shiki-foreground)"> j </span><span style="color:var(--shiki-token-keyword)">in</span><span style="color:var(--shiki-token-function)"> progress_bar</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">range</span><span style="color:var(--shiki-token-punctuation)">(batch),parent</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-punctuation)">mb):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        r</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">j</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        xi</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">x</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,:]</span><span style="color:var(--shiki-token-comment)"> #1,5</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        yi</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">y</span><span style="color:var(--shiki-token-punctuation)">[</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,:]</span><span style="color:var(--shiki-token-comment)"> #1,2</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        yy </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ww</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">dot</span><span style="color:var(--shiki-token-punctuation)">(xi.T)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">bb </span><span style="color:var(--shiki-token-comment)">#2,10</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        lossg </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">mean</span><span style="color:var(--shiki-token-punctuation)">(np.</span><span style="color:var(--shiki-token-function)">power</span><span style="color:var(--shiki-token-punctuation)">(yy</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-token-punctuation)">yi.T,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        wwg </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> (yy</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">yi</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">T)</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">dot</span><span style="color:var(--shiki-token-punctuation)">(xi)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        bbg </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> (yy</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">yi</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">T)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    lossy</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-token-punctuation)">(lossg</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-token-punctuation)">batch)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    graphs </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> [[np</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">arange</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-function)">len</span><span style="color:var(--shiki-token-punctuation)">(lossy)),</span><span style="color:var(--shiki-foreground)">lossy]]</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    mb</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">update_graph</span><span style="color:var(--shiki-token-punctuation)">(graphs)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    ww</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">  ww </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)"> lr</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">wwg</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">batch</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    bb</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">  bb </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)"> lr</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">bbg</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">batch</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)"> lossg</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-foreground)">batch </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)"> 1e-4</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        break</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #print(loss)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(ww,bb)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">print</span><span style="color:var(--shiki-token-punctuation)">(w,b)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Python中遇到的问题]]></title>
        <id>/blog/2019/hexo-Python中遇到的问题</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-Python中遇到的问题"/>
        <updated>2019-05-31T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了Python编程中遇到的两个常见问题。第一个是关于二维列表的错误初始化方式，即使用`[[0]*3]*3`会导致子列表为引用而非独立副本，并给出了正确的列表推导式初始化方法。第二个问题探讨了`is`与`==`的区别，`==`比较对象内容，而`is`比较对象实例的内存地址，并对Python中字符串的内存分配现象进行了观察。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="python中遇到的问题"><a href="#python中遇到的问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Python中遇到的问题<!-- --> </h1>
<p>1.列表的初始化</p>
<p>当初始化一个n×n的列表时不能使用如下方法，</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>In [1]: l=[[0]*3]*3 #如此初始化会导致其它行仅是第一行的引用而不是copy</span></span>
<span class="line"><span>In [2]: l</span></span>
<span class="line"><span>Out[2]: [[0, 0, 0], [0, 0, 0], [0, 0, 0]</span></span>
<span class="line"><span>In [3]: l[0][0]=1 #改变其中一行的某个元素</span></span>
<span class="line"><span>In [4]: l</span></span>
<span class="line"><span>Out[4]: [[1, 0, 0], [1, 0, 0], [1, 0, 0]] #其他行跟着改变</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>正确的方法应该如下</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>In [5]: l=[[0 for _ in range(3)] for _ in range(3)] #或者l=[[0]*3 for _ in range(3)]</span></span>
<span class="line"><span>In [6]: l</span></span>
<span class="line"><span>Out[6]: [[0, 0, 0], [0, 0, 0], [0, 0, 0]]</span></span>
<span class="line"><span>In [7]: l[0][0]=1</span></span>
<span class="line"><span>In [8]: l</span></span>
<span class="line"><span>Out[8]: [[1, 0, 0], [0, 0, 0], [0, 0, 0]]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.a is b与a==b 的区别</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>a=&#x27;vhcffh.com&#x27;</span></span>
<span class="line"><span>b=&#x27;vhcffh.com&#x27;</span></span>
<span class="line"><span>a==b # True,a和b对应实例的内容是相同的</span></span>
<span class="line"><span>a is b # False,a和b指向不同的实例</span></span>
<span class="line"><span>b=a</span></span>
<span class="line"><span>a is b # True,a和b指向同一个实例</span></span>
<span class="line"><span></span></span>
<span class="line"><span># 好奇怪啊！！！</span></span>
<span class="line"><span>In [43]: a=&#x27;vhcffh.com&#x27;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>In [44]: b=&#x27;vhcffh.com&#x27;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>In [45]: a==b</span></span>
<span class="line"><span>Out[45]: True</span></span>
<span class="line"><span></span></span>
<span class="line"><span>In [46]: a is b</span></span>
<span class="line"><span>Out[46]: False</span></span>
<span class="line"><span></span></span>
<span class="line"><span>In [47]: a=&#x27;abcde&#x27;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>In [48]: b=&#x27;abcde&#x27;</span></span>
<span class="line"><span></span></span>
<span class="line"><span>In [49]: a == b</span></span>
<span class="line"><span>Out[49]: True</span></span>
<span class="line"><span></span></span>
<span class="line"><span>In [50]: a is b</span></span>
<span class="line"><span>Out[50]: True</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Linux常用命令]]></title>
        <id>/blog/2019/hexo-Linux常用命令</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-Linux常用命令"/>
        <updated>2019-05-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文汇总了Linux中常用的一些命令。内容涵盖了`tar`命令的打包与解压操作，`wget`设置代理的两种方法，`ps`命令查看进程信息，以及用户和用户组管理的命令，如`useradd`, `userdel`, `groupadd`, `chown`等，为Linux日常使用提供了实用的命令参考。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="linux常用命令"><a href="#linux常用命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Linux常用命令<!-- --> </h1>
<p>Linux中的一些常用命令,tar</p>
<h2 class="rp-toc-include" id="1tar解压打包相关"><a href="#1tar解压打包相关" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.tar解压打包相关</h2>
<div class="rp-codeblock language-bash"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="bash"><code><span class="line"><span style="color:var(--shiki-token-function)">tar</span><span style="color:var(--shiki-token-string)"> -cvf</span><span style="color:var(--shiki-token-string)"> log.tar</span><span style="color:var(--shiki-token-string)"> log2019.log</span><span style="color:var(--shiki-token-comment)">    #仅打包，不压缩</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">tar</span><span style="color:var(--shiki-token-string)"> -zcvf</span><span style="color:var(--shiki-token-string)"> log.tar.gz</span><span style="color:var(--shiki-token-string)"> log2019.log</span><span style="color:var(--shiki-token-comment)">   #打包后，以 gzip 压缩</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">tar</span><span style="color:var(--shiki-token-string)"> -jcvf</span><span style="color:var(--shiki-token-string)"> log.tar.bz2</span><span style="color:var(--shiki-token-string)"> log2019.log</span><span style="color:var(--shiki-token-comment)">  #打包后，以 bzip2 压缩</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">tar</span><span style="color:var(--shiki-token-string)"> -ztvf</span><span style="color:var(--shiki-token-string)"> log.tar.gz</span><span style="color:var(--shiki-token-comment)"> #gzip查阅</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">tar</span><span style="color:var(--shiki-token-string)"> -jtvf</span><span style="color:var(--shiki-token-string)"> log.tar.gz</span><span style="color:var(--shiki-token-comment)"> #bzip2查阅</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">tar</span><span style="color:var(--shiki-token-string)"> -zxvf</span><span style="color:var(--shiki-token-string)"> log.tar.gz</span><span style="color:var(--shiki-token-comment)"> #gzip解压</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">tar</span><span style="color:var(--shiki-token-string)"> -jxvf</span><span style="color:var(--shiki-token-string)"> log.tar.gz</span><span style="color:var(--shiki-token-comment)"> #bzip2解压</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">unzip</span><span style="color:var(--shiki-token-string)"> log.zip</span><span style="color:var(--shiki-token-string)"> -d</span><span style="color:var(--shiki-token-string)"> dirname</span><span style="color:var(--shiki-token-comment)"> #zip解压到dirname目录</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>补充</p>
<p>c: 建立压缩档案<br/>
-x：解压<br/>
-t：查看内容<br/>
-r：向压缩归档文件末尾追加文件<br/>
-u：更新原压缩包中的文件</p>
<p>这五个是独立的命令，压缩解压都要用到其中一个，可以和别的命令连用但只能用其中一个。下面的参数是根据需要在压缩或解压档案时可选的。</p>
<p>-z：有gzip属性的<br/>
-j：有bz2属性的<br/>
-Z：有compress属性的<br/>
-v：显示所有过程<br/>
-O：将文件解开到标准输出</p>
<h2 class="rp-toc-include" id="2wget设置代理"><a href="#2wget设置代理" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.wget设置代理</h2>
<p>2.1环境变量中设置</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>export http_proxy=http://127.0.0.1:8087</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.2使用配置文件</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span># cp /etc/wgetrc ~/.wgetrc</span></span>
<span class="line"><span># vim ~/.wgetrc</span></span>
<span class="line"><span># You can set the default proxies for Wget to use for http, https, and ftp.</span></span>
<span class="line"><span># They will override the value in the environment.</span></span>
<span class="line"><span>https_proxy = http://127.0.0.1:8087/</span></span>
<span class="line"><span>http_proxy = http://127.0.0.1:8087/</span></span>
<span class="line"><span>ftp_proxy = http://127.0.0.1:8087/</span></span>
<span class="line"><span></span></span>
<span class="line"><span># If you do not want to use proxy at all, set this to off.</span></span>
<span class="line"><span>use_proxy = on</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="3ps相关命令"><a href="#3ps相关命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.ps相关命令</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>ps -ef # 查看进程信息和执行的命令</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="4用户文件管理相关"><a href="#4用户文件管理相关" class="rp-header-anchor rp-link" aria-hidden="true">#</a>4.用户文件管理相关</h2>
<p>4.1Linux系统用户账号的管理</p>
<p>4.1.1添加新的用户账号</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>useradd [-d dirname] username</span></span>
<span class="line"><span># [-d dirname]指定用户主目录</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>4.1.2删除帐号</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>userdel [-r] username</span></span>
<span class="line"><span># [-R]把用户的主目录一起删除</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>4.1.3修改帐号</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>usermod [] username</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>4.1.4用户密码管理</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>passwd [-I][-u][-d][-f] username</span></span>
<span class="line"><span># [-I]锁定密码，即禁用账号。</span></span>
<span class="line"><span># [-u]密码解锁。</span></span>
<span class="line"><span># [-d]使账号无密码。</span></span>
<span class="line"><span># [-f]强迫用户下次登录时修改密码。</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>4.2Linux系统用户组的管理</p>
<p>4.2.1增加一个新的用户组</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>groupadd [-g GID] username</span></span>
<span class="line"><span># [-g GID]指定新用户组的组标识号（GID）</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>4.2.2删除一个已有的用户组</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>groupdel groupname</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>4.2.3修改用户组的属性</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>groupmod [-g GID] groupname</span></span>
<span class="line"><span># [-g GID]指定新用户组的组标识号（GID）</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>4.2.4更改用户组</p>
<p><strong>如果一个用户同时属于多个用户组，那么用户可以在用户组之间切换，以便具有其他用户组的权限。用户可以在登录后，使用命令newgrp切换到其他用户组，这个命令的参数就是目的用户组。</strong></p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>newgrp root</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>4.3Linux文件用户属性修改</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>chown [-R] user_name filename_OR_dirname  # 更改文件或目录的所有者</span></span>
<span class="line"><span>chgrp [-R] group_name filename_OR_dirname  # 更改文件或目录所在组</span></span>
<span class="line"><span># [-R]参数递归更改目录下所有文件的用户属性</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<p>1.<a href="http://man.linuxde.net/tar" target="_blank" rel="noopener noreferrer" class="rp-link">http://man.linuxde.net/tar</a></p>
<p>2.<a href="https://www.cnblogs.com/cloud2rain/archive/2013/03/22/2976337.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.cnblogs.com/cloud2rain/archive/2013/03/22/2976337.html</a></p>
<p>3.<a href="https://www.cnblogs.com/52php/p/5677628.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.cnblogs.com/52php/p/5677628.html</a></p>
<p>4.<a href="https://www.jb51.net/LINUXjishu/43356.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.jb51.net/LINUXjishu/43356.html</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[UML图介绍]]></title>
        <id>/blog/2019/hexo-UML图介绍</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-UML图介绍"/>
        <updated>2019-04-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文全面介绍了统一建模语言（UML）中的各种图及其在软件开发过程中的应用。内容涵盖了用例视图（用例图）、设计视图（类图、对象图）、进程视图（序列图、协作图、状态图、活动图）、实现视图（构件图）和拓扑视图（部署图）。文章还总结了这些UML图在需求、分析、设计、实现、测试等不同软件开发阶段所扮演的角色。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="uml图介绍"><a href="#uml图介绍" class="rp-header-anchor rp-link" aria-hidden="true">#</a>UML图介绍<!-- --> </h1>
<h2 class="rp-toc-include" id="1用例视图"><a href="#1用例视图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.用例视图</h2>
<h3 class="rp-toc-include" id="11用例图"><a href="#11用例图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.1用例图</h3>
<p>描述角色以及角色与用例之间的连接关系。说明的是谁要使用系统，以及他们使用该系统可以做些什么。</p>
<h2 class="rp-toc-include" id="2设计视图"><a href="#2设计视图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.设计视图</h2>
<h3 class="rp-toc-include" id="21类图"><a href="#21类图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.1类图</h3>
<p>根据用例图抽象成类，描述类的内部结构和类与类之间的关系，是一种静态结构图。
在UML类图中，常见的有以下几种关系: 泛化（Generalization）,
实现（Realization），关联（Association)，聚合（Aggregation），组合(Composition)，依赖(Dependency)。</p>
<p>类图是描述系统中的类，以及各个类之间的关系的静态视图。能够让我们在正确编写代码以前对系统有一个全面的认识。类图是一种模型类型，确切的说，是一种静态模型类型。</p>
<h3 class="rp-toc-include" id="22对象图"><a href="#22对象图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.2对象图</h3>
<p>描述的是参与交互的各个对象在交互过程中某一时刻的状态。对象图可以被看作是类图在某一时刻的实例。</p>
<p>与类图极为相似，它是类图的实例，对象图显示类的多个对象实例，而不是实际的类。它描述的不是类之间的关系，而是对象之间的关系。</p>
<h2 class="rp-toc-include" id="3进程视图"><a href="#3进程视图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.进程视图</h2>
<h3 class="rp-toc-include" id="31序列图顺序图"><a href="#31序列图顺序图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.1序列图（顺序图）</h3>
<p>交互图的一种，描述了对象之间消息发送的先后顺序，强调时间顺序。</p>
<p>序列图是用来显示你的参与者如何以一系列顺序的步骤与系统的对象交互的模型。顺序图可以用来展示对象之间是如何进行交互的。顺序图将显示的重点放在消息序列上，即强调消息是如何在对象之间被发送和接收的。</p>
<h3 class="rp-toc-include" id="32协作图"><a href="#32协作图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.2协作图</h3>
<p>交互图的一种，描述了收发消息的对象的组织关系，强调对象之间的合作关系。时序图按照时间顺序布图，而写作图按照空间结构布图</p>
<p>和序列图相似，显示对象间的动态合作关系。可以看成是类图和顺序图的交集，协作图建模对象或者角色，以及它们彼此之间是如何通信的。如果强调时间和顺序，则使用序列图；如果强调上下级关系，则选择协作图；这两种图合称为交互图。</p>
<h3 class="rp-toc-include" id="33状态图"><a href="#33状态图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.3状态图</h3>
<p>是一种由状态、变迁、事件和活动组成的状态机，用来描述类的对象所有可能的状态以及时间发生时状态的转移条件。</p>
<p>描述类的对象所有可能的状态，以及事件发生时状态的转移条件。可以捕获对象、子系统和系统的生命周期。他们可以告知一个对象可以拥有的状态，并且事件(如消息的接收、时间的流逝、错误、条件变为真等)会怎么随着时间的推移来影响这些状态。一个状态图应该连接到所有具有清晰的可标识状态和复杂行为的类；该图可以确定类的行为，以及该行为如何根据当前的状态变化，也可以展示哪些事件将会改变类的对象的状态。状态图是对类图的补充。</p>
<h3 class="rp-toc-include" id="34活动图"><a href="#34活动图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.4活动图</h3>
<p>是状态图的一种特殊情况，这些状态大都处于活动状态。本质是一种流程图，它描述了活动到活动的控制流。</p>
<p>描述用例要求所要进行的活动，以及活动间的约束关系，有利于识别并行活动。能够演示出系统中哪些地方存在功能</p>
<h2 class="rp-toc-include" id="4实现视图"><a href="#4实现视图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>4.实现视图</h2>
<h3 class="rp-toc-include" id="41构件图-组件图"><a href="#41构件图-组件图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>4.1构件图 （组件图）</h3>
<p>描述代码构件的物理结构以及各种构建之间的依赖关系。用来建模软件的组件及其相互之间的关系，这些图由构件标记符和构件之间的关系构成。在组件图中，构件时软件单个组成部分，它可以是一个文件，产品、可执行文件和脚本等。</p>
<h2 class="rp-toc-include" id="5拓扑视图"><a href="#5拓扑视图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>5.拓扑视图</h2>
<h3 class="rp-toc-include" id="51部署图"><a href="#51部署图" class="rp-header-anchor rp-link" aria-hidden="true">#</a>5.1部署图</h3>
<p>是用来建模系统的物理部署。例如计算机和设备，以及它们之间是如何连接的。部署图的使用者是开发人员、系统集成人员和测试人员。</p>
<h2 class="rp-toc-include" id="6软件设计及过程"><a href="#6软件设计及过程" class="rp-header-anchor rp-link" aria-hidden="true">#</a>6.软件设计及过程</h2>
<p>在需求阶段：采用用例图来描述需求<br/>
在分析阶段：采用类图来描述静态结构<br/>
在设计阶段：采用类图、包图对类的接口进行设计<br/>
在实现阶段：将类用某个面向对象的语言实现<br/>
在集成与交付阶段：构件图、包图、部署图<br/>
在测试阶段：单元测试使用类图和类的规格说明书<br/>
集成测试阶段使用类图、包图、构件图和合作图<br/>
系统测试使用用例图来测试系统功能</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[边缘计算系统中延迟敏感任务的成本有效调度]]></title>
        <id>/blog/2019/hexo-边缘计算系统中延迟敏感任务的成本有效调度</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-边缘计算系统中延迟敏感任务的成本有效调度"/>
        <updated>2019-04-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文研究了边缘计算系统中延迟敏感任务的成本效益调度问题。文章将该问题建模为一个NP难的优化问题，目标是在满足所有任务延迟要求的前提下，最小化整个系统的成本。为解决此问题，作者提出了一种名为“两阶段任务调度成本优化”（TTSCO）的近似算法，并通过与最优解的对比验证了其有效性，证明该算法能显著降低系统成本。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="边缘计算系统中延迟敏感任务的成本有效调度"><a href="#边缘计算系统中延迟敏感任务的成本有效调度" class="rp-header-anchor rp-link" aria-hidden="true">#</a>边缘计算系统中延迟敏感任务的成本有效调度<!-- --> </h1>
<h2 class="rp-toc-include" id="摘要"><a href="#摘要" class="rp-header-anchor rp-link" aria-hidden="true">#</a>摘要</h2>
<p>边缘计算作为一种新兴的计算模型，可以将具有有限计算资源和能量的物联网（IoT）设备的延迟敏感计算任务卸载到边缘云。在边缘计算系统中，多个服务器放置在IoT设备附近的网络边缘上以处理卸载的任务。边缘计算系统的一个关键问题是如何在完成卸载任务的同时降低系统成本。在本文中，我们研究任务调度问题，以降低边缘计算系统的成本。我们将任务调度问题建模为优化问题，其目标是在满足所有任务的延迟要求的同时最小化系统成本。然后，我们证明了所提出的优化问题是NP难的。为了有效地解决这个优化问题，我们提出了一种任务调度算法，称为两阶段任务调度成本优化（TTSCO）。我们通过与最优解进行比较来验证算法的有效性。结果表明，对于我们使用的95％的数据集，近似比率小于1.2。性能评估表明，该算法能够有效降低边缘计算系统的成本，同时满足所有任务的延迟要求。索引术语</p>
<ul>
<li>边缘计算;任务调度;延迟敏感的任务;成本效益;</li>
</ul>
<h2 class="rp-toc-include" id="云计算与边缘计算的区别和边缘计算要解决的问题"><a href="#云计算与边缘计算的区别和边缘计算要解决的问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>云计算与边缘计算的区别和边缘计算要解决的问题</h2>
<p>随着物联网技术的发展，延迟敏感应用（例如，健康监测[1]，基于位置的增强现实游戏）的数量正在迅速增加[2]。由于物联网设备的计算资源和能量有限，因此应将许多处理繁重的任务卸载到远程服务器进行处理。具有强大计算能力的云计算被认为是处理卸载任务的潜在方式。但是，由于传统云和物联网设备之间的距离较远，将大量任务发送到传统云进行处理会导致响应时间过长，网络拥塞严重。为了解决这个问题，最近提出边缘计算作为一种有前景的计算模型[3]，[4]。边缘计算提供附加的计算基础设施层，其由网络边缘处的一些服务器（即，基站）组成。对于从物联网设备卸载的计算任务，边缘计算提供计算服务并将结果返回给设备。这样，卸载任务的传输延迟和核心网的流量负载将大大降低。</p>
<h2 class="rp-toc-include" id="在边缘计算中的任务调度问题"><a href="#在边缘计算中的任务调度问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>在边缘计算中的任务调度问题</h2>
<p>设备如何进行任务卸载决策
降低传输或计算任务所产生的系统成本
边缘计算系统中任务调度问题的成本优化
在边缘计算中，任务调度问题已成为研究的热门话题[9] - [18]。为了减少由任务计算引起的能耗，物联网设备会将计算任务卸载到边缘服务器。但是，卸载任务会消耗额外的能量来将任务传输到边缘服务器，卸载任务的完成时间也会增加。在这种情况下，一些工作研究了设备如何进行任务卸载决策[9] - [12]。另外，当计算任务被调度到不同的边缘服务器时，传输和计算的成本也不同。因此，一些工作旨在降低传输或计算任务所产生的系统成本[13] - [18]。但是，这些工作很少考虑边缘服务器生成的成本。在非高峰时间（例如，在夜间）降低由服务器引起的系统成本的问题在很大程度上未被探索[5]。</p>
<h2 class="rp-toc-include" id="本文研究的问题"><a href="#本文研究的问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>本文研究的问题</h2>
<p>边缘计算系统中任务调度问题的成本优化，在本文中，我们研究边缘计算系统中任务调度问题的成本优化。目标是在满足所有任务的QoS要求的同时最小化边缘计算系统的成本。我们为延迟敏感的输入任务开发了一个任务调度模型。然后，我们制定成本优化问题并证明该优化问题为NP-Hard。接下来，我们提出了一种近似算法来解决这个优化问题，称为两阶段任务调度成本优化（TTSCO），并对TTSCO算法进行分析。最后，仿真结果验证了算法的准确性和性能。</p>
<p>边缘计算作为一种新兴的计算模型，可以将具有有限计算资源和能量的物联网（IoT）设备的延迟敏感计算任务卸载到边缘云。在边缘计算系统中，多个服务器放置在IoT设备附近的网络边缘上以处理卸载的任务。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[java注解的使用]]></title>
        <id>/blog/2019/hexo-java注解的使用</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-java注解的使用"/>
        <updated>2019-03-20T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了Java中的注解（Annotation）及其使用。主要讲解了三种标准注解（@Override, @Deprecated, @SuppressWarnings）和四种元注解（@Target, @Retention, @Documented, @Inherited）的功能与用法，并提及了Java 7和8中新增的@SafeVarargs, @FunctionalInterface, @Repeatable注解。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="java注解的使用"><a href="#java注解的使用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>java注解的使用<!-- --> </h1>
<h3 class="rp-toc-include" id="1三种标准注解"><a href="#1三种标准注解" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.三种标准注解</h3>
<ul>
<li>
<p>@Override,表示当前的方法定义覆盖了父类中的方法。必须要有相同的方法签名即(方法名，参数类型，参数顺序，参数个数)都一样。否则在编译过程中发出错误提示。</p>
</li>
<li>
<p>@Deprecated,对不应该再使用的方法添加注解，当使用这个方法的时候，会在编译时候显示提示信息。</p>
</li>
<li>
<p>@SuppressWarnings,关闭不当的编译器报警信息</p>
</li>
</ul>
<h3 class="rp-toc-include" id="2四种元注解"><a href="#2四种元注解" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.四种元注解：</h3>
<ul>
<li>
<p>@Target,表示该注解可以用什么地方。如CONSTRUCTOR,构造器声明；FIELD,域声明;METHOD,方法声明;TYPE，类，接口或enum声明</p>
</li>
<li>
<p>@Retention,表示需要在什么级别保存该注解信息。如SOURCE,注解将被编译器丢弃；CLASS,注解在class文件可用，但会被VM丢弃RUNTIME,VM将在运行期间也保留注解，可以使用反射机制读取注解信息</p>
</li>
<li>
<p>@Documented,将此注解包含到Javadoc中。</p>
</li>
<li>
<p>@Inherited,允许子类继承父类的注解。</p>
</li>
</ul>
<p>Java 7开始，额外添加了 3 个注解:</p>
<ul>
<li>
<p>@SafeVarargs - Java 7
开始支持，忽略任何使用参数为泛型变量的方法或构造函数调用产生</p>
</li>
<li>
<p>@FunctionalInterface - Java 8
开始支持，标识一个匿名函数或函数式接口。</p>
</li>
<li>
<p>@Repeatable - Java 8
开始支持，标识某注解可以在同一个声明上使用多次。</p>
</li>
</ul><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[数据可视化开源项目]]></title>
        <id>/blog/2019/hexo-数据可视化开源项目</id>
        <link href="https://www.vhcffh.com/blog/2019/hexo-数据可视化开源项目"/>
        <updated>2019-03-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文盘点了一系列优秀的数据可视化开源项目，主要基于JavaScript。文中列举并介绍了多个知名的图表库，如D3.js、Chart.js、LeafletJS（专注于地图）、ECharts（百度出品）、Chartist.js等。此外，还提及了阿里巴巴的AntV系列可视化解决方案，包括G2、G6、F2和L7，为开发者提供了丰富的选择。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="数据可视化开源项目"><a href="#数据可视化开源项目" class="rp-header-anchor rp-link" aria-hidden="true">#</a>数据可视化开源项目<!-- --> </h1>
<h2 class="rp-toc-include" id="1d3"><a href="#1d3" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.<a href="https://d3js.org/" target="_blank" rel="noopener noreferrer" class="rp-link">D3</a></h2>
<p>github地址:<a href="https://github.com/d3/d3" target="_blank" rel="noopener noreferrer" class="rp-link">https://github.com/d3/d3</a></p>
<p><img alt="d3" src="/static/image/8_10_d3.58bbdb3cd2.png"/></p>
<h2 class="rp-toc-include" id="2chartjs"><a href="#2chartjs" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.<a href="https://www.chartjs.org" target="_blank" rel="noopener noreferrer" class="rp-link">chartjs</a></h2>
<p>github地址:<a href="https://github.com/chartjs/Chart.js" target="_blank" rel="noopener noreferrer" class="rp-link">https://github.com/chartjs/Chart.js</a></p>
<p><img alt="charts" src="/static/image/8_10_charts.da8ec5a740.png"/></p>
<h2 class="rp-toc-include" id="3leafletjs"><a href="#3leafletjs" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.<a href="https://leafletjs.com/examples.html" target="_blank" rel="noopener noreferrer" class="rp-link">leafletjs</a></h2>
<p>github地址:<a href="https://github.com/Leaflet/Leaflet" target="_blank" rel="noopener noreferrer" class="rp-link">https://github.com/Leaflet/Leaflet</a></p>
<p>主要是移动端地图的支持</p>
<p><img alt="leafletjs" src="/static/image/8_10_leafletjs.d848c43b1e.png"/></p>
<h2 class="rp-toc-include" id="4echarts"><a href="#4echarts" class="rp-header-anchor rp-link" aria-hidden="true">#</a>4.<a href="https://echarts.baidu.com/examples/#chart-type-line" target="_blank" rel="noopener noreferrer" class="rp-link">echarts</a></h2>
<p>百度家的</p>
<p>github地址:<a href="https://github.com/ecomfe/echarts" target="_blank" rel="noopener noreferrer" class="rp-link">https://github.com/ecomfe/echarts</a></p>
<p><img alt="echarts" src="/static/image/8_10_echarts.1df0d862b2.png"/></p>
<h2 class="rp-toc-include" id="5chartist-js"><a href="#5chartist-js" class="rp-header-anchor rp-link" aria-hidden="true">#</a>5.<a href="https://gionkunz.github.io/chartist-js/examples.html" target="_blank" rel="noopener noreferrer" class="rp-link">Chartist-js</a></h2>
<h2 class="rp-toc-include" id="6sigmajs"><a href="#6sigmajs" class="rp-header-anchor rp-link" aria-hidden="true">#</a>6.<a href="http://sigmajs.org/" target="_blank" rel="noopener noreferrer" class="rp-link">sigmajs</a></h2>
<h2 class="rp-toc-include" id="7metricsgraphicsjs"><a href="#7metricsgraphicsjs" class="rp-header-anchor rp-link" aria-hidden="true">#</a>7.<a href="https://metricsgraphicsjs.org/examples.htm" target="_blank" rel="noopener noreferrer" class="rp-link">metricsgraphicsjs</a></h2>
<h2 class="rp-toc-include" id="8dcjs开源d3"><a href="#8dcjs开源d3" class="rp-header-anchor rp-link" aria-hidden="true">#</a>8.<a href="https://dc-js.github.io/dc.js/" target="_blank" rel="noopener noreferrer" class="rp-link">DC.js,开源(D3)</a></h2>
<h3 class="rp-toc-include" id="9阿里数据可视化"><a href="#9阿里数据可视化" class="rp-header-anchor rp-link" aria-hidden="true">#</a>9.<a href="https://antv.alipay.com/zh-cn/index.html" target="_blank" rel="noopener noreferrer" class="rp-link">阿里数据可视化</a></h3>
<p><a href="https://antv.alipay.com/zh-cn/g2/3.x/demo/index.html" target="_blank" rel="noopener noreferrer" class="rp-link">G2</a>,<a href="https://antv.alipay.com/zh-cn/g6/2.x/demo/index.html" target="_blank" rel="noopener noreferrer" class="rp-link">G6</a>,<a href="https://antv.alipay.com/zh-cn/f2/3.x/demo/index.html" target="_blank" rel="noopener noreferrer" class="rp-link">F2</a>,<a href="https://antv.alipay.com/zh-cn/l7/1.x/demo/index.html" target="_blank" rel="noopener noreferrer" class="rp-link">L7</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[简单的iptables配置过程]]></title>
        <id>/blog/2018/hexo-简单的iptables配置过程</id>
        <link href="https://www.vhcffh.com/blog/2018/hexo-简单的iptables配置过程"/>
        <updated>2018-10-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了一个简单而实用的iptables防火墙配置流程，方便日后查阅。文章将配置过程总结为四个核心步骤：首先，清除所有旧的、自定义的规则；其次，为INPUT、OUTPUT、FORWARD等链设定默认的策略（如默认拒绝所有入站请求）；接着，根据需要添加具体的自定义规则，例如允许特定端口（如SSH的22端口）的TCP连接；最后，讲解了如何保存当前配置，以确保重启后规则依然生效。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="简单的iptables配置过程"><a href="#简单的iptables配置过程" class="rp-header-anchor rp-link" aria-hidden="true">#</a>简单的iptables配置过程<!-- --> </h1>
<p>简单的记一下iptables的配置过程，以后用到了就不用再google了<br/>
总的来说分为四步，清楚规则，预设规则，添加自定义规则，保存规则</p>
<h2 class="rp-toc-include" id="iptables配置过程"><a href="#iptables配置过程" class="rp-header-anchor rp-link" aria-hidden="true">#</a>iptables配置过程</h2>
<p>1.清除规则:</p>
<p>清楚旧的规则<br/>
iptables -F 清除预设表filter中的所有规则链的规则<br/>
iptables -X 清除预设表filter中使用者自定链中的规则</p>
<p>2.设定预设规则</p>
<p>默认情况下对各种包的处理方式<br/>
iptables -p INPUT DROP<br/>
iptables -p OUTPUT ACCEPT<br/>
iptables -p FORWARD DROP</p>
<p>3.添加用户自定义规则</p>
<p>对于特定端口协议的包的规则进行设置<br/>
iptables -A INPUT -p tcp ---dport 22 -j ACCEPT<br/>
-A:表示添加规则到INPUT(OUTPUT,FORWARD)链<br/>
-p:表示tcp(udp)协议<br/>
---dport(---sport):目的端口号(源端口号)<br/>
-j():添加规则为接受</p>
<p>4.保存规则</p>
<p>不保存的话重启后就没有了<br/>
service iptables save</p>
<p>参考资料</p>
<p>1.<a href="http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html" target="_blank" rel="noopener noreferrer" class="rp-link">http://www.cnblogs.com/JemBai/archive/2009/03/19/1416364.html</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[socket网络编程]]></title>
        <id>/blog/2018/hexo-socket网络编程</id>
        <link href="https://www.vhcffh.com/blog/2018/hexo-socket网络编程"/>
        <updated>2018-10-18T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是一篇关于Socket网络编程中常用函数的学习笔记。文章详细列举并解释了多个关键函数的功能和用法，包括用于IP地址格式转换的`inet_aton`, `inet_ntoa`, `inet_addr`, `inet_pton`和`inet_ntop`。此外，还介绍了用于I/O多路复用的`select`函数，用于设置套接字选项的`setsockopt`函数，以及用于接收数据的`recvfrom`函数，为网络编程提供了重要的参考。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="socket网络编程"><a href="#socket网络编程" class="rp-header-anchor rp-link" aria-hidden="true">#</a>socket网络编程<!-- --> </h1>
<h3 class="rp-toc-include" id="socket网络编程-1"><a href="#socket网络编程-1" class="rp-header-anchor rp-link" aria-hidden="true">#</a>socket网络编程</h3>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>int inet_aton(const char *cp, struct in_addr *inp);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>转换网络主机地址为二进制数值并存储与第二个参数中<br/>
函数返回0表示主机地址无效，非0表示主机地址有效<br/>
转化完后需要调用htons或htonl函数才能将主机字节序转换为网络字节序用于网络传输</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>char *inet_ntoa(struct in_addr in);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>转换网络字节序为标准的ASCII以点分开的地址，函数返回字符串指针<br/>
该字符串空间为静态分配，第二次调用时会覆盖第一次的内容</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>in_addr_t inet_addr(const char *cp);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>转换网络主机地址为网络字节序二进制值<br/>
参数无效，返回-1(INADDR_NONE)<br/>
注意：转换255.255.255.255时也返回-1</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>int inet_pton(int af, const char *src, void *dst);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>转换字符串到网络地址，af是地址簇，<em>src是来源地址，</em>
dst接收转换后的数据。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>转换网络字节序二进制值到ASCII类型的地址，参数的作用和inet_pton相同，<br/>
socklen_t
cnt指所指向缓存区dst的大小，避免溢出，如果缓存区太小无法存储地址的值，则返回一个空指针，并将errno置为ENOSPC。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>int maxfdp
指集合中所有文件描述符的范围，即所有文件描述符的最大值加1，不能错！在Windows中这个参数的值无所谓，可以设置不正确。<br/>
struct fd_set
可以理解为一个集合，这个集合中存放的是文件描述符(filedescriptor)，即文件句柄。监视这些文件描述符的读变化</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>int setsockopt(SOCKET s,int level,int optname,const char* optval,int optlen);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>s(套接字): 指向一个打开的套接口描述字<br/>
level:(级别)： 指定选项代码的类型。<br/>
SOL_SOCKET: 基本套接口<br/>
IPPROTO_IP: IPv4套接口<br/>
IPPROTO_IPV6: IPv6套接口<br/>
IPPROTO_TCP: TCP套接口<br/>
optname(选项名)： 选项名称<br/>
optval(选项值): 是一个指向变量的指针 类型：整形，套接口结构，
其他结构类型:linger{}, timeval{ }<br/>
optlen(选项长度) ：optval 的大小</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>int PASCAL FAR recvfrom( SOCKET s, char FAR* buf, int len, int flags,struct sockaddr FAR* from, int FAR* fromlen);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>s：标识一个已连接套接口的描述字。<br/>
buf：接收数据缓冲区。<br/>
len：缓冲区长度。<br/>
flags：调用操作方式。<br/>
from：（可选）指针，指向装有源地址的缓冲区。<br/>
fromlen：（可选）指针，指向from缓冲区长度值。</p>
<h3 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h3>
<p>1.<a href="https://blog.csdn.net/zyy617532750/article/details/58595700" target="_blank" rel="noopener noreferrer" class="rp-link">https://blog.csdn.net/zyy617532750/article/details/58595700</a><br/>
2.<a href="https://www.cnblogs.com/zhoudingcocng/p/6209961.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.cnblogs.com/zhoudingcocng/p/6209961.html</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[形式语言与自动机基础知识]]></title>
        <id>/blog/2018/hexo-形式语言与自动机基础知识</id>
        <link href="https://www.vhcffh.com/blog/2018/hexo-形式语言与自动机基础知识"/>
        <updated>2018-09-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文为学习《形式语言与自动机》课程所需的基础知识提供了精炼的总结，特别适合没有离散数学背景的读者。内容系统地梳理了集合论的基本概念，包括子集与真子集、集合的交、并、差、补运算、幂集以及笛卡尔乘积。此外，文章还详细定义了集合之间的关系及其性质，如自反性、对称性和传递性，并最终引出了等价关系的概念，为后续课程学习打下坚实基础。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="形式语言与自动机基础知识"><a href="#形式语言与自动机基础知识" class="rp-header-anchor rp-link" aria-hidden="true">#</a>形式语言与自动机基础知识<!-- --> </h1>
<p>形式语言与自动机这门课需要有离散数学的基础，但本科通信工程里没有学过这门课，总结一些这门课中需要的基础知识</p>
<h2 class="rp-toc-include" id="1集合及其运算"><a href="#1集合及其运算" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.集合及其运算</h2>
<h3 class="rp-toc-include" id="11子集和真子集"><a href="#11子集和真子集" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.1子集和真子集</h3>
<p>$A$子集：$A \subseteq B​$或$B \subseteq A​$<br/>
$A​$是$B​$的真子集：$A \subset B​$或$B \subset A​$<br/>
$x​$是$A​$的一个元素：$x \in A​$<br/>
$x​$不是$A​$的一个元素：$x \notin A​$</p>
<h3 class="rp-toc-include" id="12集合的交并差补"><a href="#12集合的交并差补" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.2集合的交并差补</h3>
<p>$A$和$B$的并集：$A\cup B={x|x\in A或x\in B}$<br/>
$A$和$B$的交集：$A\cap B={x|x\in A且x\in B}$<br/>
$A$和$B$的差集：$A - B={x|x\in A且x\notin B}$<br/>
若$B\subseteq
A$我们也称$A−B$为$B$的（关于$A$）补,记作：$\overline B(A)​$</p>
<h3 class="rp-toc-include" id="13集合的并的推广"><a href="#13集合的并的推广" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.3集合的并的推广</h3>
<p>设$I​$是某些标号的集合我们将$\displaystyle \bigcup_{i\in
I}A_i={x|存在i\in I,使得x\in A_i}​$</p>
<h3 class="rp-toc-include" id="14a的幂集"><a href="#14a的幂集" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.4A的幂集</h3>
<p>$A$的所有子集的集合，记作$2^A={B|B\subseteq A}​$</p>
<h3 class="rp-toc-include" id="15笛卡尔乘积"><a href="#15笛卡尔乘积" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.5笛卡尔乘积</h3>
<p>$A\times B={(a,b)|a\in A且b\in B}$</p>
<h3 class="rp-toc-include" id="16集合之间的关系"><a href="#16集合之间的关系" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.6集合之间的关系</h3>
<p>由$A$到$B$的关系是$A×B$的任何子集。若$A=B$，则称为$A$上的关系。若$R$为$A$到$B$的关系，当$(a,b)$在$R$内时，可写成$aRb​$</p>
<h3 class="rp-toc-include" id="17集合关系的性质"><a href="#17集合关系的性质" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.7集合关系的性质</h3>
<p>设$R$是集合$A$上的关系，则有<br/>
（1）若对$A$中的任一元素$a$，都有$aRa$，则称$R$是<strong>自反的</strong>；<br/>
（2）若对$A$中的任何元素$a,b$，从$aRb$能够推到出$bRa$，则称$R$是<strong>对称的</strong>；<br/>
（3）若$a,b,c$是$A$中的元素，从$aRb$和$bRc$能够推出$aRc$，则称$R$是<strong>传递的</strong>；<br/>
若关系$R​$同时是自反的，对称的和传递的，则称之为<strong>等价关系</strong>。<br/>
2018-09-22 15:28:12</p>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<p>1.《形式语言与自动机》陈有祺编著</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[梯度旋度和散度]]></title>
        <id>/blog/2018/hexo-梯度旋度和散度</id>
        <link href="https://www.vhcffh.com/blog/2018/hexo-梯度旋度和散度"/>
        <updated>2018-09-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文清晰地记录和解释了向量微积分中三个核心概念：梯度（Gradient）、旋度（Curl）和散度（Divergence）。文章分别给出了它们的数学定义和计算公式。梯度是指标量场在某点的变化率最大的方向和大小；旋度描述了向量场在某点附近的旋转程度；而散度则衡量了向量场在某点的源或汇的强度。文中使用了∇算子来形象地表示这三个概念，便于理解和记忆。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="梯度旋度和散度"><a href="#梯度旋度和散度" class="rp-header-anchor rp-link" aria-hidden="true">#</a>梯度旋度和散度<!-- --> </h1>
<p>有关梯度旋度和散度的定义和计算,记录一下</p>
<h2 class="rp-toc-include" id="1定义"><a href="#1定义" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.定义</h2>
<h3 class="rp-toc-include" id="11梯度"><a href="#11梯度" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.1梯度</h3>
<p>设函数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">u=f(x,y,z)</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">u</span><span 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="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.04398em">z</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>G</mi></mrow><annotation encoding="application/x-tex">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">G</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 stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo><mo>∈</mo><mi>G</mi></mrow><annotation encoding="application/x-tex">P(x,y,z) \in G</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">P</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.04398em">z</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">G</span></span></span></span>
则向量</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mrow><mo fence="true">(</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>f</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>x</mi></mrow></mfrac><mo separator="true">,</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>f</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>y</mi></mrow></mfrac><mo separator="true">,</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>f</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>z</mi></mrow></mfrac><mo fence="true">)</mo></mrow><mo>=</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>f</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>x</mi></mrow></mfrac><mover accent="true"><mi>i</mi><mo>⃗</mo></mover><mo>+</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>f</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>y</mi></mrow></mfrac><mover accent="true"><mi>j</mi><mo>⃗</mo></mover><mo>+</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><mi>f</mi></mrow><mrow><mi mathvariant="normal">∂</mi><mi>z</mi></mrow></mfrac><mover accent="true"><mi>k</mi><mo>⃗</mo></mover></mrow><annotation encoding="application/x-tex">\left(
    \frac {\partial f}{\partial x},
    \frac {\partial f}{\partial y},
    \frac {\partial f}{\partial z}
\right)=
\frac {\partial f}{\partial x}\vec i+
\frac {\partial f}{\partial y}\vec j+
\frac {\partial f}{\partial z}\vec k
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.4em;vertical-align:-0.95em"></span><span class="minner"><span class="mopen delimcenter" style="top:0em"><span class="delimsizing size3">(</span></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">x</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.10764em">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.03588em">y</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.10764em">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.04398em">z</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.10764em">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em"><span class="delimsizing size3">)</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:2.0574em;vertical-align:-0.686em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">x</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.10764em">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">i</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></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:2.2519em;vertical-align:-0.8804em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.03588em">y</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.10764em">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.05724em">j</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></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:2.0574em;vertical-align:-0.686em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.04398em">z</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.10764em">f</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9774em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03148em">k</span></span><span style="top:-3.2634em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>为函数<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>u</mi><mo>=</mo><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">u=f(x,y,z)</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">u</span><span 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="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.04398em">z</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>P</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(x,y,z)</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">P</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="mclose">)</span></span></span></span>的<strong>梯度</strong></p>
<p>记为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>g</mi><mi>r</mi><mi>a</mi><mi>d</mi><mtext>  </mtext><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">grad\;f(x,y,z)</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.03588em">g</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span><span class="mord mathnormal">a</span><span class="mord mathnormal">d</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.04398em">z</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 mathvariant="normal">∇</mi><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">\nabla f(x,y,z)</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><span class="mord mathnormal" style="margin-right:0.10764em">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="mclose">)</span></span></span></span></p>
<p>(<font color="red">注</font>: <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi mathvariant="normal">∇</mi><mo>=</mo><mfrac><mi mathvariant="normal">∂</mi><mrow><mi mathvariant="normal">∂</mi><mi>x</mi></mrow></mfrac><mover accent="true"><mi>i</mi><mo>⃗</mo></mover><mo>+</mo><mfrac><mi mathvariant="normal">∂</mi><mrow><mi mathvariant="normal">∂</mi><mi>y</mi></mrow></mfrac><mover accent="true"><mi>j</mi><mo>⃗</mo></mover><mo>+</mo><mfrac><mi mathvariant="normal">∂</mi><mrow><mi mathvariant="normal">∂</mi><mi>z</mi></mrow></mfrac><mover accent="true"><mi>k</mi><mo>⃗</mo></mover></mrow><annotation encoding="application/x-tex">\nabla = \frac {\partial}{\partial x}\vec i+\frac {\partial}{\partial y}\vec j+\frac {\partial}{\partial z}\vec 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">∇</span><span 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.2875em;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.8801em"><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" style="margin-right:0.05556em">∂</span><span class="mord mathnormal mtight">x</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" style="margin-right:0.05556em">∂</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="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">i</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></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:1.4236em;vertical-align:-0.4811em"></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.8801em"><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" style="margin-right:0.05556em">∂</span><span class="mord mathnormal mtight" style="margin-right:0.03588em">y</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" style="margin-right:0.05556em">∂</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4811em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.05724em">j</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></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.3224em;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.8801em"><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" style="margin-right:0.05556em">∂</span><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</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" style="margin-right:0.05556em">∂</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="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9774em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03148em">k</span></span><span style="top:-3.2634em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></span></span></span></span></span></span></span></span></span>为三维的向量微分算子)</p>
<h3 class="rp-toc-include" id="12旋度"><a href="#12旋度" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.2旋度</h3>
<p>在三维空间<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>G</mi></mrow><annotation encoding="application/x-tex">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">G</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><mrow><mi>x</mi><mi>y</mi><mi>z</mi></mrow></msub></mrow><annotation encoding="application/x-tex">O_{xyz}</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.02778em">O</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.0278em;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">x</span><span class="mord mathnormal mtight" style="margin-right:0.04398em">yz</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></span></span>,设向量场:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>v</mi><mo>⃗</mo></mover><mo>=</mo><msub><mi>v</mi><mi>x</mi></msub><mover accent="true"><mi>i</mi><mo>⃗</mo></mover><mo>+</mo><msub><mi>v</mi><mi>y</mi></msub><mover accent="true"><mi>j</mi><mo>⃗</mo></mover><mo>+</mo><msub><mi>v</mi><mi>z</mi></msub><mover accent="true"><mi>k</mi><mo>⃗</mo></mover></mrow><annotation encoding="application/x-tex">\vec v=v_x\vec i+v_y\vec j+v_z\vec k
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.714em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.714em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">v</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2077em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></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.0925em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="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 accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">i</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></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:1.2286em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.03588em">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.05724em">j</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></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.1274em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.04398em">z</span></span></span></span><span class="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 accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9774em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03148em">k</span></span><span style="top:-3.2634em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>v</mi><mi>x</mi></msub><mo separator="true">,</mo><msub><mi>v</mi><mi>y</mi></msub><mo separator="true">,</mo><msub><mi>v</mi><mi>z</mi></msub></mrow><annotation encoding="application/x-tex">v_x,v_y,v_z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="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.03588em">v</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.0359em;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.03588em">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.04398em">z</span></span></span></span><span 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>P</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo><mo>∈</mo><mi>G</mi></mrow><annotation encoding="application/x-tex">P(x,y,z) \in G</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">P</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.04398em">z</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">G</span></span></span></span></p>
<p>向量</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mrow><mo fence="true">∣</mo><mtable rowspacing="0.16em" columnalign="center center center" columnspacing="1em"><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mover accent="true"><mi>i</mi><mo>⃗</mo></mover></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mover accent="true"><mi>j</mi><mo>⃗</mo></mover></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mover accent="true"><mi>k</mi><mo>⃗</mo></mover></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mi mathvariant="normal">∂</mi><mrow><mi mathvariant="normal">∂</mi><mi>x</mi></mrow></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mi mathvariant="normal">∂</mi><mrow><mi mathvariant="normal">∂</mi><mi>y</mi></mrow></mfrac></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><mfrac><mi mathvariant="normal">∂</mi><mrow><mi mathvariant="normal">∂</mi><mi>z</mi></mrow></mfrac></mstyle></mtd></mtr><mtr><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mi>x</mi></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mi>y</mi></msub></mstyle></mtd><mtd><mstyle scriptlevel="0" displaystyle="false"><msub><mi>v</mi><mi>z</mi></msub></mstyle></mtd></mtr></mtable><mo fence="true">∣</mo></mrow><mo>=</mo><mo stretchy="false">(</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>v</mi><mi>z</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>y</mi></mrow></mfrac><mo>−</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>v</mi><mi>y</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>z</mi></mrow></mfrac><mo stretchy="false">)</mo><mover accent="true"><mi>i</mi><mo>⃗</mo></mover><mo>+</mo><mo stretchy="false">(</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>v</mi><mi>x</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>z</mi></mrow></mfrac><mo>−</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>v</mi><mi>z</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>x</mi></mrow></mfrac><mo stretchy="false">)</mo><mover accent="true"><mi>j</mi><mo>⃗</mo></mover><mo>+</mo><mo stretchy="false">(</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>v</mi><mi>y</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>x</mi></mrow></mfrac><mo>−</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>v</mi><mi>x</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>y</mi></mrow></mfrac><mo stretchy="false">)</mo><mover accent="true"><mi>k</mi><mo>⃗</mo></mover></mrow><annotation encoding="application/x-tex">  \begin{vmatrix}
  \vec i &amp; \vec j &amp; \vec k \cr
  \frac {\partial}{\partial x} &amp; \frac {\partial}{\partial y} &amp; \frac {\partial}{\partial z} \cr
  v_x &amp; v_y &amp; v_z \cr
  \end{vmatrix} = 
  (\frac {\partial v_z}{\partial y} - \frac {\partial v_y}{\partial z})\vec i+
  (\frac {\partial v_x}{\partial z} - \frac {\partial v_z}{\partial x})\vec j+
  (\frac {\partial v_y}{\partial x} - \frac {\partial v_x}{\partial y})\vec k
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:3.8987em;vertical-align:-1.6993em"></span><span class="minner"><span class="mopen"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em"><span style="top:-4.05em"><span class="pstrut" style="height:5.6em"></span><span style="width:0.333em;height:3.600em"><svg xmlns="http://www.w3.org/2000/svg" width="0.333em" height="3.600em" viewBox="0 0 333 3600"><path d="M145 15 v585 v2400 v585 c2.667,10,9.667,15,21,15
c10,0,16.667,-5,20,-15 v-585 v-2400 v-585 c-2.667,-10,-9.667,-15,-21,-15
c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v2400 v585 h43z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55em"><span></span></span></span></span></span></span><span class="mord"><span class="mtable"><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.1993em"><span style="top:-4.2219em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">i</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></span></span></span></span></span></span></span></span><span style="top:-2.9818em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.8801em"><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" style="margin-right:0.05556em">∂</span><span class="mord mathnormal mtight">x</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" style="margin-right:0.05556em">∂</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 style="top:-1.6607em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.6993em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.1993em"><span style="top:-4.2219em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.05724em">j</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></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 style="top:-2.9818em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.8801em"><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" style="margin-right:0.05556em">∂</span><span class="mord mathnormal mtight" style="margin-right:0.03588em">y</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" style="margin-right:0.05556em">∂</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4811em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span><span style="top:-1.6607em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.03588em">y</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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.6993em"><span></span></span></span></span></span><span class="arraycolsep" style="width:0.5em"></span><span class="arraycolsep" style="width:0.5em"></span><span class="col-align-c"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.1993em"><span style="top:-4.2219em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9774em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03148em">k</span></span><span style="top:-3.2634em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></span></span></span></span></span></span></span></span><span style="top:-2.9818em"><span class="pstrut" style="height:3em"></span><span class="mord"><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.8801em"><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" style="margin-right:0.05556em">∂</span><span class="mord mathnormal mtight" style="margin-right:0.04398em">z</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" style="margin-right:0.05556em">∂</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 style="top:-1.6607em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.04398em">z</span></span></span></span><span 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.6993em"><span></span></span></span></span></span></span></span><span class="mclose"><span class="delimsizing mult"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:2.05em"><span style="top:-4.05em"><span class="pstrut" style="height:5.6em"></span><span style="width:0.333em;height:3.600em"><svg xmlns="http://www.w3.org/2000/svg" width="0.333em" height="3.600em" viewBox="0 0 333 3600"><path d="M145 15 v585 v2400 v585 c2.667,10,9.667,15,21,15
c10,0,16.667,-5,20,-15 v-585 v-2400 v-585 c-2.667,-10,-9.667,-15,-21,-15
c-10,0,-16.667,5,-20,15z M188 15 H145 v585 v2400 v585 h43z"></path></svg></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:1.55em"><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:2.2519em;vertical-align:-0.8804em"></span><span class="mopen">(</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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.03588em">y</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.04398em">z</span></span></span></span><span 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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:2.0574em;vertical-align:-0.686em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.04398em">z</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.03588em">y</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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">i</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></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:2.0574em;vertical-align:-0.686em"></span><span class="mopen">(</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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.04398em">z</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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:2.0574em;vertical-align:-0.686em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">x</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.04398em">z</span></span></span></span><span 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.05724em">j</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></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:2.0574em;vertical-align:-0.686em"></span><span class="mopen">(</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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">x</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.03588em">y</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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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:2.2519em;vertical-align:-0.8804em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.03588em">y</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose">)</span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9774em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03148em">k</span></span><span style="top:-3.2634em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>为向量场<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mover accent="true"><mi>v</mi><mo>⃗</mo></mover></mrow><annotation encoding="application/x-tex">\vec v</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.714em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.714em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">v</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2077em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></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>P</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">P(x,y,z)</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">P</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.04398em">z</span><span class="mclose">)</span></span></span></span>的<strong>旋度</strong></p>
<p>记为<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mi>u</mi><mi>r</mi><mi>l</mi><mtext>  </mtext><mi>v</mi></mrow><annotation encoding="application/x-tex">curl\;v</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 mathnormal">c</span><span class="mord mathnormal">u</span><span class="mord mathnormal" style="margin-right:0.02778em">r</span><span class="mord mathnormal" style="margin-right:0.01968em">l</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord mathnormal" style="margin-right:0.03588em">v</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><mo>×</mo><mi>v</mi></mrow><annotation encoding="application/x-tex">\nabla \times v</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">∇</span><span 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" style="margin-right:0.03588em">v</span></span></span></span></p>
<h3 class="rp-toc-include" id="13散度"><a href="#13散度" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.3散度</h3>
<p>在三维空间<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>G</mi></mrow><annotation encoding="application/x-tex">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">G</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><mrow><mi>x</mi><mi>y</mi><mi>z</mi></mrow></msub></mrow><annotation encoding="application/x-tex">O_{xyz}</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.02778em">O</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.0278em;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">x</span><span class="mord mathnormal mtight" style="margin-right:0.04398em">yz</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span></span></span></span>,设向量场:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mover accent="true"><mi>v</mi><mo>⃗</mo></mover><mo>=</mo><msub><mi>v</mi><mi>x</mi></msub><mover accent="true"><mi>i</mi><mo>⃗</mo></mover><mo>+</mo><msub><mi>v</mi><mi>y</mi></msub><mover accent="true"><mi>j</mi><mo>⃗</mo></mover><mo>+</mo><msub><mi>v</mi><mi>z</mi></msub><mover accent="true"><mi>k</mi><mo>⃗</mo></mover></mrow><annotation encoding="application/x-tex">\vec v=v_x\vec i+v_y\vec j+v_z\vec k
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.714em"></span><span class="mord accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.714em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03588em">v</span></span><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2077em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></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.0925em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="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 accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal">i</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></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:1.2286em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.03588em">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mord accent"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.9425em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.05724em">j</span></span><span style="top:-3.2285em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></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.1274em;vertical-align:-0.15em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.04398em">z</span></span></span></span><span class="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 accent"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.9774em"><span style="top:-3em"><span class="pstrut" style="height:3em"></span><span class="mord mathnormal" style="margin-right:0.03148em">k</span></span><span style="top:-3.2634em"><span class="pstrut" style="height:3em"></span><span class="accent-body" style="left:-0.2355em"><span class="overlay" style="height:0.714em;width:0.471em"><svg xmlns="http://www.w3.org/2000/svg" width="0.471em" height="0.714em" style="width:0.471em" viewBox="0 0 471 714" preserveAspectRatio="xMinYMin"><path d="M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5
3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11
10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63
-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1
-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59
H213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359
c-16-25.333-24-45-24-59z"></path></svg></span></span></span></span></span></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>其中<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>v</mi><mi>x</mi></msub><mo separator="true">,</mo><msub><mi>v</mi><mi>y</mi></msub><mo separator="true">,</mo><msub><mi>v</mi><mi>z</mi></msub></mrow><annotation encoding="application/x-tex">v_x,v_y,v_z</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7167em;vertical-align:-0.2861em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span class="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.03588em">v</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.0359em;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.03588em">y</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2861em"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.04398em">z</span></span></span></span><span 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>P</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo><mo>∈</mo><mi>G</mi></mrow><annotation encoding="application/x-tex">P(x,y,z) \in G</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">P</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.04398em">z</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">G</span></span></span></span></p>
<p>标量</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>v</mi><mi>x</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>x</mi></mrow></mfrac><mo>+</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>v</mi><mi>y</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>y</mi></mrow></mfrac><mo>+</mo><mfrac><mrow><mi mathvariant="normal">∂</mi><msub><mi>v</mi><mi>z</mi></msub></mrow><mrow><mi mathvariant="normal">∂</mi><mi>z</mi></mrow></mfrac></mrow><annotation encoding="application/x-tex">\frac {\partial v_x}{\partial x}+
\frac {\partial v_y}{\partial y}+
\frac {\partial v_z}{\partial z}
</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:2.0574em;vertical-align:-0.686em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal">x</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;margin-right:0.05em"><span class="pstrut" style="height:2.7em"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">x</span></span></span></span><span 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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:2.2519em;vertical-align:-0.8804em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.03588em">y</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.03588em">y</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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.8804em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></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:2.0574em;vertical-align:-0.686em"></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.3714em"><span style="top:-2.314em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord mathnormal" style="margin-right:0.04398em">z</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.677em"><span class="pstrut" style="height:3em"></span><span class="mord"><span class="mord" style="margin-right:0.05556em">∂</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em">v</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.0359em;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.04398em">z</span></span></span></span><span 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="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>为向量场在点<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>P</mi><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo separator="true">,</mo><mi>z</mi><mo stretchy="false">)</mo><mo>∈</mo><mi>G</mi></mrow><annotation encoding="application/x-tex">P(x,y,z) \in G</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">P</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.03588em">y</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em"></span><span class="mord mathnormal" style="margin-right:0.04398em">z</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">G</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>d</mi><mi>i</mi><mi>v</mi><mtext>  </mtext><mi>v</mi></mrow><annotation encoding="application/x-tex">div\;v</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 mathnormal">d</span><span class="mord mathnormal">i</span><span class="mord mathnormal" style="margin-right:0.03588em">v</span><span class="mspace" style="margin-right:0.2778em"></span><span class="mord mathnormal" style="margin-right:0.03588em">v</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><mo>⋅</mo><mi>v</mi></mrow><annotation encoding="application/x-tex">\nabla \cdot v</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">∇</span><span 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" style="margin-right:0.03588em">v</span></span></span></span></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[vim的使用]]></title>
        <id>/blog/2018/hexo-vim的使用</id>
        <link href="https://www.vhcffh.com/blog/2018/hexo-vim的使用"/>
        <updated>2018-06-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是一篇简洁的Vim编辑器使用入门指南。文章主要介绍了两个方面的基本操作：一是光标的移动，包括使用`h,j,k,l`进行基本移动，通过`Ctrl`组合键实现翻页，以及利用`H,M,L,G`等命令进行快速定位。二是搜索与替换功能，讲解了如何使用`/`和`?`命令进行向下和向上搜索，以及如何使用`n`和`N`键重复上一次的搜索操作。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="vim的使用"><a href="#vim的使用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>vim的使用<!-- --> </h1>
<p>1.光标移动</p>
<p><code>h</code>,<code>j</code>,<code>k</code>,<code>l</code>(空格):向左，下，上，右移动光标</p>
<p><code>Ctrl</code>+<code>(f,b,d,u)</code>:屏幕向下移一页，向上移一页，向下移半页，向上移半页<br/>
+-:下一行，上一行<br/>
<code>H</code>,<code>M</code>,<code>L</code>:光标移动到这个屏幕的最上方，中央，最下方那一行的第一个字符<br/>
<code>G</code>,<code>nG</code>,<code>gg</code>:移动都文档末，移动到第n行，移动到第一行<br/>
<code>n</code>:向下移动n行</p>
<p>2.搜索替换</p>
<p><code>/word</code>:向光标之下寻找word<br/>
<code>?word</code>:向光标之上寻找word<br/>
<code>n</code>,<code>N</code>:重复搜索（不变方向，改变方向）</p>
<p>参考资料</p>
<p>1.<a href="http://www.runoob.com/linux/linux-vim.html" target="_blank" rel="noopener noreferrer" class="rp-link">http://www.runoob.com/linux/linux-vim.html</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[python中关于路径的知识]]></title>
        <id>/blog/2018/hexo-python中关于路径的知识</id>
        <link href="https://www.vhcffh.com/blog/2018/hexo-python中关于路径的知识"/>
        <updated>2018-05-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文简明扼要地总结了Python中`os`模块里用于处理文件和目录路径的几个常用函数。内容涵盖了获取当前工作目录（`os.getcwd`）、列出目录内容（`os.listdir`）、删除文件（`os.remove`或`os.unlink`）、删除空目录（`os.rmdir`）、递归删除目录（`os.removedirs`）以及更改当前工作目录（`os.chdir`）等基本操作，为Python进行文件系统交互提供了实用的命令参考。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="python中关于路径的知识"><a href="#python中关于路径的知识" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python中关于路径的知识<!-- --> </h1>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-foreground)">    os</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getcwd</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #输出当前路径</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    os</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">listdir</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #输出当前路径下的所有文件夹名和文件名</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    os</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">remove</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;filename.xxx&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-foreground)">和os</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">unlink</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;filename.xxx&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span><span style="color:var(--shiki-foreground)">功能一样</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #删除文件filename.xxx</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    os</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">rmdir</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;path&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #删除目录（目录必须为空）</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    os</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">removedirs</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;p1//p2//p3&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #依次删除目录p3,p2,p1直到某一目录不为空</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    os</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">chdir</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;path&#x27;</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #更改当前路径</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>参考资料</p>
<p>1.<a href="https://www.cnblogs.com/yanglang/p/7610838.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.cnblogs.com/yanglang/p/7610838.html</a><br/>
2.<a href="https://blog.csdn.net/muwinter/article/details/77196261" target="_blank" rel="noopener noreferrer" class="rp-link">https://blog.csdn.net/muwinter/article/details/77196261</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[python类和实例的一些属性]]></title>
        <id>/blog/2018/hexo-python类和实例的一些属性</id>
        <link href="https://www.vhcffh.com/blog/2018/hexo-python类和实例的一些属性"/>
        <updated>2018-05-17T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文深入探讨了Python中类与实例的一些特殊属性和方法。内容详细讲解了`self`与`__init__`方法的作用，区分了类属性和实例属性，并展示了如何通过`__class__`访问被实例属性覆盖的类属性。此外，文章还介绍了如何利用`__init__`统计类的实例数量，`__dict__`属性在类和实例中的不同内容，以及如何通过实现`__len__`和`__getitem__`等魔术方法让自定义对象支持内置函数和操作。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="python类和实例的一些属性"><a href="#python类和实例的一些属性" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python类和实例的一些属性<!-- --> </h1>
<h2 class="rp-toc-include" id="1self和__init__"><a href="#1self和__init__" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.self和__init__()</h2>
<p>self代表类的实例,如下：</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    class</span><span style="color:var(--shiki-token-function)"> Test</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">b</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;classa&#x27;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&#x27;classb&#x27;</span><span style="color:var(--shiki-token-comment)">#类的属性</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        def</span><span style="color:var(--shiki-token-function)"> __init__</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">b</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;selfb&#x27;</span><span style="color:var(--shiki-token-comment)">#实例的属性</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">c</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;selfc&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(Test.a)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(Test.b)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #-output:classa classb-访问类的属性</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    a</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">Test</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(a.a)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #-output:classa-通过实例访问类的属性</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(a.b)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #-output:selfb-当实例和类都具有某属性时,输出实例属性</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(a.c)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(Test.c)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #output</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>当实例和类有相同的属性时，如何通过实例访问类的属性呢？<br/>
可以通过__class__访问</p>
<h2 class="rp-toc-include" id="2class"><a href="#2class" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.<strong>class</strong></h2>
<p>__class__是指实例所对应的类</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-comment)">    # -*- coding: utf-8 -*-</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    class</span><span style="color:var(--shiki-token-function)"> Test</span><span style="color:var(--shiki-foreground)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;classa&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        print</span><span style="color:var(--shiki-token-punctuation)">(count)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        def</span><span style="color:var(--shiki-token-function)"> __init__</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">a</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;selfa&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            print</span><span style="color:var(--shiki-token-punctuation)">(self)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            #-output:&lt;__main__.Test object at 0x055A1270&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            print</span><span style="color:var(--shiki-token-punctuation)">(self.</span><span style="color:var(--shiki-token-constant)">__class__</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            #-output:&lt;class &#x27;__main__.Test&#x27;&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    a</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">Test</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;实例a&#x27;</span><span style="color:var(--shiki-token-punctuation)">,a)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #-output:&lt;__main__.Test object at 0x055A1270&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(</span><span style="color:var(--shiki-token-string-expression)">&#x27;类Test&#x27;</span><span style="color:var(--shiki-token-punctuation)">,Test)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #-output:&lt;class &#x27;__main__.Test&#x27;&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    print</span><span style="color:var(--shiki-token-punctuation)">(a.a,a.</span><span style="color:var(--shiki-token-constant)">__class__</span><span style="color:var(--shiki-token-punctuation)">.a)</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    #-output:selfa classa</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>通过__init__()可以实现对类的实例的统计</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-comment)">    # -*- coding: utf-8 -*-</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    class</span><span style="color:var(--shiki-token-function)"> Test</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">object</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        count</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        def</span><span style="color:var(--shiki-token-function)"> __init__</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">            super</span><span style="color:var(--shiki-token-punctuation)">(Test, self).</span><span style="color:var(--shiki-token-function)">__init__</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">__class__</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">count</span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)">1</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-token-constant)"> __name__</span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-string-expression)">&quot;__main__&quot;</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">Test</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        print</span><span style="color:var(--shiki-token-punctuation)">(Test.count)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">Test</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        print</span><span style="color:var(--shiki-token-punctuation)">(Test.count)</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        Test</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        print</span><span style="color:var(--shiki-token-punctuation)">(Test.count)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>输出为</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>1</span></span>
<span class="line"><span>2</span></span>
<span class="line"><span>3</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>每创建一个Test类的实例,Test.count都加1</p>
<h2 class="rp-toc-include" id="3dict"><a href="#3dict" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.<strong>dict</strong></h2>
<p>__dict__是一个字典，键是属性名，值为属性值。<br/>
类有自己的__dict__，类的实例也有自己的__dict__</p>
<div class="rp-codeblock language-python"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="python"><code><span class="line"><span style="color:var(--shiki-token-comment)">    # -*- coding: utf-8 -*-</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    class</span><span style="color:var(--shiki-token-function)"> Test</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">object</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        classa</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;classa&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        def</span><span style="color:var(--shiki-token-function)"> __init__</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-parameter)">self</span><span style="color:var(--shiki-foreground)">):</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">            super</span><span style="color:var(--shiki-token-punctuation)">(Test, self).</span><span style="color:var(--shiki-token-function)">__init__</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            self</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">selfb</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&#x27;selfb&#x27;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-token-constant)"> __name__</span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-string-expression)">&quot;__main__&quot;</span><span style="color:var(--shiki-token-punctuation)">:</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        print</span><span style="color:var(--shiki-token-punctuation)">(Test.</span><span style="color:var(--shiki-token-constant)">__dict__</span><span style="color:var(--shiki-token-punctuation)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">Test</span><span style="color:var(--shiki-token-punctuation)">()</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        print</span><span style="color:var(--shiki-token-punctuation)">(a.</span><span style="color:var(--shiki-token-constant)">__dict__</span><span style="color:var(--shiki-token-punctuation)">)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>输出为</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>{&#x27;__module__&#x27;: &#x27;__main__&#x27;, &#x27;classa&#x27;: &#x27;classa&#x27;, &#x27;__init__&#x27;: &lt;function Test.__init__ at 0x04D03468&gt;, &#x27;__dict__&#x27;: &lt;attribute &#x27;__dict__&#x27; of &#x27;Test&#x27; objects&gt;, &#x27;__weakref__&#x27;: &lt;attribute &#x27;__weakref__&#x27; of &#x27;Test&#x27; objects&gt;, &#x27;__doc__&#x27;: None}</span></span>
<span class="line"><span>{&#x27;selfb&#x27;: &#x27;selfb&#x27;}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>可见类Test有classa属性以及一些其他属性<br/>
类Test的实例a只有self.b属性</p>
<h2 class="rp-toc-include" id="4lenself函数"><a href="#4lenself函数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>4.<strong>len</strong>(self)函数</h2>
<p>返回元素个数，实现len()方法。即类实现了__len__()函数就可以使用len()函数</p>
<h2 class="rp-toc-include" id="5getitemselfkey"><a href="#5getitemselfkey" class="rp-header-anchor rp-link" aria-hidden="true">#</a>5.<strong>getitem</strong>(self,key)</h2>
<p>实现字典一样的功能，当类的实例对象（假设为P）调用P[key]时，调用此函数返回。</p>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<p>1,<a href="https://docs.python.org/" target="_blank" rel="noopener noreferrer" class="rp-link">https://docs.python.org</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[python3之模块]]></title>
        <id>/blog/2018/hexo-python3之模块</id>
        <link href="https://www.vhcffh.com/blog/2018/hexo-python3之模块"/>
        <updated>2018-04-28T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文系统地介绍了Python 3中模块的基本概念和使用方法。内容包括模块的定义（即.py文件），两种主要的引入方式`import`和`from...import`及其区别。文章还讲解了Python解释器如何通过搜索路径（sys.path）查找模块，并阐述了命名空间的基本概念以及全局变量在函数中的使用。此外，还简要讨论了模块中可执行代码的执行时机和循环引入等问题。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="python3之模块"><a href="#python3之模块" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python3之模块<!-- --> </h1>
<h2 class="rp-toc-include" id="1python3模块"><a href="#1python3模块" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.python3模块</h2>
<p>简单讲，一个模块就是一个*.py文件，这个文件里面可以定义类，函数，变量，也可以包含可执行代码。</p>
<h2 class="rp-toc-include" id="2模块的引入"><a href="#2模块的引入" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.模块的引入</h2>
<p>2.1import引入</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>import module1,[module2[,.........moduleN]]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>一个模块只会被导入一次，不管执行了多少次import，这样可以防止导入模块被重复执行。</p>
<p>2.2from * import语句</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>from modname import name1,name2..........nameN</span></span>
<span class="line"><span>from mod import func_1</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>这个声明不会把整个mod模块导入到当前命名空间中，它只会将mod里的func_1单个引入到执行这个声明的模块的全局符号表。</p>
<p>from ... import *
：这样会把模块中的所有内容导入到当前命名空间，一般不建议使用，消耗内存空间，也容易出现未预知的问题。</p>
<h2 class="rp-toc-include" id="3搜索路径"><a href="#3搜索路径" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.搜索路径</h2>
<p>搜索顺序：当前目录-&gt;系统环境变量PATHONHOME-&gt;标准链接库目录<br/>
通过<code>sys.path</code>可查看搜索路径</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>&gt;&gt;&gt; import sys</span></span>
<span class="line"><span>&gt;&gt;&gt; sys.path</span></span>
<span class="line"><span>[&#x27;&#x27;, &#x27;C:\\Python36\\python36.zip&#x27;, &#x27;C:\\Python36\\DLLs&#x27;, &#x27;C:\\Python36\\lib&#x27;, &#x27;C:\\Python36&#x27;, &#x27;C:\\Python36\\lib\\site-packages&#x27;]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="4命名空间"><a href="#4命名空间" class="rp-header-anchor rp-link" aria-hidden="true">#</a>4.命名空间</h2>
<p>变量是拥有匹配对象的名字（标识符）。命名空间是一个包含了变量名称（键）和它们各自相应的对象们（值）的字典。<br/>
函数内用到全局变量要用global语句，否则会当作局部变量处理</p>
<h2 class="rp-toc-include" id="其他问题"><a href="#其他问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>其他问题:</h2>
<p>1.python模块里的可执行代码何时执行？<br/>
当导入模块时，python顶层的代码会执行一次，若要重新执行模块的顶层代码需要通道reload()函数<br/>
另外python3中的reload()需要从imp包中导入<br/>
2.关于python模块循环引入的问题？</p>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<p>1.<a href="https://www.cnblogs.com/zhangxinqi/p/7905103.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.cnblogs.com/zhangxinqi/p/7905103.html</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[DEBUG常用功能]]></title>
        <id>/blog/2018/hexo-DEBUG常用功能</id>
        <link href="https://www.vhcffh.com/blog/2018/hexo-DEBUG常用功能"/>
        <updated>2018-02-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了在Windows 10系统中安装和使用汇编调试工具DEBUG的方法。内容包括通过DOSBox软件进行安装和配置，并详细讲解了DEBUG中的常用命令，如R（查看/修改寄存器）、D（查看内存）、E（修改内存）、U（反汇编）、T（单步执行）和A（写入汇编指令），并配有具体的使用实例截图，为汇编语言初学者提供了清晰的入门指导。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="debug常用功能"><a href="#debug常用功能" class="rp-header-anchor rp-link" aria-hidden="true">#</a>DEBUG常用功能<!-- --> </h1>
<p>window 10中DEBUG的安装,以及DEBUG调试中一些常用的命令</p>
<h2 class="rp-toc-include" id="1安装"><a href="#1安装" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.安装</h2>
<p>window 10中好像已经没有了Debug的调试工具，需要下载另外的软件</p>
<p>下载安装DOSBox.百度云下载地址：(DOSBOX)[<a href="https://pan.baidu.com/s/1cC3cuy" target="_blank" rel="noopener noreferrer" class="rp-link">https://pan.baidu.com/s/1cC3cuy</a>]<br/>
下载后先安装DOSBox0.74-win32-installer.exe<br/>
然后找到文件dos-box0.74.conf(C:\Users\username\AppData\Local\DOSBox)<br/>
添加两行</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>MOUNT C E:\DEBUG                  # 将目录E:\DEBUG挂载为DOSBOX下的C:  </span></span>
<span class="line"><span>set PATH=$PATH$;E:\DEBUG          # 将E:\DEBUG写入环境变量PATH中</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>并将下载的MASM.exe,LINK.exe,debug.exe三个文件放入目录E:\DEBUG<br/>
打开软件，输入<code>c:</code>就可以使用debug命令了</p>
<h2 class="rp-toc-include" id="2常用命令"><a href="#2常用命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.常用命令:</h2>
<p>R命令：查看改变CPU寄存器的内容<br/>
D命令：查看内存中的内容<br/>
E命令：改写内存中的内容<br/>
U命令：将内存中的机器指令翻译成汇编指令<br/>
T命令：执行一条机器指令<br/>
A命令：以汇编指令的格式在内存中写入一条机器指令<br/>
Q命令：退出DEBUG调试</p>
<h2 class="rp-toc-include" id="3命令具体使用实例"><a href="#3命令具体使用实例" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.命令具体使用实例</h2>
<h3 class="rp-toc-include" id="31r命令"><a href="#31r命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.1R命令</h3>
<p>R命令：查看改变CPU寄存器的内容</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>-r                          ;显示寄存器的值</span></span>
<span class="line"><span>-r reg                      ;改变寄存器reg的值</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><img alt="img" src="/static/image/2_12_R命令.c469fdab75.PNG"/></p>
<h3 class="rp-toc-include" id="32d命令"><a href="#32d命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.2D命令</h3>
<p>D命令：查看内存中的内容<br/>
默认显示128字节的内容</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>-d                          ;默认地址</span></span>
<span class="line"><span>-d 段地址:偏移地址            ;指定地址</span></span>
<span class="line"><span>-d 段地址:偏一偏二            ;两个地址间的内容</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><img alt="img" src="/static/image/2_12_D命令.edbaa6181f.PNG"/></p>
<h3 class="rp-toc-include" id="33e命令"><a href="#33e命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.3E命令</h3>
<p>E命令：改写内存中的内容</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>-e 起始地址 数据 数据 ...   </span></span>
<span class="line"><span>-e 起始地址</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><img alt="img" src="/static/image/2_12_E命令.dc9bf1a5cd.PNG"/></p>
<h3 class="rp-toc-include" id="34u命令"><a href="#34u命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.4U命令</h3>
<p>U命令：将内存中的机器指令翻译成汇编指令<br/>
与D命令有些类似<br/>
<img alt="img" src="/static/image/2_12_U命令.782718d53f.PNG"/></p>
<h3 class="rp-toc-include" id="35t命令"><a href="#35t命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.5T命令</h3>
<p>T命令：执行内存中的一条机器指令<br/>
指令位置由cs:ip确定<br/>
<img alt="img" src="/static/image/2_12_T命令.dd72a5e0f9.PNG"/></p>
<h3 class="rp-toc-include" id="36a命令"><a href="#36a命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.6A命令</h3>
<p>A命令：以汇编指令的格式在内存中写入一条机器指令<br/>
<img alt="img" src="/static/image/2_12_A命令.04d3b1764f.PNG"/></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Git使用中的一些问题]]></title>
        <id>/blog/2018/hexo-Git使用中的一些问题</id>
        <link href="https://www.vhcffh.com/blog/2018/hexo-Git使用中的一些问题"/>
        <updated>2018-01-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文总结了Git使用过程中常见的一些配置和操作问题。内容涵盖了全局和项目级别的用户信息配置方法，SSH密钥的生成、查看及测试连接。文章还通过图示清晰地解释了Git的工作区、暂存区和版本库三个核心概念，并详细说明了`git add`, `git commit`, `git reset`, `git rm --cached`, `git checkout`等关键命令在不同区域之间切换和重置文件的作用及其潜在风险。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="git使用中的一些问题"><a href="#git使用中的一些问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Git使用中的一些问题<!-- --> </h1>
<h2 class="rp-toc-include" id="1-配置问题"><a href="#1-配置问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1-配置问题</h2>
<p>全局配置</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>$ git config --list  查看当前用户信息</span></span>
<span class="line"><span>$ git config --global user.name &quot;username&quot; 配置用户名</span></span>
<span class="line"><span>$ git config --global user.email emailname@example.com 配置邮箱</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>项目配置(进入项目目录)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>$ cat .git/config  项目配置信息</span></span>
<span class="line"><span>$ git config  user.name &quot;username&quot; 配置用户名</span></span>
<span class="line"><span>$ git config  user.email emailname@example.com 配置邮箱</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>全局的配置就是加上---global<br/>
项目未设置的配置默认使用全局配置</p>
<h2 class="rp-toc-include" id="2-密钥问题"><a href="#2-密钥问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2-密钥问题</h2>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>$ cd ~/.ssh  查看是否存在密钥</span></span>
<span class="line"><span>$ ssh-keygen -t rsa -C &quot;emailname@example.com&quot; 生成密钥</span></span>
<span class="line"><span>$ ssh -T git@github.com  测试是否配置成功</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>生成密钥过程中回车三次，是密码为空，不然每次push都要输入密码<br/>
生成密钥后主要有两个文件<br/>
~/.ssh/id_rsa<br/>
私钥进行处理后的一些内容<br/>
~/.ssh/id_rsa.pub<br/>
公钥进行处理后的内容，提交到服务器(github或coding)的内容<br/>
~/.ssh/known_hosts<br/>
这个文件可能会有，是ssh对服务器的一些记录</p>
<h2 class="rp-toc-include" id="3-工作区暂存区和版本库"><a href="#3-工作区暂存区和版本库" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3-工作区、暂存区和版本库</h2>
<p><img alt="img" src="/static/image/git.2591f4c723.jpg"/></p>
<p><code>git add</code>：暂存区的目录树被更新，同时工作区修改（或新增）的文件内容被写入到对象库中的一个新的对象中，而该对象的ID被记录在暂存区的文件索引中。</p>
<p><code>git commit</code>：暂存区的目录树写到版本库（对象库）中，master
分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。</p>
<p><code>git reset HEAD</code> ：暂存区的目录树会被重写，被 master
分支指向的目录树所替换，但是工作区不受影响。</p>
<p><code>git rm --cached &lt;file&gt;</code>：直接从暂存区删除文件，工作区则不做出改变。</p>
<p><code>git checkout .</code> 或者
<code>git checkout -- &lt;file&gt;</code>：用暂存区全部或指定的文件替换工作区的文件。<strong>这个操作很危险，会清除工作区中未添加到暂存区的改动。</strong></p>
<p><code>git checkout HEAD .</code>或者 <code>git checkout HEAD &lt;file&gt;</code>：用 HEAD 指向的
master
分支中的全部或者部分文件替换暂存区和以及工作区中的文件。<strong>这个命令也是极具危险性的，因为不但会清除工作区中未提交的改动，也会清除暂存区中未提交的改动。</strong></p>
<h2 class="rp-toc-include" id="参考资料"><a href="#参考资料" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考资料</h2>
<p>1.<a href="https://www.cnblogs.com/hustskyking/p/problems-in-git-when-ssh.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.cnblogs.com/hustskyking/p/problems-in-git-when-ssh.html</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[简单了解汇编]]></title>
        <id>/blog/2018/hexo-简单了解汇编</id>
        <link href="https://www.vhcffh.com/blog/2018/hexo-简单了解汇编"/>
        <updated>2018-01-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文为初学者提供了一份关于汇编语言的简明介绍。文章首先阐述了汇编语言的本质，即作为机器指令的人类可读形式，以及它如何通过编译器转换为计算机可执行的机器码。接着，简要介绍了计算机系统中起关键作用的三种总线：数据总线、地址总线和控制总线。最后，还说明了RAM（随机存取存储器）和ROM（只读存储器）在程序运行和系统启动中的基本功能和区别。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="简单了解汇编"><a href="#简单了解汇编" class="rp-header-anchor rp-link" aria-hidden="true">#</a>简单了解汇编<!-- --> </h1>
<h3 class="rp-toc-include" id="1汇编是什么"><a href="#1汇编是什么" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.汇编是什么</h3>
<p>汇编语言的主体是汇编指令，汇编指令是由机器指令发展而来，例如：<br/>
操作：将寄存器bx的内容送到ax<br/>
机器指令：101100000000000000000011<br/>
记起来太过于复杂，从而有了替代它的<br/>
汇编指令：<code>mov ax,bx</code><br/>
方便记忆，也符合人们的逻辑思维<br/>
程序员们编写汇编指令，在通过编译器编译成机器指令，然后就可以在计算机中运行了（如今的大部分高级语言是通过编译器，将高级语言转换成汇编语言，在编译成机器语言在电脑中运行）<br/>
不管什么语言，都要转换成机器语言在电脑中运行，汇编语言和高级语言都是人们为了简化程序制作过程而已</p>
<h3 class="rp-toc-include" id="2计算机的总线"><a href="#2计算机的总线" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.计算机的总线</h3>
<p>从逻辑上总线分为三类（8086）<br/>
数据总线：传送数据，总线宽度决定一次读取数据多少（16）<br/>
地址总线：指定地址，总线宽度决定寻址能力（20）<br/>
控制总线：控制读写</p>
<h3 class="rp-toc-include" id="3存储器"><a href="#3存储器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.存储器</h3>
<p>RAM：程序和数据都要加载到RAM即内存中，才能通过CPU运行，可读可写<br/>
ROM：一些芯片的主要参数，及操作指令，芯片出厂时已经固定，仅可读<br/>
计算机运行时，全部程序和数据都要加载到RAM中<br/>
通过ROM中的一些必要信息，CPU才能对外设进行操作</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[python遇到的错误]]></title>
        <id>/blog/2017/hexo-python遇到的错误</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-python遇到的错误"/>
        <updated>2017-12-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了作者在使用Python过程中遇到的两个具体错误及其解决方案。第一个错误是“ImportError: DLL load failed”，通常是由于安装的pywin32库与Python解释器的位数（32位或64位）不匹配导致，需要下载对应版本的库。第二个错误是使用libsvm时出现的“Exception: LIBSVM library not found.”，原因同样是库文件与Python版本位数不符，解决方法是从特定网站下载预编译的.whl文件并替换其中的库文件。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="python遇到的错误"><a href="#python遇到的错误" class="rp-header-anchor rp-link" aria-hidden="true">#</a>python遇到的错误<!-- --> </h1>
<p>python使用在中遇到的错误</p>
<p>1.DLL load failed</p>
<p>python ImportError: DLL load failed: %1 不是有效的 Win32 应用程序<br/>
解决方法：去下载与你所安装的Python版本对应的pywin32并安装<br/>
下载链接：<a href="https://sourceforge.net/projects/pywin32/files/pywin32/" target="_blank" rel="noopener noreferrer" class="rp-link">https://sourceforge.net/projects/pywin32/files/pywin32/</a><br/>
对应版本和位数<br/>
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500
32 bit (Intel)] on win32<br/>
Type &quot;help&quot;, &quot;copyright&quot;, &quot;credits&quot; or &quot;license&quot; for more information.<br/>
还有一种可能是导入的模块是64位的，而你的python是32位的</p>
<p>2.使用libsvm for python时出错[1]</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>Traceback (most recent call last):</span></span>
<span class="line"><span>  File &quot;C:\Python36\lib\libsvm\python\svm.py&quot;, line 28, in &lt;module&gt;</span></span>
<span class="line"><span>    libsvm = CDLL(path.join(dirname, r&#x27;..\windows\libsvm.dll&#x27;))</span></span>
<span class="line"><span>  File &quot;C:\Python36\lib\ctypes\__init__.py&quot;, line 348, in __init__</span></span>
<span class="line"><span>    self._handle = _dlopen(self._name, mode)</span></span>
<span class="line"><span>OSError: [WinError 126] 找不到指定的模块。</span></span>
<span class="line"><span></span></span>
<span class="line"><span>During handling of the above exception, another exception occurred:</span></span>
<span class="line"><span></span></span>
<span class="line"><span>Traceback (most recent call last):</span></span>
<span class="line"><span>  File &quot;train.py&quot;, line 3, in &lt;module&gt;</span></span>
<span class="line"><span>    from libsvm.python.svmutil import *</span></span>
<span class="line"><span>  File &quot;C:\Python36\lib\libsvm\python\svmutil.py&quot;, line 5, in &lt;module&gt;</span></span>
<span class="line"><span>    from svm import *</span></span>
<span class="line"><span>  File &quot;C:\Python36\lib\libsvm\python\svm.py&quot;, line 38, in &lt;module&gt;</span></span>
<span class="line"><span>    raise Exception(&#x27;LIBSVM library not found.&#x27;)</span></span>
<span class="line"><span>Exception: LIBSVM library not found.</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>出错原因：在github上下载的libsvm中的libsvm.lib是win64版本的，而自己的python版本是32位的<br/>
解决方案：<br/>
方法1.更换python版本（太麻烦了，还要重新下载好多库）<br/>
方法2.去<a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/" target="_blank" rel="noopener noreferrer" class="rp-link">万能宝库</a>上下载对应版本的.whl文件，（不用安装）直接解压后找到<a href="https://download.lfd.uci.edu/pythonlibs/o4uhg4xd/libsvm-3.22-cp27-cp27m-win32.whl" target="_blank" rel="noopener noreferrer" class="rp-link">libsvm.lib</a>更换即可<br/>
2018-09-07 22:11:58</p>
<p>参考资料</p>
<p>1.<a href="https://blog.csdn.net/rena521/article/details/51187981" target="_blank" rel="noopener noreferrer" class="rp-link">https://blog.csdn.net/rena521/article/details/51187981</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[位运算的妙用之二进制1的个数]]></title>
        <id>/blog/2017/hexo-位运算的妙用之二进制1的个数</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-位运算的妙用之二进制1的个数"/>
        <updated>2017-12-26T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文探讨了如何高效地计算一个正整数在二进制表示中“1”的个数。文章首先介绍了一种常规解法，即通过循环和位移操作（>>）逐位判断该数的二进制位是否为1。随后，文章重点展示了一种被称为“大神解法”的高效算法，该算法巧妙地运用了一系列位与（&）、位移（>>）和加法操作，通过分治和并行的思想，在几次运算内即可完成统计，极大地提升了计算效率，展示了位运算的精妙之处。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="位运算的妙用之二进制1的个数"><a href="#位运算的妙用之二进制1的个数" class="rp-header-anchor rp-link" aria-hidden="true">#</a>位运算的妙用之二进制1的个数<!-- --> </h1>
<p>求出一个正整数转换成二进制形式中数字&quot;1&quot;的个数<br/>
题目：求出一个正整数转换成二进制形式中数字&quot;1&quot;的个数<br/>
如：<br/>
int 型数值为 80<br/>
转化成二进制形式：80 = 00000000 00000000 00000000 01010000<br/>
因此 1 的个数为 2</p>
<p>1.普通解法</p>
<p>一位一位判断</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-token-function)"> bitCount1</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> n) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> count </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-foreground)"> (n </span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)"> (n </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">01</span><span style="color:var(--shiki-token-keyword)"> ==</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                count</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            n </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> n </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> count;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.大神的解法</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-token-function)"> bitCount2</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> n) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        n </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> n </span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)"> ((n </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">55555555</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)">//n = (n &amp; 0x55555555) + ((n &gt;&gt; 1) &amp; 0x55555555);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        n </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (n </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">33333333</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> ((n </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 2</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">33333333</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        n </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (n </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f0f0f0f</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> ((n </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0f0f0f0f</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        n </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> n </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> (n </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 8</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)">               //n = (n &amp; 0x00ff00ff) + ((n &gt;&gt; 8) &amp; 0x00ff00ff);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        n </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> n </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> (n </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)">              //n = (n &amp; 0x0000ffff) + ((n &gt;&gt; 16) &amp; 0x0000ffff);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> n </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-keyword)"> 0x</span><span style="color:var(--shiki-token-constant)">0000003f</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">          //return n;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>参考文章</p>
<p>1.<a href="https://www.jianshu.com/p/25c75149e7a2" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.jianshu.com/p/25c75149e7a2</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C语言文件读写]]></title>
        <id>/blog/2017/hexo-C语言文件读写</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-C语言文件读写"/>
        <updated>2017-12-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是一篇C语言文件操作的基础学习笔记。文章系统地列出了C语言中用于文件读写的核心函数，如`fopen`用于打开文件、`fclose`用于关闭文件，以及`fgetc`/`getc`和`fputc`/`putc`用于逐字符读写。同时，详细解释了`fopen`函数中各种文件访问模式（type）的含义和区别，包括"r"（读）、"w"（写）、"a"（追加）以及它们的组合形式（如"r+"、"w+"），并指出了处理二进制文件时需要使用的相应模式。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="c语言文件读写"><a href="#c语言文件读写" class="rp-header-anchor rp-link" aria-hidden="true">#</a>C语言文件读写<!-- --> </h1>
<p>C语言文件操作笔记</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>FILE *fopen(char *filename,char *type); //打开文件</span></span>
<span class="line"><span>int fclose(FILE *stream); //关闭文件</span></span>
<span class="line"><span>int fgetc(FILE *stream); //读一个字符指针后移</span></span>
<span class="line"><span>int getc(FILE *stream);</span></span>
<span class="line"><span>int fputc(int ch,FILE *stream); //写一个字符指针后移</span></span>
<span class="line"><span>int putc(int ch,FILE *stream);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>filename指明文件路径<br/>
type可取的至如下<br/>
&quot;r&quot; :打开一个已有的文本文，允许读取文件<br/>
&quot;w&quot;
:打开一个文本文件，允许写入文件。如果文件不存在，则会创建一个新文件。在这里，您的程序会从文件的开头写入内容<br/>
&quot;a&quot;
:打开一个文本文件，以追加模式写入文件。如果文件不存在，则会创建一个新文件。在这里，您的程序会在已有的文件内容中追加内容。<br/>
&quot;r+&quot;:打开一个文本文件，允许读写文件<br/>
&quot;w+&quot;:打开一个文本文件，允许读写文件。如果文件已存在，则文件会被截断为零长度，如果文件不存在，则会创建一个新文件<br/>
&quot;a+&quot;:打开一个文本文件，允许读写文件。如果文件不存在，则会创建一个新文件。读取会从文件的开头开始，写入则只能是追加模式<br/>
如果处理的是二进制文件，则需使用下面的访问模式来取代上面的访问模式:<br/>
<code>&quot;rb&quot;, &quot;wb&quot;, &quot;ab&quot;, &quot;rb+&quot;, &quot;r+b&quot;, &quot;wb+&quot;, &quot;w+b&quot;, &quot;ab+&quot;, &quot;a+b&quot;</code></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[sublime_Text3插入当前时间]]></title>
        <id>/blog/2017/hexo-sublime_Text3插入当前时间</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-sublime_Text3插入当前时间"/>
        <updated>2017-12-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文提供了一个在Sublime Text 3中实现快速插入当前日期和时间功能的详细教程。整个过程分为三步：首先，通过“New Snippet”创建一个代码片段（.sublime-snippet），定义好包含时间占位符的文本模板。其次，通过“New Plugin”创建一个Python插件（.py），编写一个命令来获取当前系统时间并插入。最后，在用户快捷键设置（Key Bindings）中，将这个新创建的命令绑定到一个自定义的快捷键（如alt+t），从而实现一键插入当前时间的功能。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="sublime_text3插入当前时间"><a href="#sublime_text3插入当前时间" class="rp-header-anchor rp-link" aria-hidden="true">#</a>sublime_Text3插入当前时间<!-- --> </h1>
<p>sublime_Text3插入当前时间</p>
<p>1.创建新snippet</p>
<p>tool → new snippet
创建一个新的snippet,并保存为&quot;author.sublime-snippet&quot;(最好在该目录(User)下再创建一个MySnippet目录):<br/>
其内容:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>&lt;snippet&gt;</span></span>
<span class="line"><span>&lt;content&gt;&lt;![CDATA[</span></span>
<span class="line"><span>/**</span></span>
<span class="line"><span> * ============================</span></span>
<span class="line"><span> * @Author:   XX</span></span>
<span class="line"><span> * @Version:  1.0 </span></span>
<span class="line"><span> * @DateTime: ${1:alt+t}</span></span>
<span class="line"><span> * ============================</span></span>
<span class="line"><span> */</span></span>
<span class="line"><span>]]&gt;&lt;/content&gt;</span></span>
<span class="line"><span>    &lt;!-- Optional: Set a tabTrigger to define how to trigger the snippet --&gt;</span></span>
<span class="line"><span>    &lt;tabTrigger&gt;author&lt;/tabTrigger&gt;</span></span>
<span class="line"><span>    &lt;!-- Optional: Set a scope to limit where the snippet will trigger --&gt;</span></span>
<span class="line"><span>    &lt;!-- &lt;scope&gt;source.python&lt;/scope&gt; --&gt;</span></span>
<span class="line"><span>&lt;/snippet&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.创建新插件</p>
<p>Tools → New Plugin.
创建时间插件,保存在User目录,命名为addCurrentTime.py:<br/>
其内容为:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>import sublime, sublime_plugin</span></span>
<span class="line"><span>import datetime</span></span>
<span class="line"><span>class AddCurrentTimeCommand(sublime_plugin.TextCommand):</span></span>
<span class="line"><span>    def run(self, edit):</span></span>
<span class="line"><span>        self.view.run_command(&quot;insert_snippet&quot;, </span></span>
<span class="line"><span>            {</span></span>
<span class="line"><span>                &quot;contents&quot;: &quot;%s&quot; % datetime.datetime.now().strftime(&quot;%Y-%m-%d %H:%M:%S&quot;) </span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>        )</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>3.绑定快捷键</p>
<p>Preference → Key Bindings → User.绑定快捷键:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>[</span></span>
<span class="line"><span>    {</span></span>
<span class="line"><span>        &quot;command&quot;: &quot;add_current_time&quot;,</span></span>
<span class="line"><span>        &quot;keys&quot;: [</span></span>
<span class="line"><span>            &quot;alt+t&quot;</span></span>
<span class="line"><span>        ]</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>其中绑定的命令的名字是由所创建的插件的类名而来<br/>
AddCurrentTimeCommand---&gt;add_current_time<br/>
这应该是Sublime创建插件的规则</p>
<p>参考资料</p>
<p>1,<a href="http://www.cnblogs.com/xiaomingzaixian/p/6984664.html" target="_blank" rel="noopener noreferrer" class="rp-link">http://www.cnblogs.com/xiaomingzaixian/p/6984664.html</a><br/>
2,<a href="http://blog.csdn.net/sshfl_csdn/article/details/46415551" target="_blank" rel="noopener noreferrer" class="rp-link">http://blog.csdn.net/sshfl_csdn/article/details/46415551</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[字符串匹配]]></title>
        <id>/blog/2017/hexo-字符串匹配</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-字符串匹配"/>
        <updated>2017-12-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文主要探讨了两种经典的字符串匹配算法。第一种是朴素的暴力匹配算法（BM），文章给出了其C语言实现，通过双重循环在主串中查找模式串。第二种是更高效的KMP算法，它通过预处理模式串生成一个next数组，在匹配失败时能够智能地移动模式串，避免了主串指针的回溯。文章同样提供了KMP算法的C语言实现代码，包括核心的`getnext`函数，并引用了外部文章作为进一步学习的参考。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="字符串匹配"><a href="#字符串匹配" class="rp-header-anchor rp-link" aria-hidden="true">#</a>字符串匹配<!-- --> </h1>
<h2 class="rp-toc-include" id="1bm"><a href="#1bm" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.BM</h2>
<p>从左到右依次比较<br/>
s:主串<br/>
r:模式串</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-token-function)"> BM</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">s</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> slen</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> rlen){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">j</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-foreground)">(i</span><span style="color:var(--shiki-token-keyword)">&lt;=</span><span style="color:var(--shiki-foreground)">slen</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">rlen</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            while</span><span style="color:var(--shiki-foreground)">(j</span><span style="color:var(--shiki-token-keyword)">&lt;=</span><span style="color:var(--shiki-foreground)">rlen</span><span style="color:var(--shiki-token-keyword)">&amp;&amp;</span><span style="color:var(--shiki-foreground)">s[i]</span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-foreground)">r[j]){</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">;j</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)">(j</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)">rlen){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                return</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">j</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                j</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="2kmp算法"><a href="#2kmp算法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.KMP算法</h2>
<p>通过一个next数字<br/>
当每次发生不匹配的时候<br/>
模式串不必回到开头</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    int*</span><span style="color:var(--shiki-token-function)"> getnext</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> n) {</span><span style="color:var(--shiki-token-comment)"> //next数组求解</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> j;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">next </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-function)">malloc((n </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-function)">) </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-keyword)"> sizeof</span><span style="color:var(--shiki-token-function)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)">))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        next[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> n; next[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        j </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-foreground)">(i</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)">n){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)"> (j </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-keyword)"> ||</span><span style="color:var(--shiki-foreground)"> r[i] </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-foreground)"> r[j]) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                ++</span><span style="color:var(--shiki-foreground)">i; </span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">j;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                next[i] </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> j;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            } </span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                j </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> next[j];</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> next;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-token-function)"> KMP</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">s</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> slen</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">r</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> rlen){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">next</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">getnext(r</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">rlen)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">j</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-foreground)">(i</span><span style="color:var(--shiki-token-keyword)">&lt;=</span><span style="color:var(--shiki-foreground)">slen</span><span style="color:var(--shiki-token-keyword)">&amp;&amp;</span><span style="color:var(--shiki-foreground)">j</span><span style="color:var(--shiki-token-keyword)">&lt;=</span><span style="color:var(--shiki-foreground)">rlen){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            while</span><span style="color:var(--shiki-foreground)">(j</span><span style="color:var(--shiki-token-keyword)">&lt;=</span><span style="color:var(--shiki-foreground)">rlen</span><span style="color:var(--shiki-token-keyword)">&amp;&amp;</span><span style="color:var(--shiki-foreground)">s[i]</span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-foreground)">r[j]){</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">;j</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)">(j</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-foreground)">rlen){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                return</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">j</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                j</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">next[j];i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h2 class="rp-toc-include" id="参考文章"><a href="#参考文章" class="rp-header-anchor rp-link" aria-hidden="true">#</a>参考文章</h2>
<p>1.<a href="http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html" target="_blank" rel="noopener noreferrer" class="rp-link">字符串匹配的KMP算法</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[图片头文件解析]]></title>
        <id>/blog/2017/hexo-图片头文件解析</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-图片头文件解析"/>
        <updated>2017-12-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文主要对图片文件的头部信息进行了解析，并以PNG格式作为详细示例。文章首先深入讲解了PNG文件起始的8个字节的文件标识（Signature）的构成及其每个字节的具体含义，例如用于检测传输系统是否支持8位编码和识别文件类型等。接着，文章介绍了PNG文件由数据块（chunk）构成的基本结构，区分了必须包含的关键数据块（如IHDR, IDAT, IEND）和可选的辅助数据块，并通过表格清晰地列出了各种数据块的名称、功能和位置限制。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="图片头文件解析"><a href="#图片头文件解析" class="rp-header-anchor rp-link" aria-hidden="true">#</a>图片头文件解析<!-- --> </h1>
<p>各种类型的图片头文件解析</p>
<h3 class="rp-toc-include" id="1png图片文件头"><a href="#1png图片文件头" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.PNG图片文件头</h3>
<h4 class="rp-toc-include" id="11png文件结构"><a href="#11png文件结构" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.1PNG文件结构</h4>
<p>PNG图像格式文件由一个8字节的PNG文件标识（file
signature）域和3个以上的后续数据块（IHDR、IDAT、IEND等）组成。<br/>
PNG文件包括8字节文件署名（89 50 4E 47 0D 0A 1A
0A，十六进制），用来识别PNG格式。</p>





























<div class="rp-table-scroll-container rp-scrollbar"><table><thead><tr><th style="text-align:left">十六进制</th><th style="text-align:left">含义</th></tr></thead><tbody><tr><td style="text-align:left">89</td><td style="text-align:left">用于检测传输系统是否支持8位的字符编码（8 bit data），用以减少将文本文件被错误的识别成PNG文件的机会，反之亦然。</td></tr><tr><td style="text-align:left">50 4E 47</td><td style="text-align:left">PNG每个字母对应的ASCII，让用户可以使用文本编辑器查看时，识别出是PNG文件。</td></tr><tr><td style="text-align:left">0D 0A</td><td style="text-align:left">DOS风格的换行符（CRLF）。用于DOS-Unix数据的换行符转换。</td></tr><tr><td style="text-align:left">1A</td><td style="text-align:left">在DOS命令行下，用于阻止文件显示的文件结束符。</td></tr><tr><td style="text-align:left">0A</td><td style="text-align:left">Unix风格的换行符（LF）。用于Unix-DOS换行符的转换。</td></tr></tbody></table></div>
<h3 class="rp-toc-include" id="12png数据块chunk"><a href="#12png数据块chunk" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.2PNG数据块（chunk）</h3>
<p>PNG定义了两种类型的数据块，一种是称为关键数据块(critical
chunk)，这是标准的数据块，另一种叫做辅助数据块(ancillary
chunks)，这是可选的数据块。<br/>
关键数据块定义了4个标准数据块，每个PNG文件都必须包含它们，PNG读写软件也都必须要支持这些数据块。虽然PNG文件规范没有要求PNG编译码器对可选数据块进行编码和译码，但规范提倡支持可选数据块。<br/>
下表就是PNG中数据块的类别，其中，关键数据块部分我们使用红色背景加以区分。</p>
<p>数据块符号         数据块名称         多数据块   可选否        位置限制</p>
<hr/>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>  IHDR           文件头数据块           否        否           第一块</span></span>
<span class="line"><span>  cHRM        基色和白色点数据块        否        是      在PLTE和IDAT之前</span></span>
<span class="line"><span>  gAMA           图像γ数据块            否        是      在PLTE和IDAT之前</span></span>
<span class="line"><span>  sBIT         样本有效位数据块         否        是      在PLTE和IDAT之前</span></span>
<span class="line"><span>  PLTE           调色板数据块           否        是         在IDAT之前</span></span>
<span class="line"><span>  bKGD          背景颜色数据块          否        是     在PLTE之后IDAT之前</span></span>
<span class="line"><span>  hIST         图像直方图数据块         否        是     在PLTE之后IDAT之前</span></span>
<span class="line"><span>  tRNS          图像透明数据块          否        是     在PLTE之后IDAT之前</span></span>
<span class="line"><span>  oFFs         (专用公共数据块)         否        是         在IDAT之前</span></span>
<span class="line"><span>  pHYs        物理像素尺寸数据块        否        是         在IDAT之前</span></span>
<span class="line"><span>  sCAL         (专用公共数据块)         否        是         在IDAT之前</span></span>
<span class="line"><span>  IDAT            图像数据块            是        否       与其他IDAT连续</span></span>
<span class="line"><span>  tIME      图像最后修改时间数据块      否        是           无限制</span></span>
<span class="line"><span>  tEXt          文本信息数据块          是        是           无限制</span></span>
<span class="line"><span>  zTXt          压缩文本数据块          是        是           无限制</span></span>
<span class="line"><span>  fRAc         (专用公共数据块)         是        是           无限制</span></span>
<span class="line"><span>  gIFg         (专用公共数据块)         是        是           无限制</span></span>
<span class="line"><span>  gIFt         (专用公共数据块)         是        是           无限制</span></span>
<span class="line"><span>  gIFx         (专用公共数据块)         是        是           无限制</span></span>
<span class="line"><span>  IEND           图像结束数据           否        否       最后一个数据块</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[CentOS自带python26升级到27]]></title>
        <id>/blog/2017/hexo-CentOS自带python26升级到27</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-CentOS自带python26升级到27"/>
        <updated>2017-09-12T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文详细介绍了在CentOS系统中将自带的Python 2.6版本升级到2.7.3的具体步骤。内容涵盖了从官网下载Python 2.7.3源码包，通过编译安装（configure, make, make install）完成新版本的部署，以及如何通过建立软链接（ln -s）将系统默认的python命令指向新安装的2.7版本。同时，文章还特别指出了升级后需要修复yum命令对旧版Python依赖的问题，通过修改`/usr/bin/yum`文件确保系统工具的正常运行。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="centos自带python26升级到27"><a href="#centos自带python26升级到27" class="rp-header-anchor rp-link" aria-hidden="true">#</a>CentOS自带python26升级到27<!-- --> </h1>
<p>1.下载安装</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>#下载</span></span>
<span class="line"><span>wget http://python.org/ftp/python/2.7.3/Python-2.7.3.tar.bz2</span></span>
<span class="line"><span>#解压并更改目录   </span></span>
<span class="line"><span>tar -jxvf Python-2.7.3.tar.bz2</span></span>
<span class="line"><span>cd Python-2.7.3</span></span>
<span class="line"><span>#编译安装</span></span>
<span class="line"><span>./configure</span></span>
<span class="line"><span>make all</span></span>
<span class="line"><span>make install</span></span>
<span class="line"><span>make clean</span></span>
<span class="line"><span>make distclean</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>安装需要gcc(如果系统没有gcc需要自己安装)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>yum install -y gcc</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>查看版本信息</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>[root@host ~]# /usr/local/bin/python2.7 -V</span></span>
<span class="line"><span>Python 2.7.3</span></span>
<span class="line"><span>[root@host ~]# python -V</span></span>
<span class="line"><span>Python 2.6.6</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>python2.7已经安装,但系统的python还是2.6</p>
<p>2.建立软连接</p>
<p>使系统默认的python指向python2.7</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>rm /usr/bin/python /usr/bin/python2.6</span></span>
<span class="line"><span>ln -s /usr/local/bin/python2.7 /usr/bin/python</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>但yum命令依赖python2.6.6，需要更改一些配置文件</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>su root                         ##切换到root  </span></span>
<span class="line"><span>vi /usr/bin/yum                 ##打开文件</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><del>/usr/bin/python</del> ##删除此行<br/>
/usr/bin/python2.6.6 ##改为此行<br/>
更改需要管理员权限</p>
<p>参考资料</p>
<p>1.<a href="http://blog.csdn.net/jcjc918/article/details/11022345" target="_blank" rel="noopener noreferrer" class="rp-link">http://blog.csdn.net/jcjc918/article/details/11022345</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C实现简单TCP通信]]></title>
        <id>/blog/2017/hexo-C实现简单TCP通信</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-C实现简单TCP通信"/>
        <updated>2017-09-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了如何使用C语言实现一个简单的TCP通信程序。文章分别提供了服务器端和客户端的完整代码示例，并详细讲解了关键步骤，包括加载Windows套接字库（ws2_32.lib）、创建套接字（socket）、设置服务器地址和端口、绑定（bind）、监听（listen）、接受连接（accept）以及收发数据（send/recv）。该示例代码清晰地展示了一个基础的客户端-服务器通信模型，适合初学者学习和理解网络编程的基本原理。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="c实现简单tcp通信"><a href="#c实现简单tcp通信" class="rp-header-anchor rp-link" aria-hidden="true">#</a>C实现简单TCP通信<!-- --> </h1>
<p>C实现简单TCP通信</p>
<h3 class="rp-toc-include" id="1添加所需的window库"><a href="#1添加所需的window库" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.添加所需的window库</h3>
<p>在VC6++下编程<br/>
代码用到了其他的lib库,需要添加<br/>
工程---&gt;设置---&gt;Link---&gt;library
modules添加ws2_32.lib(与其他lib用空格隔开)</p>
<h3 class="rp-toc-include" id="2服务器端代码"><a href="#2服务器端代码" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.服务器端代码</h3>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    #include</span><span style="color:var(--shiki-token-string-expression)">&quot;winsock2.h&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #include</span><span style="color:var(--shiki-token-string-expression)"> &quot;stdio.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #define</span><span style="color:var(--shiki-token-function)"> SERVER_PORP</span><span style="color:var(--shiki-token-constant)"> 8884</span><span style="color:var(--shiki-token-comment)">//服务器端口号</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //加载套接字（winsock）库，</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //加载这段代码拷贝于MSDN中WSAStartup的介绍</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        WORD wVersionRequested;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        WSADATA wsaData;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> err;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        wVersionRequested </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> MAKEWORD( </span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-function)"> )</span><span style="color:var(--shiki-foreground)">; </span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //版本号为1.1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        err </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> WSAStartup( wVersionRequested</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">wsaData )</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> ( err </span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)"> ) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            return</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> ( </span><span style="color:var(--shiki-token-function)">LOBYTE( </span><span style="color:var(--shiki-token-constant)">wsaData</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">wVersion )</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-keyword)"> ||</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        HIBYTE( </span><span style="color:var(--shiki-token-constant)">wsaData</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">wVersion )</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)"> ) {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            WSACleanup( )</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            return</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //创建套接字</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKET sockServer</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">socket(AF_INET</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">SOCK_STREAM</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //AF_INET指协议簇</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //SOCK_STREAM参数设置为TCP连接</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKADDR_IN addrServer; </span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //设置服务器端套接字的相关属性</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">sin_addr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">S_un.S_addr</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">htonl(INADDR_ANY)</span><span style="color:var(--shiki-foreground)">; </span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //设置IP</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">sin_family</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">AF_INET;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">sin_port</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">htons(SERVER_PORP)</span><span style="color:var(--shiki-foreground)">; </span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //设置端口号</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //将套接字绑定到本地地址和指定端口上</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        bind(sockServer</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">(SOCKADDR</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">addrServer</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">sizeof</span><span style="color:var(--shiki-token-function)">(SOCKADDR))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //将套接字设置为监听模式，并将最大请求连接数设置成5，超过此数的请求全部作废</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        listen(sockServer</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKADDR_IN addrClient;</span><span style="color:var(--shiki-token-comment)"> //用来接收客户端的设置，包括IP和端口</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> len</span><span style="color:var(--shiki-token-keyword)">=sizeof</span><span style="color:var(--shiki-foreground)">(SOCKADDR);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-comment)"> //不断监听</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //得到创建连接后的一个新的套接字，用来和客户端进行沟通，原套接字继续监听客户的连接请求</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            SOCKET sockConn</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">accept(sockServer</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">(SOCKADDR</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">addrClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">len)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)">(sockConn</span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-foreground)">INVALID_SOCKET)</span><span style="color:var(--shiki-token-comment)"> //创建成功</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                char</span><span style="color:var(--shiki-foreground)"> sendInfo[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">                //inet_ntoa将结构转换为十进制的IP地址字符串</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                sprintf(sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;welcome </span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)"> to this Server!&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">inet_ntoa(</span><span style="color:var(--shiki-token-constant)">addrClient</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">sin_addr))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">                //成功建立连接后向客户端发送数据，结果将显示在客户端上</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                send(sockConn</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">strlen(sendInfo)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">                //从客户端接收数据，结果显示在服务器上</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                char</span><span style="color:var(--shiki-foreground)"> recvInfo[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                recv(sockConn</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    if</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">recv(sockConn</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                        break</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">                  //客户端断开recv返回负值</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                    printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">                    sprintf(sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                    send(sockConn</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">strlen(sendInfo)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                    sprintf(sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;\nsever receive this text!\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                    send(sockConn</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">strlen(sendInfo)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">                //将本次建立连接中得到套接字关闭</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                closesocket(sockConn)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            else</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                int</span><span style="color:var(--shiki-foreground)"> errCode</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">WSAGetLastError()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;the errcode is:</span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">errCode)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //如果本程序不是死循环，那么在此处还应添加以下代码：</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        closesocket(sockServer)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //对一直处于监听状态的套接字进行关闭</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        WSACleanup()</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //终止对winsocket库的使用</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="3客户端代码"><a href="#3客户端代码" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.客户端代码</h3>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    #include</span><span style="color:var(--shiki-token-string-expression)"> &quot;winsock2.h&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #include</span><span style="color:var(--shiki-token-string-expression)"> &quot;stdio.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #define</span><span style="color:var(--shiki-token-function)"> SERVER_IP</span><span style="color:var(--shiki-token-string-expression)">   &quot;127.0.0.1&quot;</span><span style="color:var(--shiki-token-comment)"> //服务器IP地址</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #define</span><span style="color:var(--shiki-token-function)"> SERVER_PORP</span><span style="color:var(--shiki-token-constant)"> 8884</span><span style="color:var(--shiki-token-comment)">        //服务器端口号</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //加载套接字库</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        WORD wVersionRequested;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        WSADATA wsaData;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> err;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        wVersionRequested </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> MAKEWORD( </span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-function)"> )</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //版本好为1.1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        err </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> WSAStartup( wVersionRequested</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">wsaData )</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> ( err </span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)"> ) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            return</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> ( </span><span style="color:var(--shiki-token-function)">LOBYTE( </span><span style="color:var(--shiki-token-constant)">wsaData</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">wVersion )</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-keyword)"> ||</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        HIBYTE( </span><span style="color:var(--shiki-token-constant)">wsaData</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">wVersion )</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)"> ) {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            WSACleanup( )</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            return</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKET sockClient</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">socket(AF_INET</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">SOCK_STREAM</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //SOCK_STREAM参数设置为TCP连接</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKADDR_IN addrServer;</span><span style="color:var(--shiki-token-comment)"> //服务器地址结构</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">sin_addr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">S_un.S_addr</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">inet_addr(SERVER_IP)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //服务器地址</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">sin_port</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">htons(SERVER_PORP)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //服务器端口号</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">sin_family</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">AF_INET;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //与服务器端建立连接，进行通信</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> connReult</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">connect(sockClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">(SOCKADDR</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">addrServer</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">sizeof</span><span style="color:var(--shiki-token-function)">(SOCKADDR))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)">(connReult</span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-foreground)">WSAEADDRNOTAVAIL)</span><span style="color:var(--shiki-token-comment)"> //访问成功</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //成功建立连接后向服务器端发送数据，结果将显示在服务器端上</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            char</span><span style="color:var(--shiki-foreground)"> sendInfo[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            send(sockClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;this is zhangsan!&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">strlen(</span><span style="color:var(--shiki-token-string-expression)">&quot;this is zhangsan!&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //接收来自服务器端发送来的信息</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            char</span><span style="color:var(--shiki-foreground)"> recvInfo[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            recv(sockClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                scanf(</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">sendInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                send(sockClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">strlen(sendInfo)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                recv(sockClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                recv(sockClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        else</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            int</span><span style="color:var(--shiki-foreground)"> errCode</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">WSAGetLastError()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;the errcode is:</span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">errCode)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        closesocket(sockClient)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        WSACleanup()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>客户端和服务器应分别属于两个exe<br/>
先运行服务器，后运行客户端</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[VC6聊天室程序设计]]></title>
        <id>/blog/2017/hexo-VC6聊天室程序设计</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-VC6聊天室程序设计"/>
        <updated>2017-09-05T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了一个使用VC6++环境，基于C语言、TCP套接字和多线程技术开发的简单聊天室程序。文章分别阐述了客户端和服务器端的设计思路。客户端采用双线程模式，一个用于接收用户输入并发送，另一个用于持续接收并显示服务器消息。服务器端则设计了三个线程，主线程负责监听和接受新的用户连接，第二个线程处理来自客户端的消息，第三个线程则将收到的消息广播给所有在线的用户，并通过一个链表来管理所有客户端信息。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="vc6聊天室程序设计"><a href="#vc6聊天室程序设计" class="rp-header-anchor rp-link" aria-hidden="true">#</a>VC6聊天室程序设计<!-- --> </h1>
<p>了解了C语言多线程的实例和简单的TCP通信，来编写一个简单的聊天室<br/>
曾经java实现的聊天室程序在这里</p>
<h3 class="rp-toc-include" id="1客户端程序"><a href="#1客户端程序" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.客户端程序</h3>
<p>客户端需要两个线程，主线程接受用户输入并发送到服务器<br/>
另一个线程监听服务器发来的消息，显示在屏幕上</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    #include</span><span style="color:var(--shiki-token-string-expression)"> &quot;winsock2.h&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #include</span><span style="color:var(--shiki-token-string-expression)"> &quot;stdio.h&quot;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #define</span><span style="color:var(--shiki-token-function)"> SERVER_IP</span><span style="color:var(--shiki-token-string-expression)">   &quot;10.80.167.248&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #define</span><span style="color:var(--shiki-token-function)"> SERVER_PORP</span><span style="color:var(--shiki-token-constant)"> 8884</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //blog:zfblog.xyz</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //author:Frey</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    DWORD WINAPI </span><span style="color:var(--shiki-token-function)">ThreadFun</span><span style="color:var(--shiki-foreground)">(LPVOID pM)  </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {   </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKET sockClient</span><span style="color:var(--shiki-token-keyword)">=*</span><span style="color:var(--shiki-foreground)">(SOCKET </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">)pM;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        char</span><span style="color:var(--shiki-foreground)"> recvInfo[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">recv(sockClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //加载套接字库</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        WORD wVersionRequested;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        WSADATA wsaData;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> err;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        wVersionRequested </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> MAKEWORD( </span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-function)"> )</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //版本好为1.1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        err </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> WSAStartup( wVersionRequested</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">wsaData )</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> ( err </span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)"> ) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            return</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> ( </span><span style="color:var(--shiki-token-function)">LOBYTE( </span><span style="color:var(--shiki-token-constant)">wsaData</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">wVersion )</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-keyword)"> ||</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        HIBYTE( </span><span style="color:var(--shiki-token-constant)">wsaData</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">wVersion )</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)"> ) {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            WSACleanup( )</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            return</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKET sockClient</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">socket(AF_INET</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">SOCK_STREAM</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //SOCK_STREAM参数设置为TCP连接</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKADDR_IN addrServer;</span><span style="color:var(--shiki-token-comment)"> //服务器地址结构</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">sin_addr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">S_un.S_addr</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">inet_addr(SERVER_IP)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //服务器地址</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">sin_port</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">htons(SERVER_PORP)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //服务器端口号</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">sin_family</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">AF_INET;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //与服务器端建立连接，进行通信</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        char</span><span style="color:var(--shiki-foreground)"> name[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;请输入姓名:&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        scanf(</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">name)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> connReult</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">connect(sockClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">(SOCKADDR</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">addrServer</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">sizeof</span><span style="color:var(--shiki-token-function)">(SOCKADDR))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)">(connReult</span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-foreground)">WSAEADDRNOTAVAIL)</span><span style="color:var(--shiki-token-comment)"> //访问成功</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            CreateThread(</span><span style="color:var(--shiki-token-constant)">NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> ThreadFun</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> (</span><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">sockClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;连接成功\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //成功建立连接后向服务器端发送数据，结果将显示在服务器端上</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            char</span><span style="color:var(--shiki-foreground)"> sendInfo[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            sprintf(sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">name)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            send(sockClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">strlen(sendInfo)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //接收来自服务器端发送来的信息</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //char recvInfo[100];</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //recv(sockClient,recvInfo,100,0);</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //printf(&quot;%s\n&quot;,recvInfo);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                scanf(</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">sendInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                send(sockClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">strlen(sendInfo)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        else</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            int</span><span style="color:var(--shiki-foreground)"> errCode</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">WSAGetLastError()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;the errcode is:</span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">errCode)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        closesocket(sockClient)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        WSACleanup()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="2服务器程序"><a href="#2服务器程序" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.服务器程序</h3>
<p>用一个链表来存储用户的套接字和姓名<br/>
主线程监听用户的连接，每当有新用户连接，将其信息加入链表，并传入第二个线程<br/>
第二个线程接受客户端发来的信息，并将信息传入第三个线程<br/>
第三个线程从链表中读取用户套接字，将接到的信息转发给所有在线用户</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    #include</span><span style="color:var(--shiki-token-string-expression)"> &quot;winsock2.h&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #include</span><span style="color:var(--shiki-token-string-expression)"> &quot;stdio.h&quot;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #include</span><span style="color:var(--shiki-token-string-expression)"> &lt;windows.h&gt;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //blog:zfblog.xyz</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //author:Frey</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #define</span><span style="color:var(--shiki-token-function)"> SERVER_PORP</span><span style="color:var(--shiki-token-constant)"> 8884</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    struct</span><span style="color:var(--shiki-foreground)"> client_info{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKET sockConn;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        char</span><span style="color:var(--shiki-foreground)"> name[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        client_info </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">next;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    };</span><span style="color:var(--shiki-token-comment)">//存放每一个用户的信息</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    client_info </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)"> C_info_head;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    DWORD WINAPI </span><span style="color:var(--shiki-token-function)">Threadmes</span><span style="color:var(--shiki-foreground)">(LPVOID pM)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        char</span><span style="color:var(--shiki-foreground)"> sendInfo[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        sprintf(sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">(</span><span style="color:var(--shiki-token-keyword)">char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-function)">)pM)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">&lt;=</span><span style="color:var(--shiki-foreground)">c_info_num;i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            SOCKET sockConn</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">C_info[i]</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">sockConn;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //if(C_info[i].num!=-1){</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            send(sockConn</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">strlen(sendInfo)</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //}</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //将某条消息群发给所有客户端</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    void</span><span style="color:var(--shiki-token-function)"> sendmessage</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">char</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">message)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        CreateThread(</span><span style="color:var(--shiki-token-constant)">NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> Threadmes</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> (</span><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-function)">)message</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //接收每个用户的信息</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    DWORD WINAPI </span><span style="color:var(--shiki-token-function)">ThreadFun</span><span style="color:var(--shiki-foreground)">(LPVOID pM)  </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {   </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        client_info c_info </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">(client_info </span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">)pM;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKET sockConn</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">c_info</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">sockConn;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        char</span><span style="color:var(--shiki-foreground)"> sendInfo[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //inet_ntoa将结构转换为十进制的IP地址字符串</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //sprintf(sendInfo,&quot;welcome %s to this Server!&quot;,inet_ntoa(addrClient.sin_addr));</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //成功建立连接后向客户端发送数据，结果将显示在客户端上</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //send(sockConn,sendInfo,strlen(sendInfo)+1,0);</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //从客户端接收数据，结果显示在服务器上</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        char</span><span style="color:var(--shiki-foreground)"> recvInfo[</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        recv(sockConn</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        sprintf(</span><span style="color:var(--shiki-token-constant)">c_info</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">name</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-function)">        printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;欢迎</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">进入聊天室\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        sprintf(sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;欢迎</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">进入聊天室\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        sendmessage(sendInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        {   </span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-function)">recv(sockConn</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">100</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                break</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;[</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">]:</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">c_info</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">name</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            sprintf(sendInfo</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;[</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">]:</span><span style="color:var(--shiki-token-constant)">%s</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">c_info</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">name</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">recvInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            sendmessage(sendInfo)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //将本次建立连接中得到套接字关闭</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        closesocket(sockConn)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //加载套接字（winsock）库，加载这段代码拷贝于MSDN中WSAStartup的介绍</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        WORD wVersionRequested;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        WSADATA wsaData;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> err;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        wVersionRequested </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> MAKEWORD( </span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-function)"> )</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //版本号为1.1</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        err </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> WSAStartup( wVersionRequested</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> &amp;</span><span style="color:var(--shiki-token-function)">wsaData )</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> ( err </span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)"> ) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            return</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> ( </span><span style="color:var(--shiki-token-function)">LOBYTE( </span><span style="color:var(--shiki-token-constant)">wsaData</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">wVersion )</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-token-keyword)"> ||</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        HIBYTE( </span><span style="color:var(--shiki-token-constant)">wsaData</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">wVersion )</span><span style="color:var(--shiki-token-keyword)"> !=</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)"> ) {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            WSACleanup( )</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            return</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //消息存储及发送</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //----------------------------------------------------</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //创建套接字</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKET sockServer</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">socket(AF_INET</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">SOCK_STREAM</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //SOCK_STREAM参数设置为TCP连接</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKADDR_IN addrServer;</span><span style="color:var(--shiki-token-comment)"> //设置服务器端套接字的相关属性</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">sin_addr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">S_un.S_addr</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">htonl(INADDR_ANY)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //设置IP</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">sin_family</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">AF_INET;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        addrServer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">sin_port</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">htons(SERVER_PORP)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //设置端口号</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //将套接字绑定到本地地址和指定端口上</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        bind(sockServer</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">(SOCKADDR</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">addrServer</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">sizeof</span><span style="color:var(--shiki-token-function)">(SOCKADDR))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //将套接字设置为监听模式，并将最大请求连接数设置成5，超过此数的请求全部作废</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        listen(sockServer</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        SOCKADDR_IN addrClient;</span><span style="color:var(--shiki-token-comment)"> //用来接收客户端的设置，包括IP和端口</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> len</span><span style="color:var(--shiki-token-keyword)">=sizeof</span><span style="color:var(--shiki-foreground)">(SOCKADDR);</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-comment)"> //不断监听</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //得到创建连接后的一个新的套接字，用来和客户端进行沟通，原套接字继续监听客户的连接请求</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            SOCKET sockConn</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">accept(sockServer</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">(SOCKADDR</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">addrClient</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">len)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)">(sockConn</span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-foreground)">INVALID_SOCKET)</span><span style="color:var(--shiki-token-comment)"> //创建成功</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            {   </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                c_info_num</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                C_info[c_info_num]</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">num</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">c_info_num;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                C_info[c_info_num]</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-foreground)">sockConn</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">sockConn;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                CreateThread(</span><span style="color:var(--shiki-token-constant)">NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> ThreadFun</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> (</span><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-function)">C_info[c_info_num]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            else</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                int</span><span style="color:var(--shiki-foreground)"> errCode</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">WSAGetLastError()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;the errcode is:</span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)">\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">errCode)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //如果本程序不是死循环，那么在此处还应添加以下代码：</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        closesocket(sockServer)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //对一直处于监听状态的套接字进行关闭</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        WSACleanup()</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)"> //终止对winsocket库的使用</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>未完成的问题<br/>
用户离线时出现bug<br/>
全部代码:<a href="https://github.com/summerIwinter/Chatroom" target="_blank" rel="noopener noreferrer" class="rp-link">https://github.com/summerIwinter/Chatroom</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[C语言多线程学习]]></title>
        <id>/blog/2017/hexo-C语言多线程学习</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-C语言多线程学习"/>
        <updated>2017-09-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是一篇关于在Windows环境下使用C语言进行多线程编程的学习笔记。文章通过一个简单的实例，详细讲解了如何使用`CreateThread`函数来创建一个新的子线程，并说明了该函数的各个参数的意义和用法。此外，还探讨了如何向线程函数传递参数，以及`WaitForSingleObject`函数在主线程中等待子线程执行完毕的重要性，以避免主程序提前退出导致子线程未执行完成的问题。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="c语言多线程学习"><a href="#c语言多线程学习" class="rp-header-anchor rp-link" aria-hidden="true">#</a>C语言多线程学习<!-- --> </h1>
<p>VC6++环境下C语言创建多线程</p>
<h3 class="rp-toc-include" id="1简单的创建多线程实例"><a href="#1简单的创建多线程实例" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.简单的创建多线程实例</h3>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    #include</span><span style="color:var(--shiki-token-string-expression)"> &lt;stdio.h&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    #include</span><span style="color:var(--shiki-token-string-expression)"> &lt;windows.h&gt;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //子线程函数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    DWORD WINAPI </span><span style="color:var(--shiki-token-function)">ThreadFun</span><span style="color:var(--shiki-foreground)">(LPVOID pM){</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;子线程的线程ID号为：</span><span style="color:var(--shiki-token-constant)">%d</span><span style="color:var(--shiki-token-string-expression)">\n子线程输出 Hello World\n&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> GetCurrentThreadId())</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //主函数，所谓主函数其实就是主线程执行的函数。</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">()</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;最简单的创建多线程实例\n&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        printf(</span><span style="color:var(--shiki-token-string-expression)">&quot;http://zfblog.xyz&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">        HANDLE handle </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> CreateThread(</span><span style="color:var(--shiki-token-constant)">NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> ThreadFun</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        WaitForSingleObject(handle</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> INFINITE)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>使用CreateThread函数创建线程</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-foreground)">    HANDLE  WINAPI   </span><span style="color:var(--shiki-token-function)">CreateThread</span><span style="color:var(--shiki-foreground)">(</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">               LPSECURITY_ATTRIBUTES   lpThreadAttributes</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">               DWORD    dwStackSize</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">               LPTHREAD_START_ROUTINE    lpStartAddress</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">               LPVOID    lpParameter</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">               DWORD   dwCreationFlags</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">               LPDWORD   lpThreadId);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>第一个参数表示线程内核对象的安全属性,一般传入NULL表示使用默认设置<br/>
第二个参数表示线程栈空间大小,传入0表示使用默认大小(1MB)<br/>
第三个参数表示新线程所执行的线程函数地址<br/>
　　　　　　　多个线程可以使用同一个函数地址(线程函数入口)<br/>
第四个参数是传给线程函数的参数<br/>
第五个参数指定额外的标志来控制线程的创建<br/>
　　　　　　　就是控制线程何时运行<br/>
　　　　　　　为0:直接运行<br/>
　　　　　　　为CREATE_SUSPENDED:调用ResumeThread()后运行<br/>
第六个参数将返回线程的ID号,传入NULL表示不需要返回该线程ID号<br/>
函数返回值:成功返回新线程的句柄,失败返回NULL</p>
<h3 class="rp-toc-include" id="2关于createthread给线程函数传递参数的问题"><a href="#2关于createthread给线程函数传递参数的问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.关于CreateThread()给线程函数传递参数的问题</h3>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-token-comment)">    //创建线程时传递参数</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    int</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">parameter;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    CreateThread</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">NULL</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> ThreadFun</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">void</span><span style="color:var(--shiki-token-keyword)"> *</span><span style="color:var(--shiki-foreground)">)parameter</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> NULL</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //想到一个问题直接使用全局的static变量会出现什么情况?????</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //parameter是任意类型的地址</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //线程函数中调用参数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    DWORD WINAPI </span><span style="color:var(--shiki-token-function)">ThreadFun</span><span style="color:var(--shiki-foreground)">(LPVOID pM)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //传入的地址指向一个int类型的数据</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            int</span><span style="color:var(--shiki-foreground)"> p</span><span style="color:var(--shiki-token-keyword)">=*</span><span style="color:var(--shiki-foreground)">PM;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            return</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>WaitForSingleObject函数作用</p>
<div class="rp-codeblock language-c"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="c"><code><span class="line"><span style="color:var(--shiki-foreground)">    DWORD  WINAPI  </span><span style="color:var(--shiki-token-function)">WaitForSingleObject</span><span style="color:var(--shiki-foreground)">(</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            HANDLE   hHandle</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            DWORD   dwMilliseconds</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    );</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>第一个参数为要等待的内核对象<br/>
第二个参数为最长等待的时间<br/>
　　　　　　为5000:等待5秒<br/>
　　　　　　为0:立即执行<br/>
　　　　　　为INFINITE:无限等待<br/>
函数返回值:WAIT_OBJECT_0在指定的时间内对象被触发<br/>
　　　　　　WAIT_TIMEOUT超过最长等待时间对象仍未被触发<br/>
　　　　　　WAIT_FAILED传入参数有错误<br/>
函数作用<br/>
首先要知道----线程的句柄在线程运行时是未触发的，结束后触发<br/>
在主函数中调用等待线程执行完毕，然后主函数结束<br/>
不用此函数可能会导致线程没有执行完，主函数结束，程序结束</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[windows系统盘瘦身]]></title>
        <id>/blog/2017/hexo-windows系统盘瘦身</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-windows系统盘瘦身"/>
        <updated>2017-09-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文提供了一些为Windows系统C盘进行“瘦身”的实用技巧，旨在解决系统盘空间不足的问题。文章主要介绍了三个有效的方法：一是通过命令行`powercfg -h off`关闭系统休眠功能，从而安全地删除占用大量空间的休眠文件（Hiberfil.sys）；二是将系统的虚拟内存（页面文件）从C盘移动到其他磁盘分区；三是清理系统中的临时文件，包括Windows的temp目录、ProgramData下的TEMP目录以及用户个人文件夹下的临时文件目录。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="windows系统盘瘦身"><a href="#windows系统盘瘦身" class="rp-header-anchor rp-link" aria-hidden="true">#</a>windows系统盘瘦身<!-- --> </h1>
<p>C盘满了，瘦一下身</p>
<h3 class="rp-toc-include" id="1关闭系统休眠功能"><a href="#1关闭系统休眠功能" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.关闭系统休眠功能</h3>
<p>删除Hiberfil.sys文件<br/>
管理员运行cmd输入下面命令<br/>
<code>powercfg -h of</code></p>
<p>2.设置虚拟内存</p>
<p>控制面板---&gt;(系统和安全)---&gt;系统---&gt;高级系统设置---&gt;(高级)---&gt;设置---&gt;(高级)---&gt;更改<br/>
把虚拟内存设置到其它盘</p>
<h3 class="rp-toc-include" id="3删除临时文件"><a href="#3删除临时文件" class="rp-header-anchor rp-link" aria-hidden="true">#</a>3.删除临时文件</h3>
<p>以下三个目录里的文件是临时文件，可以删除<br/>
C:\windows\temp<br/>
C:\ProgramData\TEMP<br/>
C:\Users\你的用户名\AppData\Local\Temp</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[powershell卸载自带应用]]></title>
        <id>/blog/2017/hexo-powershell卸载自带应用</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-powershell卸载自带应用"/>
        <updated>2017-09-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文提供了一系列实用的PowerShell命令，用于卸载Windows系统中自带的应用程序，帮助用户清理和简化系统。文章首先给出了一个可以一次性卸载当前用户所有自带应用的通用命令。随后，详细列举了针对特定应用的卸载命令，例如OneNote、3D应用、相机、邮件和日历、Groove音乐、人脉、照片以及Xbox等，方便用户根据自己的需求选择性地移除不需要的预装软件。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="powershell卸载自带应用"><a href="#powershell卸载自带应用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>powershell卸载自带应用<!-- --> </h1>
<p>通过powershell卸载windows自带应用</p>
<h3 class="rp-toc-include" id="1卸载全部自带应用"><a href="#1卸载全部自带应用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.卸载全部自带应用</h3>
<p><code>Get-AppxPackage -User $env:USERNAME | Remove-AppxPackage</code></p>
<h3 class="rp-toc-include" id="2其他更多卸载"><a href="#2其他更多卸载" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.其他更多卸载</h3>
<p>OneNote:<br/>
<code>Get-AppxPackage OneNote | Remove-AppxPackage</code><br/>
3D:<br/>
<code>Get-AppxPackage 3d | Remove-AppxPackage</code><br/>
Camera相机:<br/>
<code>Get-AppxPackage camera | Remove-AppxPackage</code><br/>
邮件和日历:<br/>
<code>Get-AppxPackage communi | Remove-AppxPackage</code><br/>
新闻订阅:<br/>
<code>Get-AppxPackage bing | Remove-AppxPackage</code><br/>
Groove音乐电影与电视:<br/>
<code>Get-AppxPackage zune | Remove-AppxPackage</code><br/>
人脉:<br/>
<code>Get-AppxPackage people | Remove-AppxPackage</code><br/>
手机伴侣Phone Companion:<br/>
<code>Get-AppxPackage phone | Remove-AppxPackage</code><br/>
照片:<br/>
<code>Get-AppxPackage photo | Remove-AppxPackage</code><br/>
纸牌游戏(还敢要钱的那货):<br/>
<code>Get-AppxPackage solit | Remove-AppxPackage</code><br/>
录音机:<br/>
<code>Get-AppxPackage soundrec | Remove-AppxPackage</code><br/>
Xbox:<br/>
<code>Get-AppxPackage xbox | Remove-AppxPackage</code></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[powershell脚本遍历目录]]></title>
        <id>/blog/2017/hexo-powershell脚本遍历目录</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-powershell脚本遍历目录"/>
        <updated>2017-09-01T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文提供了一个实用的PowerShell脚本示例，用于遍历指定目录及其所有子目录，并计算每个子文件夹的总大小。脚本的核心是一个名为`filesize`的自定义函数，该函数接收一个文件路径作为参数，然后利用`dir -Path`和`ForEach-Object`循环遍历目录。对于每个子文件夹，它会通过`dir -Recurse`递归获取所有文件并累加其大小（Length属性），最终以KB为单位输出每个文件夹的名称和计算出的总大小。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="powershell脚本遍历目录"><a href="#powershell脚本遍历目录" class="rp-header-anchor rp-link" aria-hidden="true">#</a>powershell脚本遍历目录<!-- --> </h1>
<p>powershell脚本遍历目录</p>
<h3 class="rp-toc-include" id="1遍历目录及子目录"><a href="#1遍历目录及子目录" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.遍历目录及子目录</h3>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>function filesize ([string]$filepath) {</span></span>
<span class="line"><span>    if ($filepath -eq $null) {</span></span>
<span class="line"><span>        throw &quot;路径不能为空&quot;</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>    dir -Path $filepath | ForEach-Object -Process {</span></span>
<span class="line"><span>        if ($_.psiscontainer -eq $true) {</span></span>
<span class="line"><span>            $length = 0</span></span>
<span class="line"><span>            dir -Path $_.fullname -Recurse | ForEach-Object {</span></span>
<span class="line"><span>                $length += $_.Length</span></span>
<span class="line"><span>            }</span></span>
<span class="line"><span>            $l = $length / 1KB</span></span>
<span class="line"><span>            $_.name + &quot;文件夹的大小为: {0:n1} KB&quot; -f $l</span></span>
<span class="line"><span>        }</span></span>
<span class="line"><span>    }</span></span>
<span class="line"><span>}</span></span>
<span class="line"><span>filesize -filepath &quot;D:\&quot;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="2运行示例"><a href="#2运行示例" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.运行示例</h3>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>PS F:\python&gt; function filesize ([string]$filepath) {</span></span>
<span class="line"><span>&gt;&gt; if ($filepath -eq $null) {</span></span>
<span class="line"><span>&gt;&gt; throw &quot;路径不能为空&quot;</span></span>
<span class="line"><span>&gt;&gt; }</span></span>
<span class="line"><span>&gt;&gt; dir -Path $filepath | ForEach-Object -Process {</span></span>
<span class="line"><span>&gt;&gt; if ($_.psiscontainer -eq $true) {</span></span>
<span class="line"><span>&gt;&gt; $length = 0</span></span>
<span class="line"><span>&gt;&gt; dir -Path $_.fullname -Recurse | ForEach-Object {</span></span>
<span class="line"><span>&gt;&gt; $length += $_.Length</span></span>
<span class="line"><span>&gt;&gt; }</span></span>
<span class="line"><span>&gt;&gt; $l = $length / 1KB</span></span>
<span class="line"><span>&gt;&gt; $_.name + &quot;文件夹的大小为: {0:n1} KB&quot; -f $l</span></span>
<span class="line"><span>&gt;&gt; }</span></span>
<span class="line"><span>&gt;&gt; }</span></span>
<span class="line"><span>&gt;&gt; }</span></span>
<span class="line"><span>PS F:\python&gt; filesize -filepath &quot;f:\python&quot;</span></span>
<span class="line"><span>ipluyou文件夹的大小为: 82,196.5 KB</span></span>
<span class="line"><span>loginip_jlu文件夹的大小为: 16.8 KB</span></span>
<span class="line"><span>嗅事百科文件夹的大小为: 4.3 KB</span></span>
<span class="line"><span>小说文件夹的大小为: 31,043.6 KB</span></span>
<span class="line"><span>笑料文件夹的大小为: 1,578,575.8 KB</span></span>
<span class="line"><span>PS F:\python&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[自己写一个Android照相机应用-2]]></title>
        <id>/blog/2017/hexo-自己写一个Android照相机应用-2</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-自己写一个Android照相机应用-2"/>
        <updated>2017-08-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是开发自定义Android相机应用系列教程的第二部分，重点讲解了如何实现一个自定义的相机界面。内容涵盖了Camera对象的生命周期管理，包括获取、预览和释放相机资源，并将其与Activity的生命周期（onResume, onPause）进行绑定。文章还详细说明了如何使用SurfaceView来显示相机预览，如何设置相机参数（如图片格式、尺寸、自动对焦），以及如何通过调用`takePicture`方法并利用其回调函数来捕获图像数据，最终将照片保存到文件中。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="自己写一个android照相机应用-2"><a href="#自己写一个android照相机应用-2" class="rp-header-anchor rp-link" aria-hidden="true">#</a>自己写一个Android照相机应用-2<!-- --> </h1>
<p>Android自定义相机的实现<br/>
首先是要创建camera的生命周期</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-function)">    getCamera()</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//获取Camera对象</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    setStartPreview(</span><span style="color:var(--shiki-token-keyword)">Camera</span><span style="color:var(--shiki-token-function)"> camera</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">SurfaceHolder</span><span style="color:var(--shiki-token-function)"> holder)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//预览相机内容</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">    releaseCamera()</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//释放相机资源</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">activity生命周期与camera绑定</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    protected</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> onResume()</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        super</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">onResume</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> (mCamera </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-token-constant)"> null</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            mCamera </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> getCamera()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)"> (mHolder </span><span style="color:var(--shiki-token-keyword)">!=</span><span style="color:var(--shiki-token-constant)"> null</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                setStartPreview(mCamera</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">mHolder)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    protected</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> onPause()</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        super</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">onPause</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        releaseCamera()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>camera与surfaceview绑定</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-comment)">    //预览图像与camera绑定</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    @</span><span style="color:var(--shiki-token-keyword)">Override</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> surfaceCreated(</span><span style="color:var(--shiki-token-keyword)">SurfaceHolder</span><span style="color:var(--shiki-token-function)"> holder)</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        setStartPreview(mCamera</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">mHolder)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    @</span><span style="color:var(--shiki-token-keyword)">Override</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> surfaceChanged(</span><span style="color:var(--shiki-token-keyword)">SurfaceHolder</span><span style="color:var(--shiki-token-function)"> holder</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-token-function)"> format</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-token-function)"> width</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-token-function)"> height)</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        mCamera</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">stopPreview</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        setStartPreview(mCamera</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">mHolder)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    @</span><span style="color:var(--shiki-token-keyword)">Override</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> surfaceDestroyed(</span><span style="color:var(--shiki-token-keyword)">SurfaceHolder</span><span style="color:var(--shiki-token-function)"> holder)</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">        releaseCamera()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>声明相机使用权限</p>
<div class="rp-codeblock language-xml"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="xml"><code><span class="line"><span style="color:var(--shiki-foreground)">    &lt;</span><span style="color:var(--shiki-token-string-expression)">uses-permission</span><span style="color:var(--shiki-token-function)"> android</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-function)">name</span><span style="color:var(--shiki-foreground)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;android.permission.CAMERA&quot;</span><span style="color:var(--shiki-foreground)">&lt;/uses-permission&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>实现照相，通过回调将照片数据保存到文件，并将文件路径传递到其它activity(ResultAty)</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> Camera</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">PictureCallback</span><span style="color:var(--shiki-foreground)"> mPictureCallback </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-foreground)"> Camera</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">PictureCallback</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        @</span><span style="color:var(--shiki-token-keyword)">Override</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        public</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> onPictureTaken(</span><span style="color:var(--shiki-token-keyword)">byte</span><span style="color:var(--shiki-token-function)">[] data</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> Camera</span><span style="color:var(--shiki-token-function)"> camera)</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-comment)">//data中存储照片的全部信息</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            File</span><span style="color:var(--shiki-foreground)"> tempFile </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> File(</span><span style="color:var(--shiki-token-string-expression)">&quot;/sdacrd/temp.png&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            try</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                FileOutputStream</span><span style="color:var(--shiki-foreground)"> fos </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> FileOutputStream(tempFile)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                fos</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">write</span><span style="color:var(--shiki-foreground)">(data);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                fos</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">close</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                Intent</span><span style="color:var(--shiki-foreground)"> intent </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> Intent(</span><span style="color:var(--shiki-token-constant)">CustomCamera</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">ResultAty</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">class</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                intent</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">putExtra</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;picPath&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">tempFile</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getAbsolutePath</span><span style="color:var(--shiki-foreground)">());</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                startActivity(intent)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                CustomCamera</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">finish</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            } </span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">FileNotFoundException</span><span style="color:var(--shiki-foreground)"> e) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                e</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">printStackTrace</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            } </span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">IOException</span><span style="color:var(--shiki-foreground)"> e) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                e</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">printStackTrace</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    };</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> capture(</span><span style="color:var(--shiki-token-keyword)">View</span><span style="color:var(--shiki-token-function)"> view)</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        Camera</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">Parameters</span><span style="color:var(--shiki-foreground)"> parameters </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> mCamera</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getParameters</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        parameters</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">setPictureFormat</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">ImageFormat</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">JPEG</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)">//设置拍照格式jpg格式</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        parameters</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">setPictureSize</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">800</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">400</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)">//设置照片大小</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        parameters</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">setFocusMode</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">Camera</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">Parameters</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">FOCUS_MODE_AUTO</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)">//设置自动对焦</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        mCamera</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">autoFocus</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-foreground)"> Camera</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">AutoFocusCallback</span><span style="color:var(--shiki-foreground)">() {  </span><span style="color:var(--shiki-token-comment)">//回调，对焦最清晰时拍照</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        @</span><span style="color:var(--shiki-token-keyword)">Override</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        public</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> onAutoFocus(</span><span style="color:var(--shiki-token-keyword)">boolean</span><span style="color:var(--shiki-token-function)"> success</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> Camera</span><span style="color:var(--shiki-token-function)"> camera)</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)"> (success) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                mCamera</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">takePicture</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">null</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">null</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">mPictureCallback);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        });</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[JAVA套接字之TCP实现聊天室]]></title>
        <id>/blog/2017/hexo-JAVA套接字之TCP实现聊天室</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-JAVA套接字之TCP实现聊天室"/>
        <updated>2017-08-10T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文通过Java套接字（Socket）和多线程技术，实现了一个功能完整的TCP聊天室。文章详细展示了客户端和服务器端的代码。客户端设计了两个线程，分别负责向服务器发送消息和监听并显示来自服务器的消息。服务器端则更为复杂，由主类监听客户端连接请求，并为每个连接创建一个独立的`ServerThread`线程进行处理，同时还有一个`PrintOutThread`线程专门负责将消息队列中的信息广播给所有在线用户，支持多人随时加入和退出。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="java套接字之tcp实现聊天室"><a href="#java套接字之tcp实现聊天室" class="rp-header-anchor rp-link" aria-hidden="true">#</a>JAVA套接字之TCP实现聊天室<!-- --> </h1>
<p>java实现聊天室,通过多线程实现随时加入,随时退出</p>
<h3 class="rp-toc-include" id="1客户端程序"><a href="#1客户端程序" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.客户端程序</h3>
<p>客户端有两个线程<br/>
一个线程由主类SocketClient实现向服务器发送消息<br/>
一个线程由内部类readLineThread实现监听服务器发来的消息并显示</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">io</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">BufferedReader</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">io</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">InputStreamReader</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">io</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">PrintWriter</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">net</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">Socket</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-token-function)"> SocketClient</span><span style="color:var(--shiki-token-keyword)"> extends</span><span style="color:var(--shiki-token-function)"> Socket</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> String</span><span style="color:var(--shiki-foreground)"> SERVER_IP </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)"> &quot;127.0.0.1&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> SERVER_PORT </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 2017</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        private</span><span style="color:var(--shiki-token-keyword)"> Socket</span><span style="color:var(--shiki-foreground)"> client;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        private</span><span style="color:var(--shiki-token-keyword)"> PrintWriter</span><span style="color:var(--shiki-foreground)"> out;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        private</span><span style="color:var(--shiki-token-keyword)"> BufferedReader</span><span style="color:var(--shiki-foreground)"> in;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        /**</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">         * 与服务器连接，并输入发送消息</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">         */</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        public</span><span style="color:var(--shiki-token-function)"> SocketClient</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">throws</span><span style="color:var(--shiki-token-keyword)"> Exception</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            super(SERVER_IP</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> SERVER_PORT);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            client </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> this</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            out </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> PrintWriter(</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getOutputStream()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> true</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            in </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> BufferedReader(</span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-token-function)"> InputStreamReader(</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getInputStream()))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            new</span><span style="color:var(--shiki-token-function)"> readLineThread()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                in </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> BufferedReader(</span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-token-function)"> InputStreamReader(</span><span style="color:var(--shiki-token-constant)">System</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">in</span><span style="color:var(--shiki-token-function)">))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                String</span><span style="color:var(--shiki-foreground)"> input </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> in</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">readLine</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(input);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        /**</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">         * 用于监听服务器端向客户端发送消息线程类</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">         */</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        class</span><span style="color:var(--shiki-token-function)"> readLineThread</span><span style="color:var(--shiki-token-keyword)"> extends</span><span style="color:var(--shiki-token-function)"> Thread</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            private</span><span style="color:var(--shiki-token-keyword)"> BufferedReader</span><span style="color:var(--shiki-foreground)"> buff;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            public</span><span style="color:var(--shiki-token-function)"> readLineThread</span><span style="color:var(--shiki-foreground)">(){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                try</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    buff </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> BufferedReader(</span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-token-function)"> InputStreamReader(</span><span style="color:var(--shiki-token-constant)">client</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getInputStream()))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                    start()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                } </span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">Exception</span><span style="color:var(--shiki-foreground)"> e) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">            @</span><span style="color:var(--shiki-token-keyword)">Override</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            public</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> run</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                try</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                        String</span><span style="color:var(--shiki-foreground)"> result </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> buff</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">readLine</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                        if</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;byeClient&quot;</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">equals</span><span style="color:var(--shiki-foreground)">(result)){</span><span style="color:var(--shiki-token-comment)">//客户端申请退出，服务端返回确认退出</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                            break</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                        }</span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-foreground)">{</span><span style="color:var(--shiki-token-comment)">//输出服务端发送消息</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                            System</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(result);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    }</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    in</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">close</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">close</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    client</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">close</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                } </span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">Exception</span><span style="color:var(--shiki-foreground)"> e) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        public</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">String</span><span style="color:var(--shiki-foreground)">[] args) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            try</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                new</span><span style="color:var(--shiki-token-function)"> SocketClient()</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//启动客户端</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            } </span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">Exception</span><span style="color:var(--shiki-foreground)"> e) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="2服务器程序"><a href="#2服务器程序" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.服务器程序</h3>
<p>服务器由三个类实现<br/>
主类Server监听客户端请求，并启用线程处理请求<br/>
内部类PrintOutThread监听输出消息请求，将消息发送到所有客户端<br/>
内部类ServerThread提供与每一个用户的连接</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">io</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">BufferedReader</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">io</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">IOException</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">io</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">InputStreamReader</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">io</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">PrintWriter</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">net</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">ServerSocket</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">net</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">Socket</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">util</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">ArrayList</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">util</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">LinkedList</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">util</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">List</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-token-function)"> Server</span><span style="color:var(--shiki-token-keyword)"> extends</span><span style="color:var(--shiki-token-function)"> ServerSocket</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> SERVER_PORT </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 2017</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> boolean</span><span style="color:var(--shiki-foreground)"> isPrint </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> false</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">// 是否输出消息标志</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> List</span><span style="color:var(--shiki-foreground)"> user_list </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> ArrayList()</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">// 登录用户集合</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> List</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">ServerThread</span><span style="color:var(--shiki-foreground)">&gt; thread_list </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-keyword)"> ArrayList</span><span style="color:var(--shiki-foreground)">&lt;</span><span style="color:var(--shiki-token-keyword)">ServerThread</span><span style="color:var(--shiki-foreground)">&gt;();</span><span style="color:var(--shiki-token-comment)">// 服务器已启用线程集合</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> LinkedList</span><span style="color:var(--shiki-foreground)"> message_list </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> LinkedList()</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">// 存放消息队列</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        /**</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">         * 创建服务端Socket,创建向客户端发送消息线程,监听客户端请求并处理</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">         */</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        public</span><span style="color:var(--shiki-token-function)"> Server</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">throws</span><span style="color:var(--shiki-token-keyword)"> IOException</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            super(SERVER_PORT);</span><span style="color:var(--shiki-token-comment)">// 创建ServerSocket</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            new</span><span style="color:var(--shiki-token-function)"> PrintOutThread()</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">// 创建向客户端发送消息线程</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            try</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                while</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">) {</span><span style="color:var(--shiki-token-comment)">// 监听客户端请求，启用一个线程处理</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    Socket</span><span style="color:var(--shiki-foreground)"> socket </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> accept()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    new</span><span style="color:var(--shiki-token-function)"> ServerThread(socket)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            } </span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">Exception</span><span style="color:var(--shiki-foreground)"> e) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            } </span><span style="color:var(--shiki-token-keyword)">finally</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                close()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        /**</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">         * 监听是否有输出消息请求线程类,向客户端发送消息</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">         */</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        class</span><span style="color:var(--shiki-token-function)"> PrintOutThread</span><span style="color:var(--shiki-token-keyword)"> extends</span><span style="color:var(--shiki-token-function)"> Thread</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            public</span><span style="color:var(--shiki-token-function)"> PrintOutThread</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                start()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">            @</span><span style="color:var(--shiki-token-keyword)">Override</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            public</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> run</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                while</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">                    //没有打印这句，if里面的语句不会执行，可能是多线程访问isPrint造成的</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    System</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;运行中。。。&quot;</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">isPrint);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    if</span><span style="color:var(--shiki-foreground)"> (isPrint) {</span><span style="color:var(--shiki-token-comment)">// 将缓存在队列中的消息按顺序发送到各客户端,并从队列中清除。</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                        String</span><span style="color:var(--shiki-foreground)"> message </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (String) </span><span style="color:var(--shiki-token-constant)">message_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getFirst</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                        for</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">ServerThread</span><span style="color:var(--shiki-foreground)"> thread </span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> thread_list) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                            thread</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">sendMessage</span><span style="color:var(--shiki-foreground)">(message);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                        }</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                        message_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">removeFirst</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                        isPrint </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> message_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">size</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-keyword)"> ?</span><span style="color:var(--shiki-token-constant)"> true</span><span style="color:var(--shiki-token-keyword)"> :</span><span style="color:var(--shiki-token-constant)"> false</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        /**</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">         * 服务器线程类</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">         */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        @</span><span style="color:var(--shiki-token-keyword)">SuppressWarnings</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;unchecked&quot;</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        class</span><span style="color:var(--shiki-token-function)"> ServerThread</span><span style="color:var(--shiki-token-keyword)"> extends</span><span style="color:var(--shiki-token-function)"> Thread</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            private</span><span style="color:var(--shiki-token-keyword)"> Socket</span><span style="color:var(--shiki-foreground)"> client;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            private</span><span style="color:var(--shiki-token-keyword)"> PrintWriter</span><span style="color:var(--shiki-foreground)"> out;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            private</span><span style="color:var(--shiki-token-keyword)"> BufferedReader</span><span style="color:var(--shiki-foreground)"> in;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            private</span><span style="color:var(--shiki-token-keyword)"> String</span><span style="color:var(--shiki-foreground)"> name;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            public</span><span style="color:var(--shiki-token-function)"> ServerThread</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">Socket</span><span style="color:var(--shiki-foreground)"> s) </span><span style="color:var(--shiki-token-keyword)">throws</span><span style="color:var(--shiki-token-keyword)"> IOException</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                client </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> s;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                out </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> PrintWriter(</span><span style="color:var(--shiki-token-constant)">client</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getOutputStream()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> true</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                in </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> BufferedReader(</span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-token-function)"> InputStreamReader(</span><span style="color:var(--shiki-token-constant)">client</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getInputStream()))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">                //in.readLine();</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;成功连上聊天室,请输入你的名字：&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                start()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">            @</span><span style="color:var(--shiki-token-keyword)">Override</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            public</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> run</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                try</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    int</span><span style="color:var(--shiki-foreground)"> flag </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    String</span><span style="color:var(--shiki-foreground)"> line </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> in</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">readLine</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    while</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">                        // 查看在线用户列表</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                        if</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-string-expression)">&quot;showuser&quot;</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">equals</span><span style="color:var(--shiki-foreground)">(line)) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                            out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">listOnlineUsers</span><span style="color:var(--shiki-foreground)">());</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                        if</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;bye&quot;</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">equals</span><span style="color:var(--shiki-foreground)">(line)){</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                            out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;bye&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                        break</span><span style="color:var(--shiki-foreground)">;}</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">                        // 第一次进入，保存名字</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                        if</span><span style="color:var(--shiki-foreground)"> (flag</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-token-keyword)"> ==</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                            name </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> line;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                            user_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-foreground)">(name);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                            thread_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">add</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                            out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(name </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-string-expression)"> &quot;你好,可以开始聊天了...&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                            this</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">pushMessage</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;Client&lt;&quot;</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> name </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-string-expression)"> &quot;&gt;进入聊天室...&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                        } </span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                            this</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">pushMessage</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;Client&lt;&quot;</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> name </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-string-expression)"> &quot;&gt; say : &quot;</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-foreground)"> line);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                        line </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> in</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">readLine</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    }</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;byeClient&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                } </span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">Exception</span><span style="color:var(--shiki-foreground)"> e) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    e</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">printStackTrace</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                } </span><span style="color:var(--shiki-token-keyword)">finally</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-comment)">// 用户退出聊天室</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    try</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                        client</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">close</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    } </span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">IOException</span><span style="color:var(--shiki-foreground)"> e) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                        e</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">printStackTrace</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    }</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    thread_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">remove</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">this</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    user_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">remove</span><span style="color:var(--shiki-foreground)">(name);</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">                    pushMessage(</span><span style="color:var(--shiki-token-string-expression)">&quot;Client&lt;&quot;</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-function)"> name </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-string-expression)"> &quot;&gt;退出了聊天室&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            // 放入消息队列末尾，准备发送给客户端</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            private</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> pushMessage</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">String</span><span style="color:var(--shiki-foreground)"> msg) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                message_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">addLast</span><span style="color:var(--shiki-foreground)">(msg);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                isPrint </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> true</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            // 向客户端发送一条消息</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            private</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> sendMessage</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">String</span><span style="color:var(--shiki-foreground)"> msg) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(msg);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            // 统计在线用户列表</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            private</span><span style="color:var(--shiki-token-keyword)"> String</span><span style="color:var(--shiki-token-function)"> listOnlineUsers</span><span style="color:var(--shiki-foreground)">() {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                String</span><span style="color:var(--shiki-foreground)"> s </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)"> &quot;--- 在线用户列表 ---\015\012&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                for</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">; i </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)"> user_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">size</span><span style="color:var(--shiki-foreground)">(); i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    s </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-string-expression)"> &quot;[&quot;</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-constant)"> user_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">get</span><span style="color:var(--shiki-foreground)">(i) </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-string-expression)"> &quot;]\015\012&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                s </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-string-expression)"> &quot;--------------------&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                return</span><span style="color:var(--shiki-foreground)"> s;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        public</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">String</span><span style="color:var(--shiki-foreground)">[] args) </span><span style="color:var(--shiki-token-keyword)">throws</span><span style="color:var(--shiki-token-keyword)"> IOException</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            new</span><span style="color:var(--shiki-token-function)"> Server()</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">// 启动服务端</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>这里好像出现了多线程问题</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-foreground)">    @</span><span style="color:var(--shiki-token-keyword)">Override</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> run()</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        while</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">) {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //没有打印下面这句，if里面的语句不会执行，可能是这个线程一直访问isPrint,改变它的线程不能访问到它造成的</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">            System</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;运行中。。。&quot;</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">isPrint);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)"> (isPrint) {</span><span style="color:var(--shiki-token-comment)">// 将缓存在队列中的消息按顺序发送到各客户端，并从队列中清除。</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                String</span><span style="color:var(--shiki-foreground)"> message </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (String) </span><span style="color:var(--shiki-token-constant)">message_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getFirst</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                for</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">ServerThread</span><span style="color:var(--shiki-foreground)"> thread </span><span style="color:var(--shiki-token-keyword)">:</span><span style="color:var(--shiki-foreground)"> thread_list) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    thread</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">sendMessage</span><span style="color:var(--shiki-foreground)">(message);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                message_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">removeFirst</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                isPrint </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> message_list</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">size</span><span style="color:var(--shiki-foreground)">() </span><span style="color:var(--shiki-token-keyword)">&gt;</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-keyword)"> ?</span><span style="color:var(--shiki-token-constant)"> true</span><span style="color:var(--shiki-token-keyword)"> :</span><span style="color:var(--shiki-token-constant)"> false</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[JAVA套接字之TCP简单实用]]></title>
        <id>/blog/2017/hexo-JAVA套接字之TCP简单实用</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-JAVA套接字之TCP简单实用"/>
        <updated>2017-08-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了Java中TCP套接字编程的基础知识和实用方法。文章通过两个具体的示例进行讲解：第一个是单客户端与服务器的排队连接通信，展示了基本的Socket、ServerSocket、BufferedReader和PrintWriter的使用。第二个示例则演示了如何通过多线程技术，使服务器能够同时处理多个客户端的连接请求，为每个客户端分配一个独立的线程进行通信，从而实现了并发服务的能力。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="java套接字之tcp简单实用"><a href="#java套接字之tcp简单实用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>JAVA套接字之TCP简单实用<!-- --> </h1>
<p>java套接字之TCP</p>
<h3 class="rp-toc-include" id="1单客户端排队与服务器建立连接"><a href="#1单客户端排队与服务器建立连接" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.单客户端排队与服务器建立连接</h3>
<p>客户端程序</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">net</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">io</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-token-function)"> Client</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        static</span><span style="color:var(--shiki-token-keyword)"> Socket</span><span style="color:var(--shiki-foreground)"> server;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        public</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">String</span><span style="color:var(--shiki-foreground)">[] args)</span><span style="color:var(--shiki-token-keyword)">throws</span><span style="color:var(--shiki-token-keyword)"> Exception</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //客户端请求与本机在5678端口建立TCP连接</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            server</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-function)"> Socket(</span><span style="color:var(--shiki-token-constant)">InetAddress</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getLocalHost()</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">5678</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            BufferedReader</span><span style="color:var(--shiki-foreground)"> in</span><span style="color:var(--shiki-token-keyword)">=</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                new</span><span style="color:var(--shiki-token-function)"> BufferedReader(</span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-token-function)"> InputStreamReader(</span><span style="color:var(--shiki-token-constant)">server</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getInputStream()))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //获取Socket的输入流，用来接收从服务端发送过来的数据</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            PrintWriter</span><span style="color:var(--shiki-foreground)"> out</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-function)"> PrintWriter(</span><span style="color:var(--shiki-token-constant)">server</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getOutputStream())</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //获取Socket的输出流，用来发送数据到服务端</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            BufferedReader</span><span style="color:var(--shiki-foreground)"> wt</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-function)"> BufferedReader(</span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-token-function)"> InputStreamReader(</span><span style="color:var(--shiki-token-constant)">System</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">in</span><span style="color:var(--shiki-token-function)">))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //从键盘输入的数据流</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                String</span><span style="color:var(--shiki-foreground)"> str</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">wt</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">readLine</span><span style="color:var(--shiki-foreground)">();</span><span style="color:var(--shiki-token-comment)">//读取键盘输入字符串</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(str);</span><span style="color:var(--shiki-token-comment)">//发送数据到服务端</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">flush</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                if</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">str</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">equals</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;end&quot;</span><span style="color:var(--shiki-foreground)">)){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    break</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                System</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">in</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">readLine</span><span style="color:var(--shiki-foreground)">());</span><span style="color:var(--shiki-token-comment)">//打印服务器返回的字符串</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">            server</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">close</span><span style="color:var(--shiki-foreground)">();</span><span style="color:var(--shiki-token-comment)">//关闭连接</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>服务器程序1</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">io</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">net</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-token-function)"> Server</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        public</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">String</span><span style="color:var(--shiki-foreground)">[] args) </span><span style="color:var(--shiki-token-keyword)">throws</span><span style="color:var(--shiki-token-keyword)"> IOException</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            ServerSocket</span><span style="color:var(--shiki-foreground)"> server</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-function)"> ServerSocket(</span><span style="color:var(--shiki-token-constant)">5678</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//通信端口</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">){</span><span style="color:var(--shiki-token-comment)">//一个客户端断开连接后，等待与另一个客户端建立连接</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                Socket</span><span style="color:var(--shiki-foreground)"> client</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">server</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">accept</span><span style="color:var(--shiki-foreground)">();</span><span style="color:var(--shiki-token-comment)">//accept用于产生&quot;阻塞&quot;，直到接受到一个连接，并且返回一个客户端的Socket对象实例。</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                BufferedReader</span><span style="color:var(--shiki-foreground)"> in</span><span style="color:var(--shiki-token-keyword)">=</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    new</span><span style="color:var(--shiki-token-function)"> BufferedReader(</span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-token-function)"> InputStreamReader(</span><span style="color:var(--shiki-token-constant)">client</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getInputStream()))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                PrintWriter</span><span style="color:var(--shiki-foreground)"> out</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-function)"> PrintWriter(</span><span style="color:var(--shiki-token-constant)">client</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getOutputStream())</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">){</span><span style="color:var(--shiki-token-comment)">//直到客户端发送end退出循环</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    String</span><span style="color:var(--shiki-foreground)"> str</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">in</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">readLine</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    System</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(str);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;has receive....&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">flush</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    if</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">str</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">equals</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;end&quot;</span><span style="color:var(--shiki-foreground)">))</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                        break</span><span style="color:var(--shiki-foreground)">;   </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }   </span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                client</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">close</span><span style="color:var(--shiki-foreground)">();</span><span style="color:var(--shiki-token-comment)">//关闭通信</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }   </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h3 class="rp-toc-include" id="2多个客户端同时与服务器建立连接"><a href="#2多个客户端同时与服务器建立连接" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.多个客户端同时与服务器建立连接</h3>
<p>客户端程序不变,服务器端阻塞等待客户端连接,并给每个链接分配一个线程</p>
<p>服务器程序2</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">io</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">net</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-token-function)"> Server</span><span style="color:var(--shiki-token-keyword)"> extends</span><span style="color:var(--shiki-token-function)"> Thread</span><span style="color:var(--shiki-foreground)"> {</span><span style="color:var(--shiki-token-comment)">//继承Thread类</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        private</span><span style="color:var(--shiki-token-keyword)"> Socket</span><span style="color:var(--shiki-foreground)"> client;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        public</span><span style="color:var(--shiki-token-function)"> Server</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">Socket</span><span style="color:var(--shiki-foreground)"> c){</span><span style="color:var(--shiki-token-comment)">//类初始化，接受参数为客户端的请求</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">            this</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">client</span><span style="color:var(--shiki-token-keyword)"> =</span><span style="color:var(--shiki-foreground)"> c;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        public</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> run</span><span style="color:var(--shiki-foreground)">(){</span><span style="color:var(--shiki-token-comment)">//重写run函数</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            try</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                BufferedReader</span><span style="color:var(--shiki-foreground)"> in</span><span style="color:var(--shiki-token-keyword)">=</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    new</span><span style="color:var(--shiki-token-function)"> BufferedReader(</span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-token-function)"> InputStreamReader(</span><span style="color:var(--shiki-token-constant)">client</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getInputStream()))</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                PrintWriter</span><span style="color:var(--shiki-foreground)"> out</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-function)"> PrintWriter(</span><span style="color:var(--shiki-token-constant)">client</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getOutputStream())</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    String</span><span style="color:var(--shiki-foreground)"> str</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">in</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">readLine</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    System</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(str);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;has receive....&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">flush</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                    if</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">str</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">equals</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;end&quot;</span><span style="color:var(--shiki-foreground)">))</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                        break</span><span style="color:var(--shiki-foreground)">;   </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }   </span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                client</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">close</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">IOException</span><span style="color:var(--shiki-foreground)"> ex){</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span><span style="color:var(--shiki-token-keyword)">finally</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        public</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">String</span><span style="color:var(--shiki-foreground)">[] args) </span><span style="color:var(--shiki-token-keyword)">throws</span><span style="color:var(--shiki-token-keyword)"> IOException</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            ServerSocket</span><span style="color:var(--shiki-foreground)"> server</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-function)"> ServerSocket(</span><span style="color:var(--shiki-token-constant)">5678</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            while</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">true</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                Server</span><span style="color:var(--shiki-foreground)"> mu</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-function)"> Server(</span><span style="color:var(--shiki-token-constant)">server</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">accept())</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//每当有客户端请求就新建一个Server类与之通信</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                mu</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">start</span><span style="color:var(--shiki-foreground)">();</span><span style="color:var(--shiki-token-comment)">//启动进程</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }   </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Matlab函数freqs和freqz]]></title>
        <id>/blog/2017/hexo-Matlab函数freqs和freqz</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-Matlab函数freqs和freqz"/>
        <updated>2017-08-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文详细介绍了Matlab中两个用于分析滤波器频率响应的重要函数：`freqs`和`freqz`。文章首先讲解了`freqs`函数，它用于计算和绘制模拟滤波器（连续系统）的复频域响应，并给出了一个具体的传递函数示例。接着，文章介绍了`freqz`函数，该函数专门用于求解和绘制离散时间系统的频率响应特性，并说明了其不同的调用格式以及如何绘制幅频和相频特性曲线。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="matlab函数freqs和freqz"><a href="#matlab函数freqs和freqz" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Matlab函数freqs和freqz<!-- --> </h1>
<p>matlab中的freqs和freqz函数</p>
<h3 class="rp-toc-include" id="1freqs"><a href="#1freqs" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.freqs</h3>
<p>模拟滤波器的频率响应<br/>
语法：</p>
<div class="rp-codeblock language-matlab"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="matlab"><code><span class="line"><span style="color:var(--shiki-foreground)">    h = freqs(b,a,w)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [h,w] = freqs(b,a)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    [h,w] = freqs(b,a,f)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    freqs(b,a)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h4 class="rp-toc-include" id="11描述"><a href="#11描述" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.1描述</h4>
<p>freqs 返回一个模拟滤波器的H(jw)的复频域响应(拉普拉斯格式)</p>
<p><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAY8AAAA6BAAAAACocWdIAAAABGdBTUEAALGPC/xhBQAAAAJiS0dEAA86Mj6jAAAAB3RJTUUH5gcGBjgQlScB3gAABytJREFUaN7tml1sFFUUx4e2UNraro1JC5GvGBMIMSypD8Rg3MZExURYTYyaKNkSSTAY2YUSDDEwEJ/8iFsBhfiyUDQ8+LAlxkTlYVZ88HE3+EEMml2iUpGE2X7sTnenO8dz752POx/7MbDqQnqSTqdzzzn3/ubuzDn7BwHuDssL//cKFkAWQFrbFkBazVoD5K+7BGS4CYtoGkjlQh2HK1L1scytBvoHeVwQBmQAmSzZ0+H7xeQog/ap6aDxK5iPRcglmFyzDrL6tRvmKmrMzALpzLz9HTbT+AJRuuCLMKhJspjDXg6VLjyoSVUQTIez6x/gHDIJPHwzP5CNxSfZqspD48H6ICyQzszZhBCASR6uUZBCH6i9cI6e/+nlUOrDA45rgukwt2yam2oMz8viTB/kglqEXToa39AACAnUZ+YsFwAjjS+QfASUgBZia457kYYRgowLpkNBzGXJb5H+9Tz+/A75djkfgFMs5kWtFwRBCOsgojOnYgbqM3NumMVI4wtkIl6JJRQRtJHlgNN7kO5vSysiA0EH4pfLHqdDAXrsHH4I3gRlUTYVwhGWpxTidyTgymkGKmJl/+HhOOdGQNh98gcSE4SXYUaCongV4EkPh9NbUxEcpyDoQPxOwJbPzZnLHb8uhs0AN+HZJMxGyXgpPPuuVBeEBmLm6QO/BRwgs1H/IBvT1wdkTJxPXgIY93DYgR8ZOjFJOE79DsLDCXPm4iocIWclfCuUg2RcScw8wu7SvZ3VQWggnuW2lVc7QMpB3yBaB0AqjOkKg1nvZ3MQOJA88zP2Et8wMCXqIOfJJgSscbD7wT6oLANlFT4heEHQAzHzmDQT5dwICI/eIEi5E9hCtb0rEcntMH8PpEImSIr56UanS6Xn28lZZStcgfkAP27zs0D0G0YD8WwnZJKOHZn3D6L04PMexE/qQXgdYNTDIwAjCfMZGWV+/ALzUOwiz8g1Gd4CJcSP20E4y5uBmHk5HK3IdhAl5AUiCN2zghDH4ouWdaScDsD1/nQxDp3wPsA6D5AVc0sAxzGPTByoH7/AqfSRKLwGMCIIPTAd58drg9DAYrzcB2t/5kGwbk3HvUDmluJNj2LxJX/YiiY+oBsFof0QqBH4uF+EygYPkGNtIhnHyi5I6ED8bAssrVkL8CWUBQJySebHa4PQQDWiRGFoj+U2wdJ4gRSwOsSSWHzJH7aiadl2eiwmoYqx8eoOhSz7vRv82navi3waC2QqiC9ZGYsvtVOe6a7RW/B11enYeHUHjd1TNeEbRM9sM1saCySFZbsdsPiSomsrmtxCRBIvVZ2OjtdymKTHeh1/1cx2s6WxQI7gpxdfsptZ8eaL5h1hFsiwDMVu8ijR4k2Lpl6SqphRmlrDLJB2+pJFEFZ0W2eJPkFI7c6ECQAtunzRpG42qzn4X5sDhNTuMZE8I7To0qJ5R360ZnBNIxJg8aVFly+azFh/8G/ZbQtCBgjefDEmdJDiS4suXzSZzeJV7/6lCXb7gpCradSLr7v2no6Ad//SFMvcbgIXCCu+7tqrDQWhdv9isxt1PTTJto6mg7Di6669ykd9ULt/kTmtqTx0ZuXJkMtD29cWN1Svs+v7f7G+DzQAIrvvhaWhNa40/kRea7X6FzXJa00fxpfcDLg8vn1DWWqoXqVl+T05HyBOZQuA19AaB3lFrdO/nLNpTS+oPaWwy2OjrLUZqlchOiGdoEWooyGQc+5LnIbWMIgqaovt/YszaYjXmrTeuVAhTs4U3kN4DL9A6qpXLvs2vGQOMhDFmdUW7b5uaWgNg8wIQlvV/mXv8s+AaFq61nRtUaIUmo3nL3Mr7P8kgh6xlfj9W1e9jsMW6BXtIK59sUVffuq7rtKDvCPT0HyBnKRdpXf/omwuPkG+VRta0y5ttZKYTU89ak05Ku0kqpcmF7oN1esgPAP3pfUUuiBUBUSPhk3bLp7MOEAMka1ROQi/3cYkW/9i2XlZ7aKpda2puxJ0LEVdBRMJejaWMFQvL/MGMaK1DjkjTksOkHFfID9EaSfm3b/sIgq2AYK79twha7NYt1YUYYzIe6DeD3bVy7azemvnVLaM6FIPHINUmusBBYupMRB80WWnMNa7f1kBxZAJgh+7yX5umboSAq/Ssx+zFcmherl3xKlsGdGFMDyNg44dSfnaEd28+5cAXBUl4xlRQkqiKDnWlgdtUCXPyB5QJIfq5QaBKtG5RKUPNqkOkNFbAfHuX9bdHP5KIpoW05ry4lzasZTpD/7oeQ89ikQscqhe9UGM6LGsEoGed3gQ2RTZfP4bomf/crHtzG6iaelaU2nHoHMp82vWDyTR47SH6lUfxIg+AIUEDCXM64aGdisgNUxXnnbX9aguizWS32lGtuaBMOWplmRVT/VqJL/LjGzNA2HK04W6HjVUrwbyO83M1hL/YaAZtgDSarYA0mq2ANJqtgDSapb/Bw/qFjevXVrAAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDIyLTA3LTA1VDIyOjU2OjE2KzA4OjAwhR5JhwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyMi0wNy0wNVQyMjo1NjoxNiswODowMPRD8TsAAAAgdEVYdHNvZnR3YXJlAGh0dHBzOi8vaW1hZ2VtYWdpY2sub3JnvM8dnQAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABd0RVh0VGh1bWI6OkltYWdlOjpIZWlnaHQANTiee7ZsAAAAF3RFWHRUaHVtYjo6SW1hZ2U6OldpZHRoADM5OUf6LO4AAAAZdEVYdFRodW1iOjpNaW1ldHlwZQBpbWFnZS9wbmc/slZOAAAAF3RFWHRUaHVtYjo6TVRpbWUAMTY1NzAzMjk3NssS9a8AAAASdEVYdFRodW1iOjpTaXplADE4OTJCQp/WGWgAAABGdEVYdFRodW1iOjpVUkkAZmlsZTovLy9hcHAvdG1wL2ltYWdlbGMvaW1ndmlldzJfOV8xNjU0MDU0NDc0MTgxNzc3MF85MF9bMF2THYsiAAAAAElFTkSuQmCC"/></p>
<p>h = freqs(b, a, w) 根据系数向量计算返回模拟滤波器的复频域响应<br/>
freqs
计算在复平面虚轴上的频率响应h，角频率w确定了输入的实向量，因此必须包含至少一个频率点。<br/>
[h, w] = freqs(b, a) 自动挑选200个频率点来计算频率响应h<br/>
[h, w] = freqs(b, a, f) 挑选f个频率点来计算频率响应h</p>
<h4 class="rp-toc-include" id="12例子"><a href="#12例子" class="rp-header-anchor rp-link" aria-hidden="true">#</a>1.2例子</h4>
<p>找到并画出下面传递函数的频率响应
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMsAAAA3BAAAAABCMAyMAAAABGdBTUEAALGPC/xhBQAAAAJiS0dEAA86Mj6jAAAAB3RJTUUH5gcMBAIc1QGnhgAAAypJREFUWMPtlr9v00AUx68/IChVE5WlQqhKJ1oJBEViYSGZ2FDKHwAtYgDEjwaYGMD9A5DSiTUFBhYkBzYmU4m9EqpYU2hoRZdYtLVjnPjLu4uT2ImN6ivJlFN08d3lvY/v3b2XL0M/ms4GmP5hyqOVfmDumkv9wCSQ6gXGyczy/slwvjGOIdleLItZWlQ6rHazETF72Q/kY+2heaIxfm9l24uX7Enqt65VY36jIktGxKyo5jgwV3GG3Ym19daaFUeuBOTOYqjDajMqZr5k06uyK3ANnMviS0TpYBxFengdR9tbI3x6VMw0nBF64aka9dtDBWwVTD4t3PxOYjMtthWDs3gKrYXoGCY+TuUgDtxxUriHby1v5Ez4MycUGMr3o2PojApAvH7BYizWhbF/nYOufj0ihp+vfZq668/dyRxj/C5xTEpMTFQOJkvtheiYDJxj9LVRqmvYmSg1p4WbfTqbBeDtTWQ05/HUUXazXLHG6GwewdTMgqH5MNUEVmiGTWFae4b7/8bojKkZRtlXoUG9E/ND+bhkpA0KhqYr1XUfxpmxz+A2Mqo1QtXhpReT6N7Nch72cQq/yi1fdGBqmRnspVY5xro1CR8GX6jKXMTO3PALvKLb1looMjbWhZkvwaTr+k4Mfh4ymIdrXsxJqlwJOGkxsPI9wtQoESiZTUVkuTPeI0yV4s4U7Gkiy3G1R5h9uhWLKnSR5cAbPtdMs/+I0dO8QHKMyHK9R7tZVVAfFe5Fln/2/5DJtk5MTuOFnM6mkeVPexS0OcCgZDLyjSyfDTOJJp06MTkWMxnLwl4QWV4/H2YSTTp17abZbojeUMNMokmnUMy2iMmnUBOfdJLHOAp1thZq4pNOZVe3CSNv2816RzKq0yOdXIUm/tl8rei/oBIYVzqJ5io0ukAdmJZCk8a40klEyVVoqC22vTbCpye9NhExvHZ7pVNToZXp5YMVmhSGanegdHpAfbBCk8KI2o22NxfzR+EPgQpNChOi0Db4Q7BCk8KEKDTuOxus0GQwYQpNeA1WaDKYMIUmvAYrNBlMmEID1XYtWKHJYKTbADPADDADTH8wfwHqQUtWhkzDcQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAyMi0wNy0xMVQyMDowMjoyOCswODowMBDZC44AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMjItMDctMTFUMjA6MDI6MjgrMDg6MDBhhLMyAAAAIHRFWHRzb2Z0d2FyZQBodHRwczovL2ltYWdlbWFnaWNrLm9yZ7zPHZ0AAAAYdEVYdFRodW1iOjpEb2N1bWVudDo6UGFnZXMAMaf/uy8AAAAXdEVYdFRodW1iOjpJbWFnZTo6SGVpZ2h0ADU14MrK0QAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAAyMDN3LxSOAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADE2NTc1NDA5NDhPYw5DAAAAEXRFWHRUaHVtYjo6U2l6ZQA4NjdCQq75/JwAAABGdEVYdFRodW1iOjpVUkkAZmlsZTovLy9hcHAvdG1wL2ltYWdlbGMvaW1ndmlldzJfOV8xNjU3MTgzMjQ4MjgzNzI3N180M19bMF0X4BLVAAAAAElFTkSuQmCC"/></p>
<p>Matlab代码：</p>
<div class="rp-codeblock language-matlab"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="matlab"><code><span class="line"><span style="color:var(--shiki-foreground)">    a = [</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-constant)"> 0.4</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    b = [</span><span style="color:var(--shiki-token-constant)">0.2</span><span style="color:var(--shiki-token-constant)"> 0.3</span><span style="color:var(--shiki-token-constant)"> 1</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    w = logspace(-</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">, </span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    freqs(b, a, w);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>logspace
功能：生成从10的a次方到10的b次方之间按对数等分的n个元素的行向量<br/>
n如果省略，则默认值为50。</p>
<div class="rp-codeblock language-matlab"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="matlab"><code><span class="line"><span style="color:var(--shiki-foreground)">    h=freqs(b,a,w);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    mag = abs(h);phase = angle(h);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    subplot(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">,</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">,</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">), loglog(w,mag);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    subplot(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">,</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">,</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">), semilogx(w,phase);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    f = w/(</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">*</span><span style="color:var(--shiki-token-constant)">pi</span><span style="color:var(--shiki-foreground)">);mag = </span><span style="color:var(--shiki-token-constant)">20</span><span style="color:var(--shiki-foreground)">*log10(mag);phase = phase*</span><span style="color:var(--shiki-token-constant)">180</span><span style="color:var(--shiki-foreground)">/</span><span style="color:var(--shiki-token-constant)">pi</span><span style="color:var(--shiki-foreground)">;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><img alt="频率响应" src="/static/image/frequency.c675f30d1b.png"/></p>
<h3 class="rp-toc-include" id="2freqz"><a href="#2freqz" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.freqz</h3>
<p>MATLAB提供了专门用于求离散系统频响特性的函数freqz()<br/>
<img src="/static/image/freqz.ed5697c389.png"/>
调用freqz()的格式有以下两种：</p>
<h4 class="rp-toc-include" id="21hwfreqzban"><a href="#21hwfreqzban" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.1[H,w]=freqz(B,A,N)</h4>
<p>B和A分别为离散系统的系统函数分子、分母多项式的系数向量，N为正整数，返回量H则包含了离散系统频响
在
0------pi范围内N个频率等分点的值，向量w则包含范围内N个频率等分点。调用中若N默认，默认值为512。</p>
<h4 class="rp-toc-include" id="22hwfreqzbanwhole"><a href="#22hwfreqzbanwhole" class="rp-header-anchor rp-link" aria-hidden="true">#</a>2.2[H,w]=freqz(B,A,N,’whole’)</h4>
<p>该调用格式将计算离散系统在0---pi范内的N个频率等分店的频率响应的值。因此，可以先调用freqz()函数计算系统的频率响应，然后利用abs()和angle()函数及plot()函数，即可绘制出系统在
或 范围内的频响曲线。<br/>
例：绘制如下系统的频响曲线<br/>
H(z)=(z-0.5)/z<br/>
MATLAB命令如下：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>B=[1 -0.5];</span></span>
<span class="line"><span>A =[1 0];</span></span>
<span class="line"><span>[H,w]=freqz(B,A,400,&#x27;whole&#x27;);</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>H是频率响应的幅度，w是0---pi内的400个点</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>Hf=abs(H);</span></span>
<span class="line"><span>Hx=angle(H);</span></span>
<span class="line"><span>clf</span></span>
<span class="line"><span>figure(1)</span></span>
<span class="line"><span>plot(w,Hf)</span></span>
<span class="line"><span>title(&#x27;离散系统幅频特性曲线&#x27;)</span></span>
<span class="line"><span>figure(2)</span></span>
<span class="line"><span>plot(w,Hx)</span></span>
<span class="line"><span>title(&#x27;离散系统相频特性曲线&#x27;)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p><img src="/static/image/amp.16b2f93ea3.png"/>
<img src="/static/image/ang.d2cd50d5c4.png"/></p>
<p>这样画出来的是线性的，要想获得db格式的幅度，需要转换 20*log10（Hf）<br/>
之后再画就是db格式的<br/>
也可以直接用freqz(b,a,w)这样就会画出幅频响应和相频响应，幅频响应直接是db格式的幅度。</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[涉及PyQt5的一些命令]]></title>
        <id>/blog/2017/hexo-涉及PyQt5的一些命令</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-涉及PyQt5的一些命令"/>
        <updated>2017-08-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了几个与Python PyQt5开发相关的常用命令和技巧。内容涵盖了如何使用`pip`安装PyQt5库，如何利用`pyuic`工具将Qt Designer创建的`.ui`文件转换为Python代码（.py）。在控件使用方面，介绍了如何将`QLineEdit`设置为密码输入模式。最后，文章还讲解了如何使用`pyinstaller`工具将PyQt5应用程序打包成独立的可执行文件（.exe），并对`-F`、`-w`等常用打包参数的含义进行了解释。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="涉及pyqt5的一些命令"><a href="#涉及pyqt5的一些命令" class="rp-header-anchor rp-link" aria-hidden="true">#</a>涉及PyQt5的一些命令<!-- --> </h1>
<p>记录pyqt5中用到的几个命令
安装</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>pip install python-qt5</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>把ui转py</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>python -m PyQt5.uic.pyuic &lt;arguments&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>lineEdit输入隐藏，密码</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>lineEdit.setEchoMode(QtWidgets.QLineEdit.Password)</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>py转exe</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>pip install pyinstaller</span></span>
<span class="line"><span>pyinstaller demo.py</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>参数  含义</p>
<hr/>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>-F   指定打包后只生成一个exe格式的文件</span></span>
<span class="line"><span>-D   --onedir创建一个目录,包含exe文件,但会依赖很多文件（默认选项）</span></span>
<span class="line"><span>-c   --console,--nowindowed使用控制台,无界面(默认)</span></span>
<span class="line"><span>-F   指定打包后只生成一个exe格式的文件</span></span>
<span class="line"><span>-w   --windowed,--noconsole使用窗口,无控制台</span></span>
<span class="line"><span>-p   添加搜索路径,让其找到对应的库。</span></span>
<span class="line"><span>-i   改变生成程序的icon图标</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[自己写一个Android照相机应用-1]]></title>
        <id>/blog/2017/hexo-自己写一个Android照相机应用-1</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-自己写一个Android照相机应用-1"/>
        <updated>2017-08-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是开发自定义Android相机应用系列教程的第一部分，主要介绍了调用系统相机所需的基础知识。内容包括如何使用`Intent`配合`MediaStore.ACTION_IMAGE_CAPTURE`来启动系统相机程序。文章讲解了两种获取拍摄结果的方式：一种是通过`startActivityForResult`直接从返回的`Intent`数据中获取缩略图（Bitmap），另一种是指定一个文件URI作为输出路径（`MediaStore.EXTRA_OUTPUT`），然后从该文件中读取高清原图。此外，还提到了获取存储权限和处理`onActivityResult`回调的必要步骤。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="自己写一个android照相机应用-1"><a href="#自己写一个android照相机应用-1" class="rp-header-anchor rp-link" aria-hidden="true">#</a>自己写一个Android照相机应用-1<!-- --> </h1>
<p>Android相机的相关知识</p>
<h1 class="rp-toc-include" id="android-camera相关知识"><a href="#android-camera相关知识" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Android Camera相关知识<!-- --> </h1>
<p>调用系统相机</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-keyword)">Intent</span><span style="color:var(--shiki-foreground)"> intent </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> Intent(</span><span style="color:var(--shiki-token-constant)">MediaStore</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">ACTION_IMAGE_CAPTURE</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">//使用action启动系统相机</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">//startActivity(intent);    </span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">//仅调用相机拍照，不返回数据</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">//startActivityForResult(intent,REQ_1);</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">//调用相机并通过onActivityResult函数data返回数据；</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">Uri</span><span style="color:var(--shiki-foreground)"> photoUri </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> Uri</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">fromFile</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">new</span><span style="color:var(--shiki-token-function)"> File(mFilePath)</span><span style="color:var(--shiki-foreground)">);</span><span style="color:var(--shiki-token-comment)">//图片保存路径</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">intent</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">putExtra</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">MediaStore</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">EXTRA_OUTPUT</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">photoUri);</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">startActivityForResult(intent</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">REQ_2)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">//从文件中读取数据</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>路径获取</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-foreground)">mFilePath </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> Environment</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getExternalStorageDirectory</span><span style="color:var(--shiki-foreground)">()</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getPath</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">mFilePath </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> mFilePath </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-string-expression)"> &quot;/&quot;</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-string-expression)"> &quot;tmp.png&quot;</span><span style="color:var(--shiki-foreground)">;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>读取内存卡权限</p>
<div class="rp-codeblock language-xml"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="xml"><code><span class="line"><span style="color:var(--shiki-foreground)">    &lt;</span><span style="color:var(--shiki-token-string-expression)">uses-permission</span><span style="color:var(--shiki-token-function)"> android</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-function)">name</span><span style="color:var(--shiki-foreground)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;android.permission.WRITE_EXTERNAL_STORAGE&quot;</span><span style="color:var(--shiki-foreground)">&gt;&lt;/</span><span style="color:var(--shiki-token-string-expression)">uses-permission</span><span style="color:var(--shiki-foreground)">&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>onActivityResult函数</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-keyword)">protected</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> onActivityResult(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-token-function)"> requestCode</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-token-function)"> resultCode</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> Intent</span><span style="color:var(--shiki-token-function)"> data)</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    super</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">onActivityResult</span><span style="color:var(--shiki-foreground)">(requestCode</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> resultCode</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> data);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    if</span><span style="color:var(--shiki-foreground)">(resultCode </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-foreground)"> RESULT_OK){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)"> (requestCode </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-foreground)"> REQ_1) {</span><span style="color:var(--shiki-token-comment)">//从data获取照片</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            Bundle</span><span style="color:var(--shiki-foreground)"> bundle </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> data</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getExtras</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            Bitmap</span><span style="color:var(--shiki-foreground)"> bitmap </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> (Bitmap)</span><span style="color:var(--shiki-token-constant)">bundle</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">get</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;data&quot;</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">            mImageView</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">setImageBitmap</span><span style="color:var(--shiki-foreground)">(bitmap);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        } </span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-token-keyword)"> if</span><span style="color:var(--shiki-foreground)"> (requestCode </span><span style="color:var(--shiki-token-keyword)">==</span><span style="color:var(--shiki-foreground)"> REQ_2) {</span><span style="color:var(--shiki-token-comment)">//从文件获取照片</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            FileInputStream</span><span style="color:var(--shiki-foreground)"> fis </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> null</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            try</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                fis </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> FileInputStream(mFilePath)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                Bitmap</span><span style="color:var(--shiki-foreground)"> bitmap </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> BitmapFactory</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">decodeStream</span><span style="color:var(--shiki-foreground)">(fis);</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                mImageView</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">setImageBitmap</span><span style="color:var(--shiki-foreground)">(bitmap);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            } </span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">FileNotFoundException</span><span style="color:var(--shiki-foreground)"> e) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                e</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">printStackTrace</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            } </span><span style="color:var(--shiki-token-keyword)">finally</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                try</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    fis</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">close</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                } </span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">IOException</span><span style="color:var(--shiki-foreground)"> e) {</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    e</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">printStackTrace</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>注册action，实现照相功能</p>
<div class="rp-codeblock language-xml"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="xml"><code><span class="line"><span style="color:var(--shiki-foreground)">    &lt;</span><span style="color:var(--shiki-token-string-expression)">intent-filter</span><span style="color:var(--shiki-foreground)">&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            &lt;</span><span style="color:var(--shiki-token-string-expression)">action</span><span style="color:var(--shiki-token-function)"> android</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-function)">name</span><span style="color:var(--shiki-foreground)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;android.media.action.IMAGE_CAPTURE&quot;</span><span style="color:var(--shiki-foreground)">/&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            &lt;</span><span style="color:var(--shiki-token-string-expression)">category</span><span style="color:var(--shiki-token-function)"> android</span><span style="color:var(--shiki-token-punctuation)">:</span><span style="color:var(--shiki-token-function)">name</span><span style="color:var(--shiki-foreground)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;android.intent.category.DEFAULT&quot;</span><span style="color:var(--shiki-foreground)">/&gt;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    &lt;/</span><span style="color:var(--shiki-token-string-expression)">intent-filter</span><span style="color:var(--shiki-foreground)">&gt;</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[搬瓦工VPS搭建Web服务器]]></title>
        <id>/blog/2017/hexo-搬瓦工VPS搭建Web服务器</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-搬瓦工VPS搭建Web服务器"/>
        <updated>2017-08-04T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文是一篇在搬瓦工（Bandwagon Host）的CentOS VPS上搭建Web服务器的教程。文章详细记录了安装Apache、PHP和MySQL（LAMP环境）的全过程。内容包括使用`yum`命令分别安装httpd、php及其常用组件、mysql-server等软件包，以及如何使用`service`命令启动、停止和重启各项服务。此外，还介绍了如何通过`chkconfig`命令将服务设置为开机自启动，并讲解了如何为MySQL的root账户设置初始密码，为搭建一个完整的网站运行环境提供了清晰的步骤指导。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="搬瓦工vps搭建web服务器"><a href="#搬瓦工vps搭建web服务器" class="rp-header-anchor rp-link" aria-hidden="true">#</a>搬瓦工VPS搭建Web服务器<!-- --> </h1>
<p>记录在centos上安装apache+php+mysql<br/>
搬瓦工VPS<a href="https://bandwagonhost.com/aff.php?aff=17697" target="_blank" rel="noopener noreferrer" class="rp-link">购买地址</a></p>
<h1 class="rp-toc-include" id="安装apache"><a href="#安装apache" class="rp-header-anchor rp-link" aria-hidden="true">#</a>安装apache<!-- --> </h1>
<p>安装<code>yum install httpd</code><br/>
启动<code>service httpd start</code><br/>
暂停<code>service httpd stop</code><br/>
重启<code>service httpd restart</code></p>
<p>检查开机启动情况<code>chkconfig --list httpd</code><br/>
默认情况下是全部关闭的，尽量设置开机启动，以防主机意外关机</p>
<p>设置开机启动命令<code>chkconfig httpd on</code><br/>
再次检查启动情况，看到2，3，4，5为启动<br/>
关闭开机启动命令<code>chkconfig httpd off</code></p>
<p>到此Apache安装完成，在自己浏览器中输入主机IP和端口号能正常打开</p>
<h1 class="rp-toc-include" id="安装php"><a href="#安装php" class="rp-header-anchor rp-link" aria-hidden="true">#</a>安装php<!-- --> </h1>
<p>命令为:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>yum install php</span></span>
<span class="line"><span>yum install php-mysql  php-gd  php-imap  php-ldap  php-odbc php-pear  php-xml  php-xmlrpc</span></span>
<span class="line"><span>yum install php-mysql</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>以上命令为安装php及其支持的组件</p>
<h1 class="rp-toc-include" id="安装mysql"><a href="#安装mysql" class="rp-header-anchor rp-link" aria-hidden="true">#</a>安装mysql<!-- --> </h1>
<h2 class="rp-toc-include" id="安装"><a href="#安装" class="rp-header-anchor rp-link" aria-hidden="true">#</a>安装</h2>
<hr/>
<p>首先查看主机是否已经安装<code>rpm -qa|grep mysql</code><br/>
注意：可能检查中安装有php-mysql XXXXX 和
mysql-libXXXX,这是刚刚第二步安装的php的组件,不必理会</p>
<p>已经安装的话就执行删除命令<code>rpm -e mysql</code></p>
<p>然后继续安装<br/>
使用命令yum list | grep mysql<br/>
来查看yum上提供的mysql数据库可下载的版本</p>
<p>安装命令<code>yum install -y mysql-server mysql mysql-devel</code><br/>
等待一段时间安装成功</p>
<h2 class="rp-toc-include" id="配置"><a href="#配置" class="rp-header-anchor rp-link" aria-hidden="true">#</a>配置</h2>
<hr/>
<p>接下来是对mysql的配置(注意:命令中是&quot;mysqld&quot;,不是mysql)<br/>
初始化:<code>service mysqld start</code><br/>
重启:<code>service mysqld restart</code><br/>
配置开机自动启动:<code>chkconfig mysqld on</code></p>
<p>为mysql的root账户设置密码:<code>mysqladmin -u root password &#x27;*********&#x27;</code><br/>
登录命令<code>mysql -u root -p</code></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[Python2与Python3共存]]></title>
        <id>/blog/2017/hexo-Python2与Python3共存</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-Python2与Python3共存"/>
        <updated>2017-08-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文详细介绍了在Windows操作系统下如何安装并配置Python 2和Python 3，以实现两个版本的和谐共存。主要步骤包括：将不同版本的Python安装到不同的目录下，正确配置系统环境变量（Path），将各自安装目录下的`python.exe`重命名为`python2.exe`和`python3.exe`以便区分调用，最后通过强制重新安装pip来解决两个版本的包管理工具冲突问题，确保`pip2`和`pip3`能够正常使用。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="python2与python3共存"><a href="#python2与python3共存" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Python2与Python3共存<!-- --> </h1>
<p>在windows下安装多个版本的python</p>
<h1 class="rp-toc-include" id="安装两个版本的python"><a href="#安装两个版本的python" class="rp-header-anchor rp-link" aria-hidden="true">#</a>安装两个版本的Python<!-- --> </h1>
<p>选择想要安装的版本下载例如:<br/>
python2下载地址:<a href="https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.python.org/ftp/python/2.7.13/python-2.7.13.msi</a><br/>
python3下载地址:<a href="https://www.python.org/ftp/python/3.6.2/python-3.6.2.exe" target="_blank" rel="noopener noreferrer" class="rp-link">https://www.python.org/ftp/python/3.6.2/python-3.6.2.exe</a></p>
<p>进行安装(安装顺序随便)<br/>
尽量安装到同一目录下的两个文件夹例如:<br/>
python2安装在&quot;D:\program\python27\&quot;下<br/>
python3安装在&quot;D:\program\python36\&quot;下</p>
<h1 class="rp-toc-include" id="添加环境变量"><a href="#添加环境变量" class="rp-header-anchor rp-link" aria-hidden="true">#</a>添加环境变量<!-- --> </h1>
<p>Path中要有一下四个路径</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>D:\program\python\Python36\Scripts\</span></span>
<span class="line"><span>D:\program\python\Python36\</span></span>
<span class="line"><span>D:\program\python\python27\Scripts</span></span>
<span class="line"><span>D:\program\python\python27\</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<h1 class="rp-toc-include" id="更改pythonexe名字"><a href="#更改pythonexe名字" class="rp-header-anchor rp-link" aria-hidden="true">#</a>更改python.exe名字<!-- --> </h1>
<p>找到找到两个python的安装目录<br/>
<code>D:\program\python\Python36\python.exe</code><br/>
更改为<br/>
<code>D:\program\python\Python36\python3.exe</code><br/>
<code>D:\program\python\Python27\python.exe</code><br/>
更改为<br/>
<code>D:\program\python\Python36\python2.exe</code><br/>
此时两个版本的python已经共同存在<br/>
但还要对pip进行修改</p>
<h1 class="rp-toc-include" id="更改pip名称"><a href="#更改pip名称" class="rp-header-anchor rp-link" aria-hidden="true">#</a>更改pip名称<!-- --> </h1>
<p>重装python2和python3的pip</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>python2 -m pip install --upgrade pip --force-reinstall</span></span>
<span class="line"><span>python3 -m pip install --upgrade pip --force-reinstall</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>重装成功后进行如下测试<br/>
test.PNG...<br/>
可见python2和python3已经共存<br/>
pip的问题也解决了<br/>
但直接调用pip是还能执行并且是后安装的pip的版本<br/>
python命令已经不存在<br/>
直接运行py结尾的文件时会出现问题<br/>
python自带的编辑器出现了两个</p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[搬瓦工安装ss并加速]]></title>
        <id>/blog/2017/hexo-搬瓦工安装ss并加速</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-搬瓦工安装ss并加速"/>
        <updated>2017-08-03T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了在搬瓦工（Bandwagon Host）VPS上安装并优化Shadowsocks（SS）的几种方法。文章首先不推荐使用搬瓦工后台自带的一键安装，因为它速度较慢。接着，重点推荐使用shell脚本进行安装，并分别给出了安装ShadowsocksR（速度快，推荐）和Shadowsocks-Go版本的命令。此外，还涵盖了服务的启动、停止、重启等管理命令，修改配置文件以支持多用户的方法，以及解决CentOS默认未安装wget等常见问题的步骤。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="搬瓦工安装ss并加速"><a href="#搬瓦工安装ss并加速" class="rp-header-anchor rp-link" aria-hidden="true">#</a>搬瓦工安装ss并加速<!-- --> </h1>
<p>通过搬瓦工的VPS安装ss的几种方法</p>
<p>搬瓦工（BandwagonHost）是美国IT7公司旗下的一家提供便宜年付OVZ架构的VPS主机方案的服务商。价格便宜、且依托的商家比较靠谱，具有较高的性价比。拿来搭个FQ是非常合适的，做个小站也是可以的。</p>
<p>1.购买地址</p>
<blockquote>
<p>搬瓦工所有配置及购买地址:<a href="https://bandwagonhost.com/aff.php?aff=17697" target="_blank" rel="noopener noreferrer" class="rp-link">https://bandwagonhost.com/aff.php?aff=17697</a>
以前有小内存的VPS年费三刀，很便宜，但现在没有了，缺货，连521M的有时候也会缺货，看来挺火的。</p>
</blockquote>
<p>2.安装Shadowsocks</p>
<p>2.1搬瓦工后台一键安装(不推荐)</p>
<p>登录账号-&gt;Client Area-&gt;Services-&gt;My Services-&gt;KiwiVM Control Panel<br/>
来到管理面板，点击 Shadowsocks Server 就可以一键安装 Shadowsocks<br/>
测试过它自带的一键安装，速度太慢，yotube视频看不了，有点慢。</p>
<p>2.2使用shell脚本安装(推荐)</p>
<p>2.2.1安装 shadowsoksR</p>
<p>Shadowsocks的一个分支，比较不错。但是默认是 aes-256-cfb 加密，如果需要
chacha20 加密，需要手动切换。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocksR.sh</span></span>
<span class="line"><span>chmod +x shadowsocksR.sh</span></span>
<span class="line"><span>./shadowsocksR.sh 2&gt;&amp;1 | tee shadowsocksR.log</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>安装成功需要等几分钟<br/>
这个速度可以看yotube无压力</p>
<p>卸载方法：<br/>
使用 root 用户登录，运行以下命令：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>./shadowsocksR.sh uninstall</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>安装完成后即已后台启动 ShadowsocksR,运行：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>/etc/init.d/shadowsocks status</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>可以查看 ShadowsocksR 进程是否已经启动。<br/>
本脚本安装完成后，已将 ShadowsocksR 自动加入开机自启动。</p>
<p>其它命令：<br/>
启动：/etc/init.d/shadowsocks start<br/>
停止：/etc/init.d/shadowsocks stop<br/>
重启：/etc/init.d/shadowsocks restart<br/>
状态：/etc/init.d/shadowsocks status</p>
<p>配置文件路径：/etc/shadowsocks.json<br/>
日志文件路径：/var/log/shadowsocks.log<br/>
代码安装目录：/usr/local/shadowsocks</p>
<p>2.2.2安装 shadowsocks-go版本</p>
<p>据说有buff，比python版Shadowsocks要快：</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-go.sh</span></span>
<span class="line"><span>chmod +x shadowsocks-go.sh</span></span>
<span class="line"><span>./shadowsocks-go.sh 2&amp;gt;&amp;amp;1 | tee shadowsocks-go.log</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2.2.3其他版本Shadowsocks一键安装：</p>
<p>来自 teddysun：<a href="https://github.com/teddysun/shadowsocks_install" target="_blank" rel="noopener noreferrer" class="rp-link">https://github.com/teddysun/shadowsocks_install</a></p>
<p>3.遇到的一些问题</p>
<p>3.1搬瓦工默认系统Centos没有wget命令需要安装</p>
<p>安装命令:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>yum -y install wget</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>3.2关于配置多用户</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>vi /etc/shadowsocks.json</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>只需要在port_password项下添加&quot;端口号&quot;:&quot;密码&quot;</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>{</span></span>
<span class="line"><span>    &quot;server&quot;:&quot;0.0.0.0&quot;,</span></span>
<span class="line"><span>    &quot;server_ipv6&quot;:&quot;[::]&quot;,</span></span>
<span class="line"><span>    &quot;local_address&quot;:&quot;127.0.0.1&quot;,</span></span>
<span class="line"><span>    &quot;local_port&quot;:1080,</span></span>
<span class="line"><span>    &quot;port_password&quot;:{</span></span>
<span class="line"><span>        &quot;12345&quot;: &quot;123456&quot;,</span></span>
<span class="line"><span>        &quot;23456&quot;: &quot;123456&quot;</span></span>
<span class="line"><span>    },</span></span>
<span class="line"><span>    &quot;timeout&quot;:120,</span></span>
<span class="line"><span>    &quot;method&quot;:&quot;aes-256-cfb&quot;,</span></span>
<span class="line"><span>    &quot;protocol&quot;:&quot;origin&quot;,</span></span>
<span class="line"><span>    &quot;protocol_param&quot;:&quot;&quot;,</span></span>
<span class="line"><span>    &quot;obfs&quot;:&quot;plain&quot;,</span></span>
<span class="line"><span>    &quot;obfs_param&quot;:&quot;&quot;,</span></span>
<span class="line"><span>    &quot;redirect&quot;:&quot;&quot;,</span></span>
<span class="line"><span>    &quot;dns_ipv6&quot;:false,</span></span>
<span class="line"><span>    &quot;fast_open&quot;:false,</span></span>
<span class="line"><span>    &quot;workers&quot;:1</span></span>
<span class="line"><span>}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>参考资料</p>
<p>1.<a href="https://blog.kuoruan.com/48.html" target="_blank" rel="noopener noreferrer" class="rp-link">https://blog.kuoruan.com/48.html</a></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[JAVA实现MD5加密]]></title>
        <id>/blog/2017/hexo-JAVA实现MD5加密</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-JAVA实现MD5加密"/>
        <updated>2017-07-02T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文介绍了在Java中实现MD5加密的两种不同方法。第一种方法是调用Java自带的`java.security.MessageDigest`类，通过几行简单的代码即可快速生成32位或16位的MD5摘要。第二种方法则是从零开始，详细地编写了一个完整的MD5算法实现，包括对幻数、常量、分组处理、四轮循环运算等核心逻辑的逐步讲解，让读者能够深入理解MD5加密算法的内部工作原理。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="java实现md5加密"><a href="#java实现md5加密" class="rp-header-anchor rp-link" aria-hidden="true">#</a>JAVA实现MD5加密<!-- --> </h1>
<p>java实现MD5加密的两种方法</p>
<p>1,调用MessageDigest实现</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">security</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">MessageDigest</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">import</span><span style="color:var(--shiki-token-keyword)"> java</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">security</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-keyword)">NoSuchAlgorithmException</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">public</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-token-function)"> CreatMD5</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> String</span><span style="color:var(--shiki-token-function)"> getMd5</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">String</span><span style="color:var(--shiki-foreground)"> plainText){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        try</span><span style="color:var(--shiki-foreground)"> {  </span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            MessageDigest</span><span style="color:var(--shiki-foreground)"> md </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> MessageDigest</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getInstance</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;MD5&quot;</span><span style="color:var(--shiki-foreground)">);  </span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">            md</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">update</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">plainText</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getBytes</span><span style="color:var(--shiki-foreground)">());  </span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            byte</span><span style="color:var(--shiki-foreground)"> b[] </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> md</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">digest</span><span style="color:var(--shiki-foreground)">();  </span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            int</span><span style="color:var(--shiki-foreground)"> i;  </span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            StringBuffer</span><span style="color:var(--shiki-foreground)"> buf </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-keyword)"> new</span><span style="color:var(--shiki-token-function)"> StringBuffer(</span><span style="color:var(--shiki-token-string-expression)">&quot;&quot;</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;  </span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> offset </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">; offset </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)"> b</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">length</span><span style="color:var(--shiki-foreground)">; offset</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">) {  </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                i </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> b[offset];  </span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                if</span><span style="color:var(--shiki-foreground)"> (i </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-foreground)">)  </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    i </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-token-constant)"> 256</span><span style="color:var(--shiki-foreground)">;  </span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                if</span><span style="color:var(--shiki-foreground)"> (i </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-foreground)">)  </span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                    buf</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;0&quot;</span><span style="color:var(--shiki-foreground)">);  </span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">                buf</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">append</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">Integer</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">toHexString</span><span style="color:var(--shiki-foreground)">(i));  </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }  </span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //32位加密  </span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            return</span><span style="color:var(--shiki-token-constant)"> buf</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">toString</span><span style="color:var(--shiki-foreground)">();  </span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            // 16位的加密  </span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">            //return buf.toString().substring(8, 24);  </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        } </span><span style="color:var(--shiki-token-keyword)">catch</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">NoSuchAlgorithmException</span><span style="color:var(--shiki-foreground)"> e) {  </span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">            e</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">printStackTrace</span><span style="color:var(--shiki-foreground)">();  </span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            return</span><span style="color:var(--shiki-token-constant)"> null</span><span style="color:var(--shiki-foreground)">;  </span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">String</span><span style="color:var(--shiki-foreground)">[] args) {</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        // TODO Auto-generated method stub</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        CreatMD5</span><span style="color:var(--shiki-foreground)"> md</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-function)"> CreatMD5()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        System</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-constant)">md</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getMd5</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;hello&quot;</span><span style="color:var(--shiki-foreground)">));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>2,自己编写函数实现</p>
<div class="rp-codeblock language-java"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="java"><code><span class="line"><span style="color:var(--shiki-token-keyword)">public</span><span style="color:var(--shiki-token-keyword)"> class</span><span style="color:var(--shiki-token-function)"> CreateMD5i</span><span style="color:var(--shiki-foreground)"> {</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> String</span><span style="color:var(--shiki-foreground)"> hexs[]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{</span><span style="color:var(--shiki-token-string-expression)">&quot;0&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;1&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;2&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;3&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;4&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;5&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;6&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;7&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;8&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;9&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;A&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;B&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;C&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;D&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;E&quot;</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-string-expression)">&quot;F&quot;</span><span style="color:var(--shiki-foreground)">};</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //标准的幻数</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> A</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0x67452301L</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> B</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0xefcdab89L</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> C</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0x98badcfeL</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> D</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0x10325476L</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //下面这些S11-S44实际上是一个4*4的矩阵，在四轮循环运算中用到</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S11 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 7</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S12 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 12</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S13 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 17</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S14 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 22</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S21 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 5</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S22 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 9</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S23 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 14</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S24 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 20</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S31 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 4</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S32 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 11</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S33 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 16</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S34 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 23</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S41 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 6</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S42 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 10</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S43 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 15</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    static</span><span style="color:var(--shiki-token-keyword)"> final</span><span style="color:var(--shiki-token-keyword)"> int</span><span style="color:var(--shiki-foreground)"> S44 </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)"> 21</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    //java不支持无符号的基本数据（unsigned）</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> [] result</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">{A</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">B</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">C</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)">D};</span><span style="color:var(--shiki-token-comment)">//存储hash结果，共4×32=128位，初始化值为（幻数的级联）</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> main</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">String</span><span style="color:var(--shiki-foreground)"> []args){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        CreateMD5i</span><span style="color:var(--shiki-foreground)"> md</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-function)"> CreateMD5i()</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-constant)">        System</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">out</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">println</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;md5(hello)=&quot;</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">md</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">digest</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-string-expression)">&quot;hello&quot;</span><span style="color:var(--shiki-foreground)">));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> String</span><span style="color:var(--shiki-token-function)"> digest</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">String</span><span style="color:var(--shiki-foreground)"> inputStr){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        byte</span><span style="color:var(--shiki-foreground)"> [] inputBytes</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">inputStr</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-function)">getBytes</span><span style="color:var(--shiki-foreground)">();</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> byteLen</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">inputBytes</span><span style="color:var(--shiki-token-punctuation)">.</span><span style="color:var(--shiki-token-constant)">length</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//长度（字节）</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> groupCount</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//完整分组的个数</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        groupCount</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">byteLen</span><span style="color:var(--shiki-token-keyword)">/</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//每组512位（64字节）</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        long</span><span style="color:var(--shiki-foreground)"> []groups</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">null</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//每个小组(64字节)再细分后的16个小组(4字节)</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //处理每一个完整 分组</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> step</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;step</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)">groupCount;step</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            groups</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">divGroup(inputBytes</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)">step</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            trans(groups)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//处理分组，核心算法</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //处理完整分组后的尾巴</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        int</span><span style="color:var(--shiki-foreground)"> rest</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">byteLen</span><span style="color:var(--shiki-token-keyword)">%</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//512位分组后的余数</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        byte</span><span style="color:var(--shiki-foreground)"> [] tempBytes</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-keyword)"> byte</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        if</span><span style="color:var(--shiki-foreground)">(rest</span><span style="color:var(--shiki-token-keyword)">&lt;=</span><span style="color:var(--shiki-token-constant)">56</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)">rest;i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                tempBytes[i]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">inputBytes[byteLen</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">rest</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">i];</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            if</span><span style="color:var(--shiki-foreground)">(rest</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">56</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                tempBytes[rest]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">byte</span><span style="color:var(--shiki-foreground)">)(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">56</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">rest;i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                    tempBytes[rest</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">i]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            long</span><span style="color:var(--shiki-foreground)"> len</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)">)(byteLen</span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                tempBytes[</span><span style="color:var(--shiki-token-constant)">56</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">i]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">byte</span><span style="color:var(--shiki-foreground)">)(len</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFL</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                len</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">len</span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            groups</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">divGroup(tempBytes</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            trans(groups)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//处理分组</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span><span style="color:var(--shiki-token-keyword)">else</span><span style="color:var(--shiki-foreground)">{</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-foreground)">rest;i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                tempBytes[i]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">inputBytes[byteLen</span><span style="color:var(--shiki-token-keyword)">-</span><span style="color:var(--shiki-foreground)">rest</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">i];</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            tempBytes[rest]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">byte</span><span style="color:var(--shiki-foreground)">)(</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">rest</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">64</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                tempBytes[i]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            groups</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">divGroup(tempBytes</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            trans(groups)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//处理分组</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">56</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">)</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                tempBytes[i]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            long</span><span style="color:var(--shiki-foreground)"> len</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)">)(byteLen</span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                tempBytes[</span><span style="color:var(--shiki-token-constant)">56</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">i]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">byte</span><span style="color:var(--shiki-foreground)">)(len</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFL</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                len</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">len</span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            groups</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">divGroup(tempBytes</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-function)">            trans(groups)</span><span style="color:var(--shiki-foreground)">;</span><span style="color:var(--shiki-token-comment)">//处理分组</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        //将Hash值转换成十六进制的字符串</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        String</span><span style="color:var(--shiki-foreground)"> resStr</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-string-expression)">&quot;&quot;</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        long</span><span style="color:var(--shiki-foreground)"> temp</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> j</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;j</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-foreground)">;j</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                temp</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">result[i]</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0x0FL</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">                String</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">hexs[(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">)(temp)];</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                result[i]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">result[i]</span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                temp</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">result[i]</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0x0FL</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                resStr</span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)">hexs[(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)">)(temp)]</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)">a;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                result[i]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">result[i]</span><span style="color:var(--shiki-token-keyword)">&gt;&gt;</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> resStr;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    /**</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     * 从inputBytes的index开始取512位，作为新的分组</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     * 将每一个512位的分组再细分成16个小组，每个小组64位（8个字节）</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     * </span><span style="color:var(--shiki-token-keyword)">@param</span><span style="color:var(--shiki-token-comment)"> inputBytes</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     * </span><span style="color:var(--shiki-token-keyword)">@param</span><span style="color:var(--shiki-token-comment)"> index</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     * </span><span style="color:var(--shiki-token-keyword)">@return</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     */</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)">[] </span><span style="color:var(--shiki-token-function)">divGroup</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">byte</span><span style="color:var(--shiki-foreground)">[] inputBytes</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> index){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        long</span><span style="color:var(--shiki-foreground)"> [] temp</span><span style="color:var(--shiki-token-keyword)">=new</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)">[</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        for</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">int</span><span style="color:var(--shiki-foreground)"> i</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-foreground)">;i</span><span style="color:var(--shiki-token-keyword)">++</span><span style="color:var(--shiki-foreground)">){</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">            temp[i]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)">b2iu(inputBytes[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">i</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-function)">index])</span><span style="color:var(--shiki-token-keyword)">|</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                (</span><span style="color:var(--shiki-token-function)">b2iu(inputBytes[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">i</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-function)">index])</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-keyword)">|</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                (</span><span style="color:var(--shiki-token-function)">b2iu(inputBytes[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">i</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-function)">index])</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)">16</span><span style="color:var(--shiki-token-keyword)">|</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">                (</span><span style="color:var(--shiki-token-function)">b2iu(inputBytes[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-keyword)">*</span><span style="color:var(--shiki-token-function)">i</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-token-function)">index])</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-token-constant)">24</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        }</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> temp;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    /**</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     * 这时不存在符号位（符号位存储不再是代表正负），所以需要处理一下</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     * </span><span style="color:var(--shiki-token-keyword)">@param</span><span style="color:var(--shiki-token-comment)"> b</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     * </span><span style="color:var(--shiki-token-keyword)">@return</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     */</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    public</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-token-function)"> b2iu</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">byte</span><span style="color:var(--shiki-foreground)"> b){</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">&lt;</span><span style="color:var(--shiki-token-constant)"> 0</span><span style="color:var(--shiki-token-keyword)"> ?</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)"> 0x7F</span><span style="color:var(--shiki-token-keyword)"> +</span><span style="color:var(--shiki-token-constant)"> 128</span><span style="color:var(--shiki-token-keyword)"> :</span><span style="color:var(--shiki-foreground)"> b;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">     }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    /**</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     * 主要的操作，四轮循环</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     * </span><span style="color:var(--shiki-token-keyword)">@param</span><span style="color:var(--shiki-token-comment)"> groups[]--每一个分组512位（64字节）</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     */</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> void</span><span style="color:var(--shiki-token-function)"> trans</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)">[] groups) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        long</span><span style="color:var(--shiki-foreground)"> a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> result[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> result[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> result[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-foreground)"> d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> result[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">];</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        /*第一轮*/</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xd76aa478L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 1 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xe8c7b756L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 2 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x242070dbL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 3 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xc1bdceeeL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 4 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xf57c0fafL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 5 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x4787c62aL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 6 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">6</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xa8304613L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 7 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xfd469501L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 8 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x698098d8L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 9 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">9</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x8b44f7afL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 10 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xffff5bb1L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 11 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">11</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x895cd7beL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 12 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S11</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x6b901122L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 13 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S12</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xfd987193L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 14 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S13</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xa679438eL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 15 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> FF(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S14</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x49b40821L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 16 */</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        /*第二轮*/</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xf61e2562L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 17 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">6</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xc040b340L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 18 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">11</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x265e5a51L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 19 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xe9b6c7aaL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 20 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xd62f105dL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 21 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x2441453L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 22 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xd8a1e681L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 23 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xe7d3fbc8L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 24 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">9</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x21e1cde6L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 25 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xc33707d6L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 26 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xf4d50d87L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 27 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x455a14edL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 28 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S21</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xa9e3e905L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 29 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S22</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xfcefa3f8L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 30 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S23</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x676f02d9L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 31 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> GG(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S24</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x8d2a4c8aL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 32 */</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        /*第三轮*/</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xfffa3942L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 33 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x8771f681L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 34 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">11</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x6d9d6122L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 35 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xfde5380cL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 36 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xa4beea44L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 37 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x4bdecfa9L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 38 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xf6bb4b60L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 39 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xbebfbc70L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 40 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x289b7ec6L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 41 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xeaa127faL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 42 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xd4ef3085L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 43 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">6</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x4881d05L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 44 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">9</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S31</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xd9d4d039L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 45 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S32</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xe6db99e5L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 46 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S33</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x1fa27cf8L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 47 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> HH(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S34</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xc4ac5665L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 48 */</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        /*第四轮*/</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xf4292244L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 49 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">7</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x432aff97L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 50 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">14</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xab9423a7L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 51 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">5</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xfc93a039L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 52 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">12</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x655b59c3L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 53 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x8f0ccc92L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 54 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">10</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xffeff47dL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 55 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x85845dd1L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 56 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">8</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x6fa87e4fL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 57 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">15</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xfe2ce6e0L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 58 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">6</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xa3014314L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 59 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">13</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x4e0811a1L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 60 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">4</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S41</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xf7537e82L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 61 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        d </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">11</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S42</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xbd3af235L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 62 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        c </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S43</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0x2ad7d2bbL</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 63 */</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        b </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-token-function)"> II(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> groups[</span><span style="color:var(--shiki-token-constant)">9</span><span style="color:var(--shiki-token-function)">]</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> S44</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-constant)"> 0xeb86d391L</span><span style="color:var(--shiki-token-function)">)</span><span style="color:var(--shiki-foreground)">; </span><span style="color:var(--shiki-token-comment)">/* 64 */</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">        /*加入到之前计算的结果当中*/</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        result[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> a;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        result[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> b;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        result[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> c;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        result[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">] </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> d;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        result[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">result[</span><span style="color:var(--shiki-token-constant)">0</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        result[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">result[</span><span style="color:var(--shiki-token-constant)">1</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        result[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">result[</span><span style="color:var(--shiki-token-constant)">2</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        result[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)">result[</span><span style="color:var(--shiki-token-constant)">3</span><span style="color:var(--shiki-foreground)">]</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-comment)">    /**</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     * 下面是处理要用到的线性函数</span></span>
<span class="line"><span style="color:var(--shiki-token-comment)">     */</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-token-function)"> F</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> y</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> z) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> (x </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> y) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> ((</span><span style="color:var(--shiki-token-keyword)">~</span><span style="color:var(--shiki-foreground)">x) </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> z);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-token-function)"> G</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> y</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> z) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> (x </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> z) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (y </span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">~</span><span style="color:var(--shiki-foreground)">z));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-token-function)"> H</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> y</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> z) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> y </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> z;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-token-function)"> I</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> y</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> z) {</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> y </span><span style="color:var(--shiki-token-keyword)">^</span><span style="color:var(--shiki-foreground)"> (x </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-keyword)">~</span><span style="color:var(--shiki-foreground)">z));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-token-function)"> FF</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> s</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            long</span><span style="color:var(--shiki-foreground)"> ac) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">F(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> ac;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ((a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">)</span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> s) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> ((a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;&gt;</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-foreground)"> s));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> b;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> (a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-token-function)"> GG</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> s</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            long</span><span style="color:var(--shiki-foreground)"> ac) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">G(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> ac;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ((a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> s) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> ((a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;&gt;</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-foreground)"> s));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> b;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> (a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-token-function)"> HH</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> s</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            long</span><span style="color:var(--shiki-foreground)"> ac) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">H(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> ac;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ((a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> s) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> ((a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;&gt;</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-foreground)"> s));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> b;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> (a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">    private</span><span style="color:var(--shiki-token-keyword)"> static</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-token-function)"> II</span><span style="color:var(--shiki-foreground)">(</span><span style="color:var(--shiki-token-keyword)">long</span><span style="color:var(--shiki-foreground)"> a</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> d</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> x</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-keyword)"> long</span><span style="color:var(--shiki-foreground)"> s</span><span style="color:var(--shiki-token-punctuation)">,</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">            long</span><span style="color:var(--shiki-foreground)"> ac) {</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-function)">I(b</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> c</span><span style="color:var(--shiki-token-punctuation)">,</span><span style="color:var(--shiki-token-function)"> d)</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> x </span><span style="color:var(--shiki-token-keyword)">+</span><span style="color:var(--shiki-foreground)"> ac;</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">=</span><span style="color:var(--shiki-foreground)"> ((a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&lt;&lt;</span><span style="color:var(--shiki-foreground)"> s) </span><span style="color:var(--shiki-token-keyword)">|</span><span style="color:var(--shiki-foreground)"> ((a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">) </span><span style="color:var(--shiki-token-keyword)">&gt;&gt;&gt;</span><span style="color:var(--shiki-foreground)"> (</span><span style="color:var(--shiki-token-constant)">32</span><span style="color:var(--shiki-token-keyword)"> -</span><span style="color:var(--shiki-foreground)"> s));</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">        a </span><span style="color:var(--shiki-token-keyword)">+=</span><span style="color:var(--shiki-foreground)"> b;</span></span>
<span class="line"><span style="color:var(--shiki-token-keyword)">        return</span><span style="color:var(--shiki-foreground)"> (a</span><span style="color:var(--shiki-token-keyword)">&amp;</span><span style="color:var(--shiki-token-constant)">0xFFFFFFFFL</span><span style="color:var(--shiki-foreground)">);</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">    }</span></span>
<span class="line"><span style="color:var(--shiki-foreground)">}</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[谷歌浏览器运行安卓APK]]></title>
        <id>/blog/2017/hexo-谷歌浏览器运行安卓APK</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-谷歌浏览器运行安卓APK"/>
        <updated>2017-06-25T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文记录了作者探索使用谷歌浏览器插件ARChon在电脑上运行安卓APK文件的过程和遇到的问题。文章详细描述了解决一系列错误的方法，包括处理“CRX_SIGNATURE_VERIFICATION_FAILED”包无效错误，修改插件文件夹名，解决manifest.json中的import和message元素缺失问题等。作者还提到了使用twerk应用来转换APK，以及通过开启浏览器硬件加速和相关标志来解决WebGL不受支持的问题，最终成功在Chrome中运行了简书等应用。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="谷歌浏览器运行安卓apk"><a href="#谷歌浏览器运行安卓apk" class="rp-header-anchor rp-link" aria-hidden="true">#</a>谷歌浏览器运行安卓APK<!-- --> </h1>
<p>使用谷歌浏览器的插件ARChon实现安卓APK在电脑上运行</p>
<p>用谷歌插件在电脑上运行安卓APK</p>
<p>1，直接谷歌应用商店下载出现错误<br/>
程序包无效：&quot;CRX_SIGNATURE_VERIFICATION_FAILED&quot;。</p>
<p>2，直接下载crx包参考百度经验</p>
<p>3，出现错误：Cannot load extension with file or directory name
<em>metadata. Filenames starting with &quot;</em>&quot; are reserved for use by the
system.<br/>
更改解压后文件夹_metadata为metadata</p>
<p>4，出现错误：&#x27;import&#x27; extension is not installed.<br/>
打开文件manifest.json去掉import一句</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>&quot;import&quot;:[{&quot;id&quot;:&quot;mfaihdlpglflfgpfjcifdjdjcckigekc&quot;}],</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>继续谷歌去掉这句话不对<br/>
看这篇CSDN文章<br/>
说要下载插件ARChon<br/>
(以下废话，直接看5）</p>
<p>4.1，安装成功，但启用后一直白屏</p>
<p><img src="http://upload-images.jianshu.io/upload_images/2950376-a275f201f7fdead8.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt=""/></p>
<p>怀疑是不是去掉import一句出问题了</p>
<p>4.2，网上看到开启Native Client<br/>
谷歌浏览器地址栏输入chrome://flags/开启Native Client<br/>
无用</p>
<p>4.3，发现另一个谷歌商店的应用twerk这个应用是把 APK 文件转换成 Chrome
App用的</p>
<p><img src="http://upload-images.jianshu.io/upload_images/2950376-2372cf692c93b5a9.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt=""/></p>
<p>5ARChon是谷歌插件要在扩展程序，打钩开发者模式，点击加载已解压扩展程序，选择解压文件夹<br/>
加载ARChon时有警告，可忽略<br/>
先加载ARC Welder出现4的错误后<br/>
再加载ARChon，然后ARC Welder就好了，不好的话重新加载就好了<br/>
安装好了就是APK运行不了</p>
<p>4.3安装的twerk可以把 APK 文件转换一个文件夹<br/>
然后ARC Welder运行<br/>
谷歌浏览器如何运行APK博客CSDN可以试一试</p>
<h2 class="rp-toc-include" id="又遇到的问题"><a href="#又遇到的问题" class="rp-header-anchor rp-link" aria-hidden="true">#</a>又遇到的问题</h2>
<p>Chrome加载Android应用，提示&quot;There is no &quot;message&quot; element for key
extName&quot;错误，如：</p>
<p><img src="http://upload-images.jianshu.io/upload_images/2950376-0c0702ed3e06b504.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt=""/></p>
<h2 class="rp-toc-include" id="解决方法"><a href="#解决方法" class="rp-header-anchor rp-link" aria-hidden="true">#</a>解决方法：</h2>
<p>找到该Crx文件夹下的&quot;_locales\en&quot;目录下的&quot;messages.json&quot;文件，在&quot;extName&quot;节点下，添加&quot;message&quot;字段标签，值对应应用的包名：</p>
<p><img src="http://upload-images.jianshu.io/upload_images/2950376-c5a40ac2756b5a87.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt=""/></p>
<p>WebGL 不受支持<br/>
知乎有教程<br/>
浏览器快捷方式属性增加---ignore-gpu-blacklist<br/>
开启硬件加速<br/>
试了一下掌阅</p>
<p><img src="http://upload-images.jianshu.io/upload_images/2950376-f4ed0ddb2b2d06e1.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt=""/></p>
<p>试了一下简书<br/>
可以运行</p>
<p><img src="http://upload-images.jianshu.io/upload_images/2950376-ed37c301d49d7485.PNG?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" alt=""/></p><!--/$-->]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[批处理for循环使用]]></title>
        <id>/blog/2017/hexo-批处理for循环使用</id>
        <link href="https://www.vhcffh.com/blog/2017/hexo-批处理for循环使用"/>
        <updated>2017-04-22T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[本文详细解析了Windows批处理（Batch）脚本中`FOR`循环命令的用法。文章首先区分了在命令行直接使用（%variable）和在批处理文件（.bat）中使用（%%variable）的语法差异。接着，深入讲解了`FOR`命令的各种扩展参数，包括/D（遍历目录）、/R（递归遍历）、/L（数字序列循环）和/F（文件内容、字符串及命令输出解析），并对/F的delims、tokens等选项做了详细说明。最后，还介绍了强大的变量扩展修饰符（如%~dpI, %~nxI），用于提取路径、文件名等信息。]]></summary>
        <content type="html"><![CDATA[<!--$--><h1 class="rp-toc-include" id="批处理for循环使用"><a href="#批处理for循环使用" class="rp-header-anchor rp-link" aria-hidden="true">#</a>批处理for循环使用<!-- --> </h1>
<p>FOR %variable IN (set) DO command [command-parameters]
variable是一个变量
(set)相当于一个数组，variable遍历这个数组
command [command-parameters]这是每次循环要做的事</p>
<h3 class="rp-toc-include" id="在cmd中输入使用时应写为"><a href="#在cmd中输入使用时应写为" class="rp-header-anchor rp-link" aria-hidden="true">#</a>在cmd中输入使用时应写为</h3>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>FOR %variable IN (set) DO command [command-parameters]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>command [command-parameters]中用到变量也要写为%variable</p>
<h3 class="rp-toc-include" id="写进bat或者cmd时应写为"><a href="#写进bat或者cmd时应写为" class="rp-header-anchor rp-link" aria-hidden="true">#</a>写进.bat或者.cmd时应写为</h3>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>FOR %%variable IN (set) DO command [command-parameters]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>command [command-parameters]中用到变量也要写为%%variable</p>
<h3 class="rp-toc-include" id="windows自带的help解释"><a href="#windows自带的help解释" class="rp-header-anchor rp-link" aria-hidden="true">#</a>Windows自带的help解释</h3>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>FOR %variable IN (set) DO command [command-parameters]</span></span>
<span class="line"><span></span></span>
<span class="line"><span>  %variable  指定一个单一字母可替换的参数。</span></span>
<span class="line"><span>  (set)      指定一个或一组文件。可以使用通配符。</span></span>
<span class="line"><span>  command    指定对每个文件执行的命令。</span></span>
<span class="line"><span>  command-parameters  为特定命令指定参数或命令行开关。</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>在批处理程序中使用 FOR 命令时，指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的，所以 %i 不同于 %I.</p>
<p>如果启用命令扩展，则会支持下列 FOR 命令的其他格式:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>FOR /D %variable IN (set) DO command [command-parameters]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>如果集中包含通配符，则指定与目录名匹配，而不与文件名匹配。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>检查以 [drive:]path 为根的目录树，指向每个目录中的 FOR 语句。
如果在 /R 后没有指定目录规范，则使用当前目录。如果集仅为一个单点(.)字符，则枚举该目录树。</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>FOR /L %variable IN (start,step,end) DO command [command-parameters]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>该集表示以增量形式从开始到结束的一个数字序列。因此，(1,1,5)将产生序列1 2 3 4 5，(5,-1,1)将产生序列(5 4 3 2 1)</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>FOR /F [&quot;options&quot;] %variable IN (file-set) DO command [command-parameters]</span></span>
<span class="line"><span>FOR /F [&quot;options&quot;] %variable IN (&quot;string&quot;) DO command [command-parameters]</span></span>
<span class="line"><span>FOR /F [&quot;options&quot;] %variable IN (&#x27;command&#x27;) DO command [command-parameters]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>或者，如果有 usebackq 选项:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>FOR /F [&quot;options&quot;] %variable IN (file-set) DO command [command-parameters]</span></span>
<span class="line"><span>FOR /F [&quot;options&quot;] %variable IN (&quot;string&quot;) DO command [command-parameters]</span></span>
<span class="line"><span>FOR /F [&quot;options&quot;] %variable IN (&#x27;command&#x27;) DO command [command-parameters]</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>fileset 为一个或多个文件名。继续到 fileset 中的下一个文件之前，每份文件都被打开、读取并经过处理。处理包括读取文件，将其分成一行行的文字，然后将每行解析成零或更多的符号。然后用已找到的符号字符串变量值调用 For 循环。
以默认方式，/F 通过每个文件的每一行中分开的第一个空白符号。跳过空白行。你可通过指定可选 &quot;options&quot; 参数替代默认解析操作。这个带引号的字符串包括一个 或多个指定不同解析选项的关键字。这些关键字为:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>        eol=c           - 指一个行注释字符的结尾(就一个)</span></span>
<span class="line"><span>        skip=n          - 指在文件开始时忽略的行数。</span></span>
<span class="line"><span>        delims=xxx      - 指分隔符集。这个替换了空格和制表符的</span></span>
<span class="line"><span>                          默认分隔符集。</span></span>
<span class="line"><span>        tokens=x,y,m-n  - 指每行的哪一个符号被传递到每个迭代</span></span>
<span class="line"><span>                          的 for 本身。这会导致额外变量名称的分配。m-n</span></span>
<span class="line"><span>                          格式为一个范围。通过 nth 符号指定 mth。如果</span></span>
<span class="line"><span>                          符号字符串中的最后一个字符星号，</span></span>
<span class="line"><span>                          那么额外的变量将在最后一个符号解析之后</span></span>
<span class="line"><span>                          分配并接受行的保留文本。</span></span>
<span class="line"><span>        usebackq        - 指定新语法已在下类情况中使用:</span></span>
<span class="line"><span>                          在作为命令执行一个后引号的字符串并且一个单</span></span>
<span class="line"><span>                          引号字符为文字字符串命令并允许在 file-set</span></span>
<span class="line"><span>                          中使用双引号扩起文件名称。</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>某些范例可能有助:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>FOR /F &quot;eol=; tokens=2,3* delims=, &quot; %i in (myfile.txt) do @echo %i %j %k</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>会分析 myfile.txt 中的每一行，忽略以分号打头的那些行，将每行中的第二个和第三个符号传递给 for 函数体，用逗号和/空格分隔符号。请注意，此 for 函数体的语句引用 %i 来获得第二个符号，引用 %j 来获得第三个符号，引用 %k来获得第三个符号后的所有剩余符号。对于带有空格的文件名，你需要用双引号将文件名括起来。为了用这种方式来使用双引号，还需要使用 usebackq 选项，否则，双引号会被理解成是用作定义某个要分析的字符串的。%i 在 for 语句中显式声明，%j 和 %k 是通过 tokens= 选项隐式声明的。可以通过 tokens= 一行指定最多 26 个符号，只要不试图声明一个高于字母 &quot;z&quot; 或 &quot;Z&quot; 的变量。请记住，FOR 变量是单一字母、分大小写和全局的变量；而且，不能同时使用超过 52 个。
还可以在相邻字符串上使用 FOR /F 分析逻辑，方法是，用单引号将括号之间的 file-set 括起来。这样，该字符串会被当作一个文件中的一个单一输入行进行解析。</p>
<p>最后，可以用 FOR /F 命令来分析命令的输出。方法是，将括号之间的 file-set 变成一个反括字符串。该字符串会被当作命令行，传递到一个子 CMD.EXE，其输出会被捕获到内存中，并被当作文件分析。如以下例子所示:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>      FOR /F &quot;usebackq delims==&quot; %i IN (`set`) DO @echo %i</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>会枚举当前环境中的环境变量名称。</p>
<p>另外，FOR 变量参照的替换已被增强。你现在可以使用下列
选项语法:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>     %~I          - 删除任何引号(&quot;)，扩展 %I</span></span>
<span class="line"><span>     %~fI        - 将 %I 扩展到一个完全合格的路径名</span></span>
<span class="line"><span>     %~dI        - 仅将 %I 扩展到一个驱动器号</span></span>
<span class="line"><span>     %~pI        - 仅将 %I 扩展到一个路径</span></span>
<span class="line"><span>     %~nI        - 仅将 %I 扩展到一个文件名</span></span>
<span class="line"><span>     %~xI        - 仅将 %I 扩展到一个文件扩展名</span></span>
<span class="line"><span>     %~sI        - 扩展的路径只含有短名</span></span>
<span class="line"><span>     %~aI        - 将 %I 扩展到文件的文件属性</span></span>
<span class="line"><span>     %~tI        - 将 %I 扩展到文件的日期/时间</span></span>
<span class="line"><span>     %~zI        - 将 %I 扩展到文件的大小</span></span>
<span class="line"><span>     %~$PATH:I   - 查找列在路径环境变量的目录，并将 %I 扩展</span></span>
<span class="line"><span>                   到找到的第一个完全合格的名称。如果环境变量名</span></span>
<span class="line"><span>                   未被定义，或者没有找到文件，此组合键会扩展到</span></span>
<span class="line"><span>                   空字符串</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>可以组合修饰符来得到多重结果:</p>
<div class="rp-codeblock language-txt"><div class="rp-codeblock__content"><div class="rp-codeblock__content__scroll-container rp-scrollbar rp-scrollbar--always"><pre class="shiki css-variables" style="background-color:var(--shiki-background);color:var(--shiki-foreground)" tabindex="0" data-lang="txt"><code><span class="line"><span>     %~dpI       - 仅将 %I 扩展到一个驱动器号和路径</span></span>
<span class="line"><span>     %~nxI       - 仅将 %I 扩展到一个文件名和扩展名</span></span>
<span class="line"><span>     %~fsI       - 仅将 %I 扩展到一个带有短名的完整路径名</span></span>
<span class="line"><span>     %~dp$PATH:I - 搜索列在路径环境变量的目录，并将 %I 扩展</span></span>
<span class="line"><span>                   到找到的第一个驱动器号和路径。</span></span>
<span class="line"><span>     %~ftzaI     - 将 %I 扩展到类似输出线路的 DIR</span></span></code></pre></div><div class="rp-code-button-group"><button class="rp-code-button-group__button rp-code-wrap-button" title="Toggle code wrap"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrapped"><path fill="#22a041" d="M21 5H3v2h18zM3 19h7v-2H3zm0-6h15c1 0 2 .43 2 2s-1 2-2 2h-2v-2l-4 3 4 3v-2h2c2.95 0 4-1.27 4-4 0-2.72-1-4-4-4H3z"></path></svg><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 24 24" class="rp-code-button-group__icon rp-code-button-group__icon--wrap"><path fill="currentColor" d="M16 7H3V5h13zM3 19h13v-2H3zm19-7-4-3v2H3v2h15v2z"></path></svg></button><button class="rp-code-button-group__button rp-code-copy-button" title="复制代码"><svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--copy"><path fill="currentColor" d="M28 10v18H10V10zm0-2H10a2 2 0 0 0-2 2v18a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V10a2 2 0 0 0-2-2"></path><path fill="currentColor" d="M4 18H2V4a2 2 0 0 1 2-2h14v2H4Z"></path></svg><svg width="32" height="32" viewBox="0 0 30 30" class="rp-code-button-group__icon rp-code-copy-button__icon rp-code-copy-button__icon--success"><path fill="#49cd37" d="m13 24-9-9 1.414-1.414L13 21.171 26.586 7.586 28 9z"></path></svg></button></div></div></div>
<p>在以上例子中，%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读，而且避免与不分大小写的组合键混淆。</p><!--/$-->]]></content>
    </entry>
</feed>