<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Computer Science on CGLab</title><link>https://blog.cglab.top/tags/computer-science/</link><description>Recent content in Computer Science on CGLab</description><generator>Hugo</generator><language>zh-cn</language><copyright>2026 氧均竭。本站原创内容除特别声明外，采用 CC BY-NC-ND 4.0 许可协议。</copyright><lastBuildDate>Sun, 12 Jul 2026 16:39:16 +0800</lastBuildDate><atom:link href="https://blog.cglab.top/tags/computer-science/index.xml" rel="self" type="application/rss+xml"/><item><title>【CS | CSAPP】DataLab 心路历程</title><link>https://blog.cglab.top/posts/cs/csapp/datalab/</link><pubDate>Sun, 12 Jul 2026 16:39:16 +0800</pubDate><guid>https://blog.cglab.top/posts/cs/csapp/datalab/</guid><description>&lt;p&gt;因为我不是计算机专业的，可以这么说，我是民计（类似民科），所有计算机相关的内容都是自学的，在看 CSAPP 第二章的时候看得我是异常得痛苦，虽然我能看懂，但是我认为我对数据表示这一块不是很感兴趣，所以看起来有点难受，索性我直接采用探索性学习法，我决定不再看第二章，直接去做第二章的作业，以及DataLab，而我将在探索中学习到这些知识，现在这篇文章是我做DataLab的记录。&lt;/p&gt;</description><content:encoded><![CDATA[<p>因为我不是计算机专业的，可以这么说，我是民计（类似民科），所有计算机相关的内容都是自学的，在看 CSAPP 第二章的时候看得我是异常得痛苦，虽然我能看懂，但是我认为我对数据表示这一块不是很感兴趣，所以看起来有点难受，索性我直接采用探索性学习法，我决定不再看第二章，直接去做第二章的作业，以及DataLab，而我将在探索中学习到这些知识，现在这篇文章是我做DataLab的记录。</p>
<blockquote>
<p>注：这篇文章句子很乱完全就是我自己的思考过程，没有整理</p>
</blockquote>
<h2 id="bitxorxy">bitXor(x,y)</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cm">/* 
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cm"> * bitXor - x^y using only ~ and &amp; 
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cm"> *   Example: bitXor(4, 5) = 1
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cm"> *   Legal ops: ~ &amp;
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="cm"> *   Max ops: 14
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="cm"> *   Rating: 1
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="kt">int</span> <span class="nf">bitXor</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">  
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>只用~和&amp;实现异或运算，
我们首先得搞懂异或运算是什么：不同为 1，相同为0</p>
<table>
	<thead>
			<tr>
					<th style="text-align: center">a</th>
					<th style="text-align: center">b</th>
					<th style="text-align: center">a^b</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: center">0</td>
					<td style="text-align: center">1</td>
					<td style="text-align: center">1</td>
			</tr>
			<tr>
					<td style="text-align: center">1</td>
					<td style="text-align: center">0</td>
					<td style="text-align: center">1</td>
			</tr>
			<tr>
					<td style="text-align: center">1</td>
					<td style="text-align: center">1</td>
					<td style="text-align: center">0</td>
			</tr>
			<tr>
					<td style="text-align: center">0</td>
					<td style="text-align: center">0</td>
					<td style="text-align: center">0</td>
			</tr>
	</tbody>
</table>
<p>所以我们可以这么说</p>
<p>异或运算 是：a b 至少有一个1，并且a b不能同时为1</p>
<p>我们又知道</p>
<p>且运算是 ：a b 同时为 1</p>
<p>或运算是：a b 至少有一个1</p>
<p>那么异或就可以表示为 (a | b) &amp; ~(a &amp; b)</p>
<p>但是题目只让我们使用 ~ and &amp;</p>
<p>所以我们需要用 ~ &amp; 表示 |</p>
<p>既然我们要替换掉 |</p>
<p>我们仔细看看它的真值表</p>
<table>
	<thead>
			<tr>
					<th style="text-align: center">a</th>
					<th style="text-align: center">b</th>
					<th style="text-align: center">a|b</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: center">0</td>
					<td style="text-align: center">1</td>
					<td style="text-align: center">1</td>
			</tr>
			<tr>
					<td style="text-align: center">1</td>
					<td style="text-align: center">0</td>
					<td style="text-align: center">1</td>
			</tr>
			<tr>
					<td style="text-align: center">1</td>
					<td style="text-align: center">1</td>
					<td style="text-align: center">1</td>
			</tr>
			<tr>
					<td style="text-align: center">0</td>
					<td style="text-align: center">0</td>
					<td style="text-align: center">0</td>
			</tr>
	</tbody>
