什么是Complement(补码)?
大學上過計算機原理課程的朋友都接觸過補碼這個概念,不過當時書上所教授的內(nèi)容都是以二進制作為前提,即所謂的2的補碼(2's Complement)。近來看TCP/IP Volume 1時,又接觸到“1的補碼”這個概念,忽然發(fā)現(xiàn)其實還不太明白補碼到底是什么意思,故查閱資料記錄之。
資料來源:維基百科
術語解釋:Radix —— 基數(shù),在本篇文章的范疇內(nèi)等價于“進制”
定義:給出長度為n的數(shù)值y,則y的以基數(shù)b的補碼為: bn - y (即 b的補碼)
水平有限,翻譯的比較拗口,不過公式還是很簡潔的,實際上補碼從定義上來說并沒有什么難懂的地方。不過有些地方需要加以說明,補碼這個概念是建立在進制(即基數(shù))的基礎上的,至少在計算機科學的術語中,補碼定義中的基數(shù)b是一定等于當前進制的,也就是說以上定義可以簡化為
給出長度為n的數(shù)值y且該數(shù)值為b進制,則y的補碼為:bn-y
下面以十進制的數(shù)作為例子
給出數(shù)值y = 1234,很明顯長度n = 4,基數(shù)b = 10(你說不知道10從哪來的?論審題的重要性)
根據(jù)補碼的定義那么 y的補碼為:104- 1234 = 8766
用途:補碼的作用是什么呢?你走運啦,補碼的用途很專一 —— 用加法操作來代替減法操作
聽起來匪夷所思,你幾乎要脫口而出:“不可能!!!”,不過按照國際慣例,我們先來看看到底怎么回事吧
這里要引入另一個很簡單但是英文又很有bigger的術語: 縮小基數(shù)補碼 (diminished radix complement),看到 diminished 這個詞我立馬打個激靈,想起了久未謀面的縮小增量排序(diminished increment sort),啥?你說老師沒教過這個?噢,它的另一個名字叫希爾排序,它是。。。咳咳,不好意思跑題了。
縮小基數(shù)補碼實際上就是 (bn - 1) - y,就是說你可以通過往縮小基數(shù)補碼上加個 1 來得到基數(shù)補碼,也就是說
bn-y =(bn-1) -y + 1
是不是想大喊一聲:這TM不是廢話么??
這個概念有什么用?其實在純數(shù)學的范疇內(nèi),這個純屬多余,沒有任何用處。然而到了我這個年紀,就會明白一切看起來無意義的東西,肯定一定必須存在一個讓它擁有意義的上下文環(huán)境。在本文內(nèi),這個環(huán)境就是“一個數(shù)值的長度”,你要知道在數(shù)學范圍內(nèi),你想把一個數(shù)寫多長就有多長,但是在計算機內(nèi)數(shù)值長是固定的,譬如Java語言的int數(shù)值長度為32位,你無法用32位的數(shù)去表示33位數(shù),當然34位就更不行了!
回到基數(shù)b這個關鍵字上面來,還是以十進制數(shù)為例子
假設數(shù)值長度為固定的4,給出數(shù)值y= 1234,如果說你真的要按照定義在計算機內(nèi)去獲得補碼,你是做不到的,因為根據(jù)定義補碼為104- 1234,然而104 = 10000,已經(jīng)超出了4位數(shù)所能表示的范圍,你明白了么?縮小基數(shù)補碼就是為了能在固定的數(shù)值長度中去獲得補碼,所以退一步海闊天空啊
104- 1 = 9999
9999 - 1234 = 8765
8765 + 1 = 8766
然而,聰明如你一定發(fā)現(xiàn)了,說是補碼的用途是用加法代替減法,可是在以上第二步獲得補碼的關鍵步驟里,不還是要進行減法??這有毛區(qū)別?哈,這個就是最讓人興奮的地方,在二進制世界里,你不需要再用減法了,下面以二進制為例子
給出數(shù)值y= 1011,那么很明顯,按照最新的補碼求解步驟,補碼 = ( 24 - 1 ) - 1011 + 1,猛然一看,這哪里履行了補碼的承諾,用加法代替減法?那么我們就以二進制的視角去看
y = 1011
24- 1 = 1111
實際上你已經(jīng)發(fā)現(xiàn)了,這個縮小基數(shù)補碼是固定的——給定計算機數(shù)值長度n,則縮小基數(shù)補碼可以直接寫出:pppp...ppp(n個p,p = 進制 - 1),而關鍵的
1111 - 1011,這一步實際上已經(jīng)不需要作減法操作了,直接對 y 取反再加上 1 就能得到補碼了(是不是對“取反加一”感到特別耳熟?你是個上課聽課的好孩紙),在此不得不感謝偉大的二進制!需要再次聲明下,這么流暢的操作只有二進制能完成,其他進制想要獲得補碼,依然需要減法。
終章:在神奇的二進制世界中,獲得一個數(shù)的補碼只需要簡單的取反再加上一就可以了。那么最后我們來看看,補碼到手之后,又怎么能代替減法呢?
假設需要求解 x - y ( x >= y),那么分為以下步驟
求得y的補碼bn-y
x - y = x + (bn-y ) = x - y + bn (這一步用補碼的加法代替了原數(shù)值的減法)
顯然x - y + bn >=bn,然而bn已經(jīng)超出了數(shù)的表示范圍(overflow),直接被丟棄了,最后的結果就等于x - y
1的補碼:這個世界是沒有1進制的,所以1的補碼是一個縮小基數(shù)補碼,也就是直接對一個二進制數(shù)值取反
總結
以上是生活随笔為你收集整理的什么是Complement(补码)?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android沉浸式 字体,全面解析an
- 下一篇: xp 设备管理器 android,XP设