日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

您好,歡迎進入深圳市穎特新科技有限公司官方網(wǎng)站!

您現(xiàn)在的位置:首頁 新聞資訊 >> 新聞頭條 >> 補碼(為什么按位取反再加一):告訴你一個其實很簡單的問題(轉自醍醐灌頂)
新聞資訊
NEWS INFORMATION

補碼(為什么按位取反再加一):告訴你一個其實很簡單的問題(轉自醍醐灌頂)

發(fā)布時間:2019-05-22

首先,閱讀這篇文章的你,肯定是一個在網(wǎng)上已經(jīng)糾結了很久的讀者,因為你查閱了所有你能查到的資料,然后他們都會很耐心的告訴你,補碼:就是按位取反,然后加一。準確無誤,毫無破綻。但是,你搜遍了所有俯拾即是而且準確無誤的答案,卻仍然選擇來看這篇毫不起眼的文章,原因只有一個,只因為你還沒有得到你想要的東西。

             因為你想要的,不是1+1=2,而是,1+1為什么等于2。當然,我們不討論1+1的問題。我們討論的,是補碼。

             你已經(jīng)困惑了很久,你明明知道補碼就是按位取反,然后加一,但是你想知道的,不是它怎么求滴,而是,它怎來滴。當然,對于閱讀這篇文章的你,既然想要知道這個答案,一定是有一定編程基礎的讀者,肯定知道補碼與有符號數(shù)與無符號數(shù)的關系(有符號數(shù)指帶有正負號的數(shù),無符號可以理解為只大于0的數(shù)),你所查閱的所有資料首先都會用一個8位的二進制數(shù)給你舉例,ok,我們也用一個8位的二進制數(shù)。

             8位二進制數(shù),最小00000000,最大數(shù)11111111,換算十進制為0~255,當然,所有的參考資料都會這樣講,而且這也不是你想要的,但我們必須說下去。1~255,一共255的字符,再加上最前面的0,一共256個字符,F(xiàn)在,我們要用一個8位二進制數(shù)字來表示一個負數(shù),可是二進制里沒有負號,誰都知道二進制里只有0,1,再無其他符號。那么所以我們必須用一種方式來代替正負,也就是我們規(guī)定,當然是人規(guī)定的,而不是電腦,我們規(guī)定這個8位的二進制數(shù)的最前面一位數(shù)來表示這個數(shù)的正負,0代表是正,1代表是負。那么當?shù)谝晃皇?時,我們一共可以表示00000000~01111111這么多正數(shù),因為第一位必須是0來代表正數(shù);當?shù)谝晃皇?時,我們一共可以表示10000000~11111111這么多負數(shù),然后,我們用00000000~01111111來代表0~127,那豈不是10000000~11111111代表  -0  ~  -127??可是網(wǎng)上都說不能有 負0,可是我覺的沒什么不妥啊,負0不還是0 嗎?10-0=10,不就是相當于10+(-0)=10嗎,現(xiàn)在我們不討論正負0的問題,我們來討論一個小學生的問題。

             我們現(xiàn)在要把00000000~11111111分成兩組數(shù),一組是正數(shù),另一組是負數(shù),正數(shù)是0,1,2,3,4,5,6,7,8,… 負數(shù)是 -1,-2,-3,-4,-5,-6,-7,-8,… 那么這里就有一個小學問題,那就是1+(-1)肯定要等于0,2+(-2)=0,他們是相反數(shù),相加等于0,小學生都會。后面都是一樣,那么現(xiàn)在我們使用上面的編碼的方式進行一個計算,現(xiàn)在上面的編碼中 1 對應的二進制是00000001,-1對應的二進制是10000001,然后你把這倆二進制數(shù)加起來,看看等于幾,對,答案是10000010,不是00000000,也不是10000000,  10000010在上面的編碼中代表 -2,00000000和10000000都在上面代表0,可是結果并不是他們。而00000001與10000001分別對應著1和-1,加起來理論的結果應該是0才對,也就是說上面的編碼是錯誤的。

            或許接下來很多資料又討論了反碼,但是我們不,我們來求一個一元一次函數(shù),一個小學的函數(shù),1+x=0,求x=?,答:-1。沒錯,而且準確無誤。那么現(xiàn)在問題來了,前面的正數(shù)編碼應該是沒有錯的,00000000代表0,  00000001代表1,這些都符合我們的習慣,那么出錯的是在后面的負數(shù)編碼上,我們到底該如何編碼對應負數(shù)編碼它才能正確呢,因為我們知道1+(-1)必須等于0,也就是他們對應的二進制相加也必須等于0,1對應00000001,那么00000001+x=00000000,里面的x就應該代替 -1的二進制編碼才對,這樣,我們得到 x=11111111,大家看一下這和按位取反,然后加一的結果一樣嗎。

           所以我們的結論是,一個正數(shù)對應的負數(shù)(也就是倆相反數(shù)),這兩個數(shù)的二進制編碼加起來必須等于0才對,所以我們只要知道其中一個數(shù)的編碼x,然后用0-x就是他對應的數(shù)的編碼,這樣的話,從0~127,我們用(0 - 其中一個二進制數(shù)的編碼)=(另一個二進制數(shù)的編碼),例如 2 的二進制編碼是00000010,那么-2 的二進制編碼就是0 - 00000010=11111110,因為他就應該這樣,因為它就是一個小學問題,他倆加起來就應該等于0。那么1000000對應的編碼是多少呢,當然也必須滿足加起來等于0才行,那么10000000+x=0,求解x,答x=10000000,還是它本身,也就是在00000000~11111111這個范圍里所有的二進制數(shù)都無法滿足它,也就是沒有一個數(shù)加上它等于0,但是兩個數(shù)要有對應的編碼,就必須加起來等于0才行,其實不止它沒有,0也沒有,0+x=0,那么x=0,也是它本身,既然這樣了,那么也沒有辦法了,無可奈何只能做單身漢了,然后我們規(guī)定,既然10000000第一位是1,代表負數(shù),那么我們規(guī)定它是一個負數(shù),那么10000000就代替了-128,而且,它只自己一個人,也就是只有-128,沒有正數(shù)128。

         然后,他們每個數(shù)都有了自己對應的編碼,而且準確無誤。1~127對應-1~ -127,再加上兩個單身漢0和-128。然后呢,不知道誰起的名字,就把這種編碼叫做了補碼,如果你樂意,你也可以給它起個名字。但是呢,還有一個問題,為什么補碼的求法是按位取反再加一呢,其實當你不明白為什么各大書籍都要用按位取反來計算補碼的時候,我們完全可以直接用0減去它就得到他相反數(shù)的二進制編碼了,譬如隨便一個十六進制數(shù) 6C ,那么我們可以直接0-6C就得到他的相反數(shù)的補碼了,結果為十六進制的94,跟按位取反再加一的效果一樣。

         現(xiàn)在我們知道補碼是怎么來的了,也就是為了保證兩個相反數(shù)對應二進制的和必須是0,然后又不知道誰給它起了補碼這個名字。補碼補碼,有沒有感覺兩個相反數(shù)是互補的呢,也就是任意兩個相反數(shù)加起來一定等0,其中一個數(shù)變大,另一個就一定會變小互補保證結果為0。但是你肯定還在糾結,為啥要按位取反,為啥還要加一呢。其實,這涉及到一個二進制減法的問題,你既然知道補碼這個概念,就一定會知道有進位丟失這么個東西,F(xiàn)在我們知道了補碼是怎么來的,也就是(00000000 - 其中一個正數(shù)的補碼)=(這個數(shù)相反數(shù)的補碼),那么我們知道了1的二進制是00000001,那么我們來求-1的補碼,也就是應該00000000 - 00000001=?,我們該怎么計算這個二進制減法呢,而且還是一個小數(shù)減去大數(shù),連借位都沒地方借,前面我們提到進位丟失這個東西,那么我們來計算一個算式,11111111+00000001=?知道進位丟失的你,肯定知道加起來后等于00000000,雖然結果應該是100000000(后面是8個0),但是只能有8位,所以最高位的1丟失了,那么現(xiàn)在好了,也就是說,我們可以把00000000看做(11111111+00000001)因為他倆是相等的,我們已經(jīng)計算過的了,那么我們現(xiàn)在就可以把前面講的公式中的00000000換成(11111111+00000001),也就是我們要計算-1的補碼,我們就0-1的編碼,也就是00000000-00000001,也就是(11111111+00000001)-00000001=(-1的補碼),這個算式我覺的你應該會計算了,大數(shù)減小數(shù),到現(xiàn)在,或許你現(xiàn)在已經(jīng)發(fā)現(xiàn)什么了,是的,你發(fā)現(xiàn)了之前一直迷惑你的一個東西,“按位取反再加一”,但是可能還有一點迷惑,我們繼續(xù),因為我們每次都是用一個0減去一個數(shù)的補碼來得到另一個數(shù)的補碼,也就是里面的(11111111+00000001)是不變的,因為它就是0,那么我們現(xiàn)在要求一個數(shù)的補碼,就是(11111111+00000001)- 一個數(shù)的補碼=它相反數(shù)的補碼,咱們把括號去掉,也就是11111111 - 一個數(shù)的補碼+00000001=它相反數(shù)的補碼,這是加法交換法則,只是把位置交換一下,小學生都會的,然后呢再加個括號方便我們理解,也就是(1111111 - 一個數(shù)的補碼)+00000001=它相反數(shù)的補碼。好了,問題來了,(11111111 - 一個數(shù)的補碼)的結果是什么,這個你心里應該是清楚的,你也可以算一下,它正好的等于它的反碼,也就是按位取反的一個數(shù),其實也好理解,你減幾個數(shù)就看見規(guī)律了,描述好麻煩,現(xiàn)在好了,也就是(11111111 - 一個數(shù)的補碼)=這個數(shù)的反碼,也就是(11111111 - 一個數(shù)的補碼)=把這個數(shù)按位取反,到現(xiàn)在,你應該你已經(jīng)很清楚他是怎么來的了。

         那么我們現(xiàn)在就可以把公式寫成這樣,(11111111 - 一個數(shù)的補碼)+00000001=它相反數(shù)的補碼,現(xiàn)在我們知道了(11111111 - 一個數(shù)的補碼)=把這個數(shù)按位取反,然后把公式里的(11111111 - 一個數(shù)的補碼)換成 “按位取反”,也就是 (按位取反)+000000001=它相反數(shù)的補碼,現(xiàn)在,按位取反,再加一,就終于出來了,這就是各大書籍資料所講的,補碼=按位取反+1..。好了,真相大白

         本文章屬個人領悟,錯誤必有,不吝賜教

聯(lián)系方式0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬眾潤豐創(chuàng)業(yè)園A棟2樓A08

成武县| 平罗县| 闸北区| 天祝| 交口县| 九台市| 新绛县| 定陶县| 临汾市| 勐海县| 西城区| 铜川市| 高青县| 措美县| 穆棱市| 电白县| 宁陕县| 锡林浩特市| 石嘴山市| 龙南县| 陇南市| 南陵县| 娄底市| 慈利县| 定安县| 綦江县| 乡城县| 靖西县| 沅江市| 荥阳市| 郓城县| 全椒县| 东丽区| 福贡县| 上栗县| 遂昌县| 玛纳斯县| 香港| 瑞丽市| 湖北省| 泽普县|