</table>
<p>我们还可以这么描述 | 运算 ：a b 不同时为 0</p>
<p>而我们注意到 且运算是 ：a b 同时为 1</p>
<p>我们尝试将 a b 同时为 1 变为 a b 不同时为 0</p>
<p>我们尝试给 (a &amp; b) 前面加个 ~ 变成了 ~(a &amp; b) 这表示的是 a b 不同时为 1</p>
<p>接近了 我们想想 a b同时为 0 怎么表示，且运算说的是 a b 同时为 1</p>
<p>那如果 a 和 b 此时为 0 则 ~a 且 ~b 就是 1了</p>
<p>所以 最终  ~(~a &amp; ~b) 表示为 a b 不同时为 0</p>
<p>所以最终异或就可以表示为 ~(~a &amp; ~b) &amp; ~(a &amp; b)</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cm">/* 
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cm"> * bitXor - x^y using only ~ and &amp; 
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cm"> *   Example: bitXor(4, 5) = 1
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cm"> *   Legal ops: ~ &amp;
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="cm"> *   Max ops: 14
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="cm"> *   Rating: 1
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="kt">int</span> <span class="nf">bitXor</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">    <span class="k">return</span> <span class="o">~</span><span class="p">(</span><span class="o">~</span><span class="n">x</span> <span class="o">&amp;</span> <span class="o">~</span><span class="n">y</span><span class="p">)</span> <span class="o">&amp;</span> <span class="o">~</span><span class="p">(</span><span class="n">x</span> <span class="o">&amp;</span> <span class="n">y</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><blockquote>
<p>同理~(~a | ~b)可以表示 &amp;</p>
</blockquote>
<p>由此我们可以总结出德摩根律
</p>
$$
\neg (A\wedge B) = \neg A\vee \neg B
$$$$
\neg(A\vee B) = \neg A \wedge \neg B
$$<h2 id="tmin">tmin()</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="cm">/* 
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="cm"> * tmin - return minimum two&#39;s complement integer 
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="cm"> *   Legal ops: ! ~ &amp; ^ | + &lt;&lt; &gt;&gt;
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="cm"> *   Max ops: 4
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="cm"> *   Rating: 1
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="kt">int</span> <span class="nf">tmin</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">
</span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>我们观察一下二进制转补码的公式
</p>
$$
B2T_w(\vec{x}) = -x_{w-1}2^{w-1}+\sum_{i=0}^{w-2}x_i2^i
$$<p>
可以看到 $\sum_{i=0}^{w-2}x_i2^i\ge0$ 如果这一项等于0 则函数值最小，即从 $w-2$ 到 $i$ 位上 $x_i$ 都为 0</p>
<p>所以我们需要构造出来这么一个数，第 $w-1$ 位 是1 其他位都是 0，我们可以这么构造 0x1&laquo;(w-1)</p>
<p>所以</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="cm">/* 
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="cm"> * tmin - return minimum two&#39;s complement integer 
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="cm"> *   Legal ops: ! ~ &amp; ^ | + &lt;&lt; &gt;&gt;
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="cm"> *   Max ops: 4
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="cm"> *   Rating: 1
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="kt">int</span> <span class="nf">tmin</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln">8</span><span class="cl">    <span class="k">return</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="mi">31</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">9</span><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h2 id="istmaxx">isTmax(x)</h2>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cm">/*
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cm"> * isTmax - returns 1 if x is the maximum, two&#39;s complement number,
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cm"> *     and 0 otherwise 
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cm"> *   Legal ops: ! ~ &amp; ^ | +
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="cm"> *   Max ops: 10
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="cm"> *   Rating: 1
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="kt">int</span> <span class="nf">isTmax</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"> 
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>这题让我们判断 x 是否是 TMax ，</p>
<p>我们稍微改一下题目，如果仅仅不能用if，以及各种条件判断语句，可以使用 == 则可以这么写</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln">1</span><span class="cl"><span class="kt">int</span> <span class="nf">isTmax</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">){</span>
</span></span><span class="line"><span class="ln">2</span><span class="cl">   <span class="k">return</span> <span class="n">x</span> <span class="o">==</span> <span class="n">INT_MAX</span><span class="p">;</span>
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><p>但是现在的问题是我们不能用 INT_MAX 也不能用 ==，我们需要用题目给的运算符以及已知量 x 构建出另一个式子，</p>
<p>我们对 x==INT_MAX进行改写，写成x == TMax，这样做是因为我们现在不知道TMax ，TMax是一个未知量，</p>
<p>而我们需要通过一系列等价变形将  x == TMax 变为两边只包含x和运算符的式子，由于x也是变量，最终如果这个式子为真当且仅当 x 的值为TMax，所以我们假设这个式子一直为真，即 x 的值为TMax，我们的目标就是将 x==TMax 变为两边只包含x和运算符的式子，第一个想到的式子就是 TMax + 1 = TMin，这样式子就变为 x+1 == TMin ,然后再利用 TMin == -TMin这个性质，有 x+1 == -(x+1)，但是注意 0 == -0 也有这个性质，所以我们需要判断 (x+1)!=0</p>
<p>所以我们可以写成这样一个式子 ： ((x+1) == -(x+1)) &amp; ((x+1)!=0)</p>
<p>现在我们唯一要做的就是将 &ldquo;-&rdquo;,&quot;==&quot;,&quot;!=&ldquo;用题目给的运算负表示，我们知道异或的性质:A^A = 0，(A^B)!=0 ,我们也知道在c语言中 !a 表示 :如果a为0则 !a 为 1，如果 a 不为 0 则 !a 为 0，所以我们可以用!(a^b)表示 a==b这个运算，可以用!!(a) 表示 a!=0这个运算，而根据补码的性质 -x = ~x+1</p>
<p>所以最终我们可以得到：!((x+1) ^ (~(x+1)+1)) &amp; !!(x+1)</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-c" data-lang="c"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="cm">/*
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="cm"> * isTmax - returns 1 if x is the maximum, two&#39;s complement number,
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="cm"> *     and 0 otherwise 
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="cm"> *   Legal ops: ! ~ &amp; ^ | +
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="cm"> *   Max ops: 10
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="cm"> *   Rating: 1
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="cm"> */</span>
</span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="kt">int</span> <span class="nf">isTmax</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="ln"> 9</span><span class="cl"> 	<span class="k">return</span> <span class="o">!</span><span class="p">((</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="o">^</span> <span class="p">(</span><span class="o">~</span><span class="p">(</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span><span class="o">+</span><span class="mi">1</span><span class="p">))</span> <span class="o">&amp;</span> <span class="o">!!</span><span class="p">(</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
</span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="p">}</span>
</span></span></code></pre></div><h1 id="待更新">待更新</h1>
]]></content:encoded></item></channel></rss>