mirror of
https://github.com/zhwei820/learn.lianglianglee.com.git
synced 2025-11-20 08:03:44 +08:00
fix img
This commit is contained in:
@@ -192,7 +192,7 @@ function hide_canvas() {
|
||||
</ul>
|
||||
<p>这里 b、o、x 三个英文字母的选择均来自数制的英文单词。</p>
|
||||
<p>综上,我们对这几个数制的信息整理如下表:</p>
|
||||
<p><img src="assets/CgqCHl-WYACATr-VAAC40XoQFZU944.png" alt="1.png" /></p>
|
||||
<p><img src="assets/CgqCHl-WYACATr-VAAC40XoQFZU944.png" alt="png" /></p>
|
||||
<h3>数制转换的方法</h3>
|
||||
<p>人们在使用数制进行计算时,都习惯性地把原问题映射到十进制中;计算完成后,再映射回去。这里就牵涉数制的转换啦。</p>
|
||||
<p>我举一个生活中最常见的数制转换的例子。</p>
|
||||
@@ -203,31 +203,31 @@ function hide_canvas() {
|
||||
<p>“40分钟+40分钟=80分钟”就是十进制的算术过程,可见为了完成其他数制的运算,我们依旧更喜欢用十进制做桥梁,毕竟我们对十进制的运算是最熟悉的。</p>
|
||||
<h4>1. 换基法(换向十进制)</h4>
|
||||
<p>我们给出数制转换的定量方法,也就是对于任意一个基数 N 进制下的数字 X,它转换为十进制的方法。如下图的公式所示:原进制若是 N 进制,转换时的基数便取 N。例如,将二进制的 X 转化为十进制时,运算时的转换基数便取为 2。</p>
|
||||
<p><img src="assets/Ciqc1F-WYCCAOCMMAACEX2a1vNU222.png" alt="2.png" /></p>
|
||||
<p><img src="assets/Ciqc1F-WYCCAOCMMAACEX2a1vNU222.png" alt="png" /></p>
|
||||
<ul>
|
||||
<li>我们举个例子,十进制下的 2020。</li>
|
||||
</ul>
|
||||
<p>它是十进制,所以我们基数便取 10;2020有 4 位数,根据上图公式,我们分别取(4-1)次方、(4-2)次方、(4-3)次方、(4-4)次方,再分别与每位数相乘,再相加取和。</p>
|
||||
<p><img src="assets/Ciqc1F-WYCiAGzKgAABcMIWYJfA894.png" alt="3.png" /></p>
|
||||
<p><img src="assets/Ciqc1F-WYCiAGzKgAABcMIWYJfA894.png" alt="png" /></p>
|
||||
<ul>
|
||||
<li>再举个例子,二进制下的 10110,利用换基法转换为十进制。</li>
|
||||
</ul>
|
||||
<p>它原是二进制,所以我们基数便取 2;10110 有 5 位数,根据上图公式,我们分别取(5-1)次方、(5-2)次方、(5-3)次方、(5-4)次方、(5-5)次方,再分别与每位数相乘,再相加取和。</p>
|
||||
<p><img src="assets/CgqCHl-WYDWAFnchAABhzdyMebE350.png" alt="4.png" /></p>
|
||||
<p><img src="assets/CgqCHl-WYDWAFnchAABhzdyMebE350.png" alt="png" /></p>
|
||||
<h4>2. 除余法(十进制向其他进制转换)</h4>
|
||||
<p>转向的目标进制为 N 进制,则以 N 为除数不断地做除法,将最后的商和之前的余数<strong>逆序</strong>串联在一起,就是最终的结果。</p>
|
||||
<p>例如,十进制的 19 转换为二进制的过程如下图所示:</p>
|
||||
<p><img src="assets/CgqCHl-WYEKAWp8MAABzhu_bTgE812.png" alt="5.png" /></p>
|
||||
<p><img src="assets/CgqCHl-WYEKAWp8MAABzhu_bTgE812.png" alt="png" /></p>
|
||||
<p>用 19 对 2 做除法得到余数 1,再用商对 2 做除法得到余数 1,再用商对 2 做除法得到余数 0...直到商为 1 结束。最终,用最后的商(也就是1),和过程中所有的余数<strong>逆序</strong>串联在一起,就是最终的结果 10011。</p>
|
||||
<p>值得一提的是,除余法除了适用于十进制向二进制的转换,也<strong>适用于十进制向任何数制的转换</strong>。例如,用除余法将十进制的 100,转换为八进制和十六进制的计算过程如下,得到结果分别是 0144 和 0x64。</p>
|
||||
<p><img src="assets/Ciqc1F-WYEqAI9leAABAGGC65Co725.png" alt="6.png" /></p>
|
||||
<p><img src="assets/Ciqc1F-WYEqAI9leAABAGGC65Co725.png" alt="png" /></p>
|
||||
<p>我们可以给出个简单的证明,根据换基法我们知道某个数制 N 下的数字的十进制表示为:</p>
|
||||
<p><img src="assets/Ciqc1F-WYFOAS0s2AABTeUEt0AY493.png" alt="7.png" /></p>
|
||||
<p><img src="assets/Ciqc1F-WYFOAS0s2AABTeUEt0AY493.png" alt="png" /></p>
|
||||
<p>其中,Xm、Xm-1、...、X1 分别为数字 X 在 N 进制下的每一位数字,也是我们要求解的目标。接着,我们可以计算 X 除以 N。</p>
|
||||
<p>这样可以得到,当我们第一次对 N 做除法时,就可以得到商为 N 进制下的 XmXm-1Xm-2...X2,余数就是 X1,即:
|
||||
<img src="assets/CgqCHl-ZLnKAYGn9AACGBxBvaeQ751.png" alt="WechatIMG237.png" />
|
||||
<img src="assets/CgqCHl-ZLnKAYGn9AACGBxBvaeQ751.png" alt="png" />
|
||||
那么第一次除以 N,是如何得到商为 N 进制下的 XmXm-1Xm-2...X2,余数就是 X1 的呢?你可以通过下图这个 16 进制下的 5321 这个例子理解。
|
||||
<img src="assets/Ciqc1F-aLESAM0L2AAITpDWjzuk862.png" alt="WechatIMG259.png" />
|
||||
<img src="assets/Ciqc1F-aLESAM0L2AAITpDWjzuk862.png" alt="png" />
|
||||
这里以 16 进制下的 5321 为例,可以更好地理解这一过程。如果不带入具体数制下的数字,你也可以通过公式推导出来,只是不那么容易理解,不过你自己也可以尝试。</p>
|
||||
<p>接着同理,我们再用上一步的商 XmXm-1Xm-2...X2 重复对 N 做除法的过程,就会得到新的商为 N 进制下的 XmXm-1Xm-2...X3 ,余数为 X2 。再同理,重复上面的过程,你会发现得到的余数分别是 X1X2X3...Xm。</p>
|
||||
<p>最后,我们把所有的余数做个逆序,就得到了 N 进制下的 X 的每一位,最终就能得到 XmXm-1Xm-2...X1 了。</p>
|
||||
@@ -242,7 +242,7 @@ function hide_canvas() {
|
||||
<li>最后,别忘加上二进制的符号 0b,并去掉首位 0。</li>
|
||||
</ul>
|
||||
<p>则八进制的 023 的二进制表示就是 0b10011,如下图:</p>
|
||||
<p><img src="assets/CgqCHl-WYbSARzuZAABfRNDl43E120.png" alt="9.png" /></p>
|
||||
<p><img src="assets/CgqCHl-WYbSARzuZAABfRNDl43E120.png" alt="png" /></p>
|
||||
<p><strong>同理,二进制转换为八进制,可以采用每 3 位合并的按位合并法。</strong></p>
|
||||
<p>如下图,二进制的 0b10011 转换为八进制,则<strong>从后往前</strong>每 3 位合并:</p>
|
||||
<ul>
|
||||
@@ -251,10 +251,10 @@ function hide_canvas() {
|
||||
<li>别忘加上八进制的符号 0o。</li>
|
||||
</ul>
|
||||
<p>则最终八进制的结果就是 0o23 或 023。</p>
|
||||
<p><img src="assets/CgqCHl-WYb2AWnlDAABXQI-u4nk588.png" alt="10.png" /></p>
|
||||
<p><img src="assets/CgqCHl-WYb2AWnlDAABXQI-u4nk588.png" alt="png" /></p>
|
||||
<p>对于<strong>十六进制和二进制之间的转换</strong>,也可以采用按位合并和按位拆分的方法,区别只是在于需要按<strong>4 位</strong>进行合并或拆分。</p>
|
||||
<p>例如下图,十六进制的 0x1a 转换为二进制,由于 1 为 0001,a 为 1010,串联在一起之后,二进制的结果就是 0b11010。</p>
|
||||
<p><img src="assets/Ciqc1F-WYcSAbeioAABXFe3nLms882.png" alt="11.png" /></p>
|
||||
<p><img src="assets/Ciqc1F-WYcSAbeioAABXFe3nLms882.png" alt="png" /></p>
|
||||
<p>同样地,二进制的 0b1011101 转换为十六进制,从后往前每 4 位合并:</p>
|
||||
<ul>
|
||||
<li>最后 4 位是 1101,它是十进制的 13,在十六进制表示为 d;</li>
|
||||
@@ -262,14 +262,14 @@ function hide_canvas() {
|
||||
<li>别忘加上十六进制的符号 0x。</li>
|
||||
</ul>
|
||||
<p>则最终十六进制的结果就是 0x5d。
|
||||
<img src="assets/CgqCHl-XgvyAPLFvAABXUh2bCnY315.png" alt="WechatIMG133.png" /></p>
|
||||
<img src="assets/CgqCHl-XgvyAPLFvAABXUh2bCnY315.png" alt="png" /></p>
|
||||
<p>为何八进制与二进制的转换是按照 3 位数合并、拆分,而十六进制与二进制之间则是 4 位数呢?本质原因是在于 2³=8 和 2⁴=16。根据这表达式可以看出,二进制中的 3 个 bit(位),恰好可以表示 0~7 这 8 个数字。因此,按照 3 位合并,就可以从二进制转化到八进制了。同理,按照 4 位合并,就可以从二进制转化到十六进制了。</p>
|
||||
<p>而八进制与十六进制之间的转换,就不适用按位合并和按位拆分的方法了,你可以以二进制或十进制为跳板,进行两者之间的转换。</p>
|
||||
<h4>4. 数制转换图</h4>
|
||||
<p>我们总结一下,对于一般的数制之间转换,我们喜欢以十进制来作为跳板。</p>
|
||||
<p>其他数制向十进制的转换方法是<strong>换基法</strong>,而十进制向其他数制转换的方法是<strong>除余法</strong>。</p>
|
||||
<p>特别地,对于程序员经常关注的二进制、八进制和十六进制之间,它们又有一些特殊的转换方法。二进制向八进制或十六进制的转换,可以采用<strong>按位合并法</strong>;八进制或十六进制向二进制的转换,可以采用<strong>按位拆分法</strong>。</p>
|
||||
<p><img src="assets/Ciqc1F-WYpOAE9r4AAHd7gv5pPI247.png" alt="13.png" /></p>
|
||||
<p><img src="assets/Ciqc1F-WYpOAE9r4AAHd7gv5pPI247.png" alt="png" /></p>
|
||||
<p>数制转换方法图</p>
|
||||
<h3>数制转换与编程</h3>
|
||||
<p>在编程的时候,利用对不同数制及其转换的性质,往往能让很多复杂问题迎刃而解。最常见的就是二进制下的运算,看下下面的例题。</p>
|
||||
|
||||
Reference in New Issue
Block a user