|
我們都知道,計算機的底層都是使用二進制數(shù)據(jù)進行數(shù)據(jù)流傳輸?shù)?,那么為什么會使用二進制表示計算機呢?或者說,什么是二進制數(shù)呢?在拓展一步,如何使用二進制進行加減乘除?二進制數(shù)如何表示負數(shù)呢?本文將一一為你揭曉。 為什么用二進制表示我們大家知道,計算機內(nèi)部是由IC電子元件組成的,其中 CPU 內(nèi)存 CPU 和 內(nèi)存使用IC電子元件作為基本單元,IC電子元件有不同種形狀,但是其內(nèi)部的組成單元稱為一個個的引腳。有人說CPU 和 內(nèi)存內(nèi)部都是超大規(guī)模集成電路,其實IC 就是集成電路(Integrated Circuit)。 IC元件切面圖 IC元件兩側(cè)排列的四方形塊就是引腳,IC的所有引腳,只有兩種電壓: 計算機的最小集成單位為
字節(jié)是最基本的計量單位,位是最小單位。 用字節(jié)處理數(shù)據(jù)時,如果數(shù)字小于存儲數(shù)據(jù)的字節(jié)數(shù) ( = 二進制的位數(shù)),那么高位就用 0 填補,高位和數(shù)學(xué)的數(shù)字表示是一樣的,左側(cè)表示高位,右側(cè)表示低位。比如 這個六位數(shù)用二進制數(shù)來表示就是 我們一般口述的 32 位和 64位的計算機一般就指的是處理位數(shù),32 位一次可以表示 4個字節(jié),64位一次可以表示8個字節(jié)的二進制數(shù)。 我們一般在軟件開發(fā)中用十進制數(shù)表示的邏輯運算等,也會被計算機轉(zhuǎn)換為二進制數(shù)處理。對于二進制數(shù),計算機不會區(qū)分他是 圖片、音頻文件還是數(shù)字,這些都是一些數(shù)據(jù)的結(jié)合體。 什么是二進制數(shù)那么什么是二進制數(shù)呢?為了說明這個問題,我們先把 二進制轉(zhuǎn)十進制表示圖 也就是說,二進制數(shù)代表的 那么我們所說的二進制數(shù)其實就是 用0和1兩個數(shù)字來表示的數(shù),它的基數(shù)為2,它的數(shù)值就是每個數(shù)的位數(shù) * 位權(quán)再求和得到的結(jié)果,我們一般來說數(shù)值指的就是十進制數(shù),那么它的數(shù)值就是 3 * 10 + 9 * 1 = 39。 移位運算和乘除的關(guān)系在了解過二進制之后,下面我們來看一下二進制的運算,和十進制數(shù)一樣,加減乘除也適用于二進制數(shù),只要注意逢 2 進位即可。二進制數(shù)的運算,也是計算機程序所特有的運算,因此了解二進制的運算是必須要掌握的。 首先我們來介紹 移位過程 上述例子中還是以 39 為例,我們先把十進制的39 轉(zhuǎn)換為二進制的 因此你可以得出來此結(jié)論,左移相當于是數(shù)值擴大的操作,那么 便于計算機處理的補數(shù)剛才我們沒有介紹右移的情況,是因為右移之后空出來的高位數(shù)值,有 0 和 1 兩種形式。要想?yún)^(qū)分什么時候補0什么時候補1,首先就需要掌握二進制數(shù)表示 二進制數(shù)中表示負數(shù)值時,一般會把最高位作為符號來使用,因此我們把這個最高位當作符號位。符號位是 0 時表示 計算機世界中是沒有減法的,計算機在做減法的時候其實就是在做加法,也就是用加法來實現(xiàn)的減法運算。比如 100 - 50 ,其實計算機來看的時候應(yīng)該是 100 + (-50),為此,在表示負數(shù)的時候就要用到 為了獲得 -1 取反過程 具體來說,就是需要先獲取某個數(shù)值的二進制數(shù),然后對二進制數(shù)的每一位做取反操作(0 ---> 1 , 1 ---> 0),最后再對取反后的數(shù) +1 ,這樣就完成了補數(shù)的獲取。 補數(shù)的獲取,雖然直觀上不易理解,但是邏輯上卻非常嚴謹,比如我們來看一下 1 - 1 的這個過程,我們先用上面的這個 1 - 1 分析圖 奇怪,1 - 1 會變成 130 ,而不是0,所以可以得出結(jié)論 那么正確的該如何表示呢?其實我們上面已經(jīng)給出結(jié)果了,那就是 1 - 1 正確的分析圖 我們可以看到 1 - 1 其實實際上就是 1 + (-1),對 -1 進行上面的取反 + 1 后變?yōu)? 所以負數(shù)的二進制表示就是先求其補數(shù),補數(shù)的求解過程就是對原始數(shù)值的二進制數(shù)各位取反,然后將結(jié)果 + 1, 當然,結(jié)果不為 0 的運算同樣也可以通過補數(shù)求得正確的結(jié)果。不過,有一點需要注意,當運算結(jié)果為負的時候,計算結(jié)果的值也是以補數(shù)的形式出現(xiàn)的,比如 3 - 5 這個運算,來看一下解析過程 3 - 5 的解析過程 3 - 5 的運算,我們按著上面的思路來過一遍,計算出來的結(jié)果是 編程語言的數(shù)據(jù)類型中,有的可以處理負數(shù),有的不可以。比如 C語言中不能處理負數(shù)的 仔細思考一下補數(shù)的機制,就能明白 -32768 比 32767 多一個數(shù)的原因了,最高位是 0 的正數(shù)有 0 ~ 32767 共 32768 個,其中包括0。最高位是 1 的負數(shù),有 -1 ~ -32768 共 32768 個,其中不包含0。0 雖然既不是正數(shù)也不是負數(shù),但是考慮到其符號位,就將其歸為了正數(shù)。 算數(shù)右移和邏輯右移的區(qū)別在了解完補數(shù)后,我們重新考慮一下右移這個議題,右移在移位后空出來的最高位有兩種情況 邏輯右移示意圖 將二進制數(shù)作為帶符號的數(shù)值進行右移運算時,移位后需要在最高位填充移位前符號位的值( 0 或 1)。這就被稱為 下面來看一個右移的例子。將 -4 右移兩位,來各自看一下移位示意圖
邏輯右移和算數(shù)右移示意圖 如上圖所示,在邏輯右移的情況下, -4 右移兩位會變成 那么我們可以得出來一個結(jié)論:左移時,無論是圖形還是數(shù)值,移位后,只需要將低位補 0 即可;右移時,需要根據(jù)情況判斷是邏輯右移還是算數(shù)右移。 下面介紹一下符號擴展:將數(shù)據(jù)進行符號擴展是為了產(chǎn)生一個位數(shù)加倍、但數(shù)值大小不變的結(jié)果,以滿足有些指令對操作數(shù)位數(shù)的要求,例如倍長于除數(shù)的被除數(shù),再如將數(shù)據(jù)位數(shù)加長以減少計算過程中的誤差。 以8位二進制為例,符號擴展就是指在保持值不變的前提下將其轉(zhuǎn)換成為16位和32位的二進制數(shù)。將 邏輯運算的竅門掌握邏輯和運算的區(qū)別是:將二進制數(shù)表示的信息作為四則運算的數(shù)值來處理就是 計算機能夠處理的運算,大體可分為邏輯運算和算數(shù)運算, ·
與或非異或真值表 掌握邏輯運算的竅門,就是要摒棄二進制數(shù)表示數(shù)值這一個想法。大家不要把二進制數(shù)表示的值當作數(shù)值,應(yīng)該把它看成是 開關(guān)上的 文章參考: 《程序是怎樣跑起來的》 < END > 如果你喜歡這篇文章,歡迎在看、轉(zhuǎn)發(fā)哦。 讓我們努力向前奔跑吧! |
|
|