<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[pinkie_ctfer&#x27;s Blog]]></title><description><![CDATA[pinkie ctfer的博客]]></description><link>http://forum.d2learn.org/category/17</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Jul 2026 23:15:58 GMT</lastBuildDate><atom:link href="http://forum.d2learn.org/category/17.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 23 Apr 2025 10:03:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[离散数学-0x00]]></title><description><![CDATA[<p dir="auto">本系列博客作为我学习的一个笔记,注重于代码实现,本人非数学专业,证明能力非常弱,本文掺杂着大量我自己的理解,如有数学大佬光顾,请尽情指正,谢谢<br />
<strong>本系列默认大家都学会了C/C++基本语法</strong></p>
<h1>集合</h1>
<h2>书上的定义</h2>
<pre><code>集合是指具有某种特定性质的不同对象无序聚集成的一个整体。
集合中的每一个对象称为集合的元素；
通常用大写字母表示集合；
用小写字母表示集合中的元素。
</code></pre>
<p dir="auto">也就是说把一些东西放到一起叫做集合(个人理解)</p>
<h3>代码实现</h3>
<pre><code>#include &lt;string&gt;
#include &lt;vector&gt;
#include &lt;stdint.h&gt;
#include &lt;iostream&gt;

// 抽象基类，定义集合元素的基本接口
class elmBase
{
public:
    // 将元素转换为字节数组的纯虚函数（序列化基础）
    virtual std::vector&lt;uint8_t&gt; getUint8Array() const = 0;

    // 默认比较运算符，通过字节数组逐字节比较
    virtual int operator==(const elmBase &amp;other)
    {
        std::vector&lt;uint8_t&gt; thisDate = getUint8Array();
        std::vector&lt;uint8_t&gt; otherDate = other.getUint8Array();
        if (thisDate.size() != otherDate.size())
            return 0;
        for (int i = 0; i &lt; thisDate.size(); i++)
        {
            if (thisDate[i] != otherDate[i])
                return 0;
        }
        return 1;
    }

    // 转换为字符串表示的纯虚函数
    virtual std::string toString() = 0;

    // 虚析构函数确保正确释放派生类对象
    virtual ~elmBase()
    {
    }
};

// 特殊元素类型，始终返回比较不成立
class alwaysFalse : public elmBase
{
public:
    std::vector&lt;uint8_t&gt; getUint8Array() const override
    {
        return std::vector&lt;uint8_t&gt;(); // 返回空数组
    }

    std::string toString() override
    {
        return {}; // 返回空字符串
    }

    // 重载运算符始终返回false，用于占位符场景
    virtual int operator==(const elmBase &amp;other) override
    {
        return 0;
    }
    ~alwaysFalse()
    {
    }
};

// 哈希表节点结构，使用链表法解决冲突
using elmNode = struct elmNode
{
    elmBase *elm;  // 元素指针
    elmNode *next; // 下一个节点指针
};

// 节点工厂函数，创建新节点并初始化元素
elmNode *elmNodeFactory(elmBase *elm)
{
    elmNode *newNode = new elmNode();
    newNode-&gt;elm = elm;
    newNode-&gt;next = nullptr;
    return newNode;
}

// 自定义集合类，基于哈希表实现
class set
{
private:
    uint32_t prime;   // 哈希表大小（通常选择质数）
    elmNode **setMap; // 哈希桶数组

    // 初始化哈希表结构
    void inline _init_(uint32_t prime)
    {
        this-&gt;prime = prime;
        this-&gt;setMap = new elmNode *[prime];
        // 初始化每个桶为alwaysFalse哨兵节点
        for (uint32_t i = 0; i &lt; prime; ++i)
        {
            this-&gt;setMap[i] = elmNodeFactory(new alwaysFalse());
        }
    }

protected:
    // 查找元素对应的哈希桶
    elmNode **__find__(elmBase *elm)
    {
        uint32_t hash = rotatingHash(elm-&gt;getUint8Array(), this-&gt;prime);
        return &amp;(this-&gt;setMap[hash]); // 返回桶的指针
    }

    /**
     * 通用链表操作函数
     * @param link 链表头指针的指针
     * @param elm 目标元素
     * @param cmp 自定义比较函数，返回true时停止遍历
     * @param finally 遍历结束后的处理函数（插入等操作）
     * @return 找到的节点或操作结果节点
     */
    elmNode *__link__(elmNode **link, elmBase *elm,
                      bool (*cmp)(elmNode *, elmBase *),
                      elmNode *(*finally)(elmNode **, elmNode *, elmBase *) = nullptr)
    {
        elmNode *linkPriv = *link;
        elmNode *linkCurrent = linkPriv;

        // 遍历链表查找元素
        while (linkCurrent != nullptr)
        {
            if (cmp(linkCurrent, elm))
            {
                return linkCurrent;
            }
            linkPriv = linkCurrent;
            linkCurrent = linkCurrent-&gt;next;
        }

        // 执行最终处理函数（如插入新节点）
        if (finally != nullptr)
        {
            return finally(link, linkPriv, elm);
        }
        return nullptr;
    }

public:
    // 构造函数初始化哈希表
    set(uint32_t prime) { _init_(prime); }
    ~set()
    {
        for (uint32_t i = 0; i &lt; this-&gt;prime; ++i)
        {
            elmNode *link = this-&gt;setMap[i];
            while (link != nullptr)
            {
                elmNode *tmp = link;
                link = link-&gt;next;
                if (tmp != nullptr)
                {
                    if (tmp-&gt;elm != nullptr)
                    {
                        std::cout &lt;&lt; "delete " &lt;&lt; tmp-&gt;elm-&gt;toString() &lt;&lt; std::endl;
                        delete tmp-&gt;elm;
                    }
                    delete tmp;
                }
            }
        }
    }
    // 旋转哈希算法实现
    static uint32_t rotatingHash(std::vector&lt;uint8_t&gt; key, uint32_t prime)
    {
        uint32_t hash = key.size();
        for (uint32_t i = 0; i &lt; key.size(); ++i)
            hash = (hash &lt;&lt; 4) ^ (hash &gt;&gt; 28) ^ (uint32_t)(key[i]);
        return (hash % prime);
    }

    // 添加元素到集合
    bool add(elmBase *elm, bool force = false)
    {
        elmNode **node = __find__(elm);
        auto finally = [](elmNode **node, elmNode *linkPriv, elmBase *elm) -&gt; elmNode *
        {
            // 插入新节点到链表末尾
            if (linkPriv-&gt;next == nullptr)
            {
                linkPriv-&gt;next = elmNodeFactory(elm);
            }
            return nullptr;
        };

        // 使用lambda作为比较函数
        elmNode *targetNode = this-&gt;__link__(node, elm, [](elmNode *node, elmBase *tag) -&gt; bool
                                             { return *(node-&gt;elm) == *tag; }, finally);

        return targetNode == nullptr; // 返回是否插入成功
    }

    // 检查元素是否存在
    bool get(elmBase *elm)
    {
        elmNode **node = __find__(elm);
        elmNode *targetNode = this-&gt;__link__(node, elm,
                                             [](elmNode *node, elmBase *tag) -&gt; bool
                                             {
                                                 return *(node-&gt;elm) == *tag;
                                             });
        return targetNode != nullptr;
    }

    // 移除集合中的元素
    bool remove(elmBase *elm)
    {
        elmNode **node = __find__(elm);
        elmNode *ret = this-&gt;__link__(node, elm,
                                      [](elmNode *current, elmBase *tag) -&gt; bool
                                      {
                                          // 查找前驱节点执行删除
                                          if (current-&gt;next != nullptr &amp;&amp; *(current-&gt;next-&gt;elm) == *tag)
                                          {
                                              elmNode *tmp = current-&gt;next;
                                              current-&gt;next = current-&gt;next-&gt;next;
                                              delete tmp-&gt;elm; // 释放元素内存
                                              delete tmp;      // 释放节点内存
                                              return true;
                                          }
                                          return false;
                                      });
        return ret != nullptr;
    }

    // 调试用打印函数，显示哈希表结构
    void print()
    {
        std::cout &lt;&lt; "[HashTable Structure]" &lt;&lt; std::endl;
        for (int i = 0; i &lt; this-&gt;prime; i++)
        {
            std::cout &lt;&lt; "Bucket " &lt;&lt; i &lt;&lt; ": ";
            elmNode *node = this-&gt;setMap[i];
            while (node != nullptr)
            {
                std::cout &lt;&lt; node-&gt;elm-&gt;toString() &lt;&lt; " -&gt; ";
                node = node-&gt;next;
            }
            std::cout &lt;&lt; "NULL" &lt;&lt; std::endl;
        }
    }
};

// 数值类型元素实现
class number : public elmBase
{
    int data;

public:
    number(int data) : data(data) {}

    std::vector&lt;uint8_t&gt; getUint8Array() const override
    {
        // 将整型转换为字节数组
        return std::vector&lt;uint8_t&gt;(
            reinterpret_cast&lt;const uint8_t *&gt;(&amp;data),
            reinterpret_cast&lt;const uint8_t *&gt;(&amp;data) + sizeof(data));
    }

    std::string toString() override
    {
        return std::to_string(data);
    }
    ~number()
    {
    }
};

// 字符串类型元素实现
class string : public elmBase
{
    std::string data;

public:
    string(std::string data) : data(data) {}

    std::vector&lt;uint8_t&gt; getUint8Array() const override
    {
        // 将字符串内容转换为字节数组
        return std::vector&lt;uint8_t&gt;(data.begin(), data.end());
    }

    std::string toString() override
    {
        return data;
    }
    ~string()
    {
    }
};
</code></pre>
<h2>集合与元素的关系</h2>
<pre><code>若A表示一个集合，a是集合A中的元素，记作aA，读作a属于A；
若a不是集合A中的元素，则记作aA，读作a不属于A。
</code></pre>
<p dir="auto">未完待续</p>
]]></description><link>http://forum.d2learn.org/topic/83/离散数学-0x00</link><guid isPermaLink="true">http://forum.d2learn.org/topic/83/离散数学-0x00</guid><dc:creator><![CDATA[妈耶厥了]]></dc:creator><pubDate>Wed, 23 Apr 2025 10:03:03 GMT</pubDate></item><item><title><![CDATA[C 0x01(C语言是如何进行函数调用的)]]></title><description><![CDATA[<p dir="auto">PC寄存器基本都是有限制的, 一般可以通过间接的方式修改。而且它一般指一个逻辑上的寄存器, 可能每个架构下实现和名字有所不同。总之, 感觉记住它是存储CPU下一条要执行的指令（在机器语言中）的内存地址就可以了</p>



