今天下午上數字邏輯,老師在講 數制
和 碼制
,閑來無事,便開始思考以前一直忽略的 關于進制轉換的原理
,細細思考之后,發現了一些好玩的東東,記下來記下來~
首先是 十進制整數部分轉換成其他的進制
,方法大家都懂的:
不斷除以基數取余數,直到商為零,從下到上讀取余數
以前一直搞不懂為什么是從下到上,只知道書上怎么說就怎么用~ 經過思考了之后,我發現了原因是這樣的:
之所以要從下到上數,是因為越往后該位所處的位權越高(因為被除了更多次了嘛),所以,該位是被除了多少次之后得到的就是該位的位權
這樣的解釋,應該是對的吧~
然后是小數部分,方法是這樣的:
不斷乘以基數取整數,從上到下讀取整數,直到滿足精度要求為止
這里有兩個問題:為什么又變成了乘法和從上到下呢?
原因是這樣的:
我們可以聯系一下二進制轉小數部分十進制的方法,是按照對應位大小乘以位權,而小數部分位權都是負數,也就是相當于除法,所以,作為逆運算,就應該是乘法。至于為什么是從上到下,我們看一下相應位的位權的絕對值就可以知道了。
最后的一個問題是關于補碼的。去年學C語言的時候,在學這一部分的時候總是納悶,為什么要取反再加一? ,現在想想,沒錯,這不是認為刻意的規定,而是必然!!!理由:
我們知道弄一個補碼是為了解決數的正負。所以,我們就可以從這一個方面來理解了。任何一個負數,其實我們都可以看作是:** 0 減去該數的絕對值 !** 又因為數又分為奇數和偶數,我們分兩方面來看:
1. 奇數
在二進制里面,奇數的最低位肯定是1,所以被 0 減去之后最低位肯定是1,然后,又因為 0 比該數的絕對值小,所以存在借位的情況,然后借位之后肯定是要還位的,所以被減數 0 就除了最低位之外都是 1 了,降下來的各位,已經很明顯了,如果是 0 : 1 - 0 = 1;如果是 1:1 - 1 = 0。所以,奇數的補碼是結果是這樣的:最低位肯定是 1,然后其余位都取反。你再去對照我們求補碼的方法就會發現結果都是一樣的!
2. 偶數
有了上面奇數的例子,其實偶數就很好理解了,因為偶數就是在某一個奇數后面加上若干個 0 ,也就是說,偶數的最低位肯定是 0 。所以,我們就可以理解奇數的方法來理解:因為偶數就是在某個奇數后面加上若干個 0 ,所以,奇數提到的借位肯定不會發生在這些低位的 0 上(因為 0 - 0 = 0,根本就不用借位),因此,0 減去一個偶數的結果相當于某一個奇數取補碼之后的結果再加上若干個0。那么,這個又跟補碼的取法取反之后再加一有什么關系呢?我們來看:前面說過,偶數就是在某一個奇數后面加上若干個 0 ,所以它取反的結果我們分為兩部分:奇數部分和0的部分。奇數部分取反肯定是 0 變 1 ,1 變 0 。在這里我們只需要注意該奇數的最低位是 1,所以取反后是 0 。然后是 0 的那一部分,取反肯定都變成了 1 。也就是說:上面取反的結果得到的是 奇數部分的最低位變成了 0,然后后面跟了若干個 1最后,再加 1 ,結果是上一步的若干個連續的 1 都變成了 0 ,然后奇數部分的最低位又變成了 1 ,其余位沒有變化。那么這個時候你再對照一下我們上面用 0 減去該偶數的絕對值的做法,結果是一模一樣的!!!
好了,說了這么多,究竟說明了什么呢?我覺得只說明了:補碼是一種必然且自然的方法,取反再加一只是一種幫助記憶的方法罷了~
突然發現懂了一個東西以及能夠將它正確地表達出來真的是兩碼事!感覺自己的表達能力還需要加強!!!希望這篇東東能夠對大家有所幫助~