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