This commit is contained in:
krahets
2024-05-31 12:45:23 +08:00
parent 1a7a8ac395
commit 6abac5a2e7
39 changed files with 1316 additions and 453 deletions
@@ -3623,7 +3623,7 @@
<p><strong>Q</strong>:在構建堆疊(佇列)的時候,未指定它的大小,為什麼它們是“靜態資料結構”呢?</p>
<p>在高階程式語言中,我們無須人工指定堆疊(佇列)的初始容量,這個工作由類別內部自動完成。例如,Java 的 <code>ArrayList</code> 的初始容量通常為 10。另外,擴容操作也是自動實現的。詳見後續的“串列”章節。</p>
<p><strong>Q</strong>:原碼轉二補數的方法是“先取反後加 1”,那麼二補數轉原碼應該是逆運算“先減 1 後取反”,而二補數轉原碼也一樣可以透過“先取反後加 1”得到,這是為什麼呢?</p>
<p><strong>A</strong>這是因為原碼和二補數的相互轉換實際上是計算“補數”的過程。我們先給出補數的定義:假設 <span class="arithmatex">\(a + b = c\)</span> ,那麼我們稱 <span class="arithmatex">\(a\)</span><span class="arithmatex">\(b\)</span><span class="arithmatex">\(c\)</span> 的補數,反之也稱 <span class="arithmatex">\(b\)</span><span class="arithmatex">\(a\)</span><span class="arithmatex">\(c\)</span> 的補數。</p>
<p>這是因為原碼和二補數的相互轉換實際上是計算“補數”的過程。我們先給出補數的定義:假設 <span class="arithmatex">\(a + b = c\)</span> ,那麼我們稱 <span class="arithmatex">\(a\)</span><span class="arithmatex">\(b\)</span><span class="arithmatex">\(c\)</span> 的補數,反之也稱 <span class="arithmatex">\(b\)</span><span class="arithmatex">\(a\)</span><span class="arithmatex">\(c\)</span> 的補數。</p>
<p>給定一個 <span class="arithmatex">\(n = 4\)</span> 位長度的二進位制數 <span class="arithmatex">\(0010\)</span> ,如果將這個數字看作原碼(不考慮符號位),那麼它的二補數需透過“先取反後加 1”得到:</p>
<div class="arithmatex">\[
0010 \rightarrow 1101 \rightarrow 1110
@@ -3640,7 +3640,7 @@
\]</div>
<p>總結來看,“先取反後加 1”和“先減 1 後取反”這兩種運算都是在計算到 <span class="arithmatex">\(10000\)</span> 的補數,它們是等價的。</p>
<p>本質上看,“取反”操作實際上是求到 <span class="arithmatex">\(1111\)</span> 的補數(因為恆有 <code>原碼 + 一補數 = 1111</code>);而在一補數基礎上再加 1 得到的二補數,就是到 <span class="arithmatex">\(10000\)</span> 的補數。</p>
<p>上述 <span class="arithmatex">\(n = 4\)</span> 為例,其可推廣至任意位數的二進位制數。</p>
<p>上述 <span class="arithmatex">\(n = 4\)</span> 為例,其可推廣至任意位數的二進位制數。</p>
<!-- Source file information -->