日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

什么是Complement(补码)?

發布時間:2023/12/19 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 什么是Complement(补码)? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大學上過計算機原理課程的朋友都接觸過補碼這個概念,不過當時書上所教授的內容都是以二進制作為前提,即所謂的2的補碼(2's Complement)。近來看TCP/IP Volume 1時,又接觸到“1的補碼”這個概念,忽然發現其實還不太明白補碼到底是什么意思,故查閱資料記錄之。

資料來源:維基百科

術語解釋:Radix —— 基數,在本篇文章的范疇內等價于“進制”

定義:給出長度為n的數值y,則y的以基數b的補碼為: bn - y (即 b的補碼)

水平有限,翻譯的比較拗口,不過公式還是很簡潔的,實際上補碼從定義上來說并沒有什么難懂的地方。不過有些地方需要加以說明,補碼這個概念是建立在進制(即基數)的基礎上的,至少在計算機科學的術語中,補碼定義中的基數b是一定等于當前進制的,也就是說以上定義可以簡化為

給出長度為n的數值y且該數值為b進制,則y的補碼為:bn-y

下面以十進制的數作為例子

給出數值y = 1234,很明顯長度n = 4,基數b = 10(你說不知道10從哪來的?論審題的重要性)

根據補碼的定義那么 y的補碼為:104- 1234 = 8766

用途:補碼的作用是什么呢?你走運啦,補碼的用途很專一 —— 用加法操作來代替減法操作

聽起來匪夷所思,你幾乎要脫口而出:“不可能?。?!”,不過按照國際慣例,我們先來看看到底怎么回事吧

這里要引入另一個很簡單但是英文又很有bigger的術語: 縮小基數補碼 (diminished radix complement),看到 diminished 這個詞我立馬打個激靈,想起了久未謀面的縮小增量排序(diminished increment sort),啥?你說老師沒教過這個?噢,它的另一個名字叫希爾排序,它是。。。咳咳,不好意思跑題了。

縮小基數補碼實際上就是 (bn - 1) - y,就是說你可以通過往縮小基數補碼上加個 1 來得到基數補碼,也就是說

bn-y =(bn-1) -y + 1

是不是想大喊一聲:這TM不是廢話么??

這個概念有什么用?其實在純數學的范疇內,這個純屬多余,沒有任何用處。然而到了我這個年紀,就會明白一切看起來無意義的東西,肯定一定必須存在一個讓它擁有意義的上下文環境。在本文內,這個環境就是“一個數值的長度”,你要知道在數學范圍內,你想把一個數寫多長就有多長,但是在計算機內數值長是固定的,譬如Java語言的int數值長度為32位,你無法用32位的數去表示33位數,當然34位就更不行了!

回到基數b這個關鍵字上面來,還是以十進制數為例子

假設數值長度為固定的4,給出數值y= 1234,如果說你真的要按照定義在計算機內去獲得補碼,你是做不到的,因為根據定義補碼為104- 1234,然而104 = 10000,已經超出了4位數所能表示的范圍,你明白了么?縮小基數補碼就是為了能在固定的數值長度中去獲得補碼,所以退一步海闊天空啊

104- 1 = 9999
9999 - 1234 = 8765
8765 + 1 = 8766

然而,聰明如你一定發現了,說是補碼的用途是用加法代替減法,可是在以上第二步獲得補碼的關鍵步驟里,不還是要進行減法??這有毛區別?哈,這個就是最讓人興奮的地方,在二進制世界里,你不需要再用減法了,下面以二進制為例子

給出數值y= 1011,那么很明顯,按照最新的補碼求解步驟,補碼 = ( 24 - 1 ) - 1011 + 1,猛然一看,這哪里履行了補碼的承諾,用加法代替減法?那么我們就以二進制的視角去看

y   = 1011

24- 1 = 1111

實際上你已經發現了,這個縮小基數補碼是固定的——給定計算機數值長度n,則縮小基數補碼可以直接寫出:pppp...ppp(n個p,p = 進制 - 1),而關鍵的

1111 - 1011,這一步實際上已經不需要作減法操作了,直接對 y 取反再加上 1 就能得到補碼了(是不是對“取反加一”感到特別耳熟?你是個上課聽課的好孩紙),在此不得不感謝偉大的二進制!需要再次聲明下,這么流暢的操作只有二進制能完成,其他進制想要獲得補碼,依然需要減法。

終章:在神奇的二進制世界中,獲得一個數的補碼只需要簡單的取反再加上一就可以了。那么最后我們來看看,補碼到手之后,又怎么能代替減法呢?

假設需要求解 x - y ( x >= y),那么分為以下步驟

求得y的補碼bn-y
x - y = x + (bn-y ) = x - y + bn (這一步用補碼的加法代替了原數值的減法)
顯然x - y + bn >=bn,然而bn已經超出了數的表示范圍(overflow),直接被丟棄了,最后的結果就等于x - y

1的補碼:這個世界是沒有1進制的,所以1的補碼是一個縮小基數補碼,也就是直接對一個二進制數值取反

總結

以上是生活随笔為你收集整理的什么是Complement(补码)?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。