架构
PC 名称
可否直接读取
可否直接写入
位数




x86
EIP
间接
❌
32


x86_64
RIP
间接
❌
64


ARM32
R15 / PC
✅
✅
32


ARM64
PC
✅
⚠️ 限制
64


RISC-V
pc
✅（模拟器）
⚠️ 部分支持
32/64


MIPS
PC
❌
❌
32


PowerPC
NIP
✅
✅（特权）
32/64




<p dir="auto">https://en.wikipedia.org/wiki/Program_counter</p>
]]></description><link>http://forum.d2learn.org/topic/75/c-0x01-c语言是如何进行函数调用的</link><guid isPermaLink="true">http://forum.d2learn.org/topic/75/c-0x01-c语言是如何进行函数调用的</guid><dc:creator><![CDATA[sunrisepeak]]></dc:creator><pubDate>Thu, 27 Mar 2025 11:43:28 GMT</pubDate></item><item><title><![CDATA[C 0x00(C语言是如何进行函数调用的)]]></title><description><![CDATA[太
强
了
👍
]]></description><link>http://forum.d2learn.org/topic/52/c-0x00-c语言是如何进行函数调用的</link><guid isPermaLink="true">http://forum.d2learn.org/topic/52/c-0x00-c语言是如何进行函数调用的</guid><dc:creator><![CDATA[kxb520]]></dc:creator><pubDate>Sat, 14 Dec 2024 23:35:41 GMT</pubDate></item></channel></rss>