你是如何做減法的?
200-134=?
相信這個問題難不倒你,讀到這句話的時候,你可能已經口算出了答案。讓我們慢一點,來看看我們是如何一步一步做減法的。
你的腦海里可能浮現出了一個詞:借位。沒錯,減法比加法麻煩的就是,它沒有進位,但有借位這個煩人的東西。對於這道題,將它寫成豎式,從最右邊那一列入手,0是小於4的,所以往左邊借一位,再用10減去4得到6。因為我們往左邊的0借了一位,所以實現上這時的0應該變成-1,-1是小於3的,所以我們又要往左邊借一位。你看,借位是多么的麻煩!
那該如何是好呢,大人?
那么如何通過邏輯門來實現這個邏輯呢?嘿!嘿!嘿!看字,別再想了,你簡直是在折磨自己,為了讓自己好過一點,我們需要想辦法來回避借位操作:
什么情況下,被減數不需要借位?格嘰,格嘰,格嘰格嘰,開動你的腦筋。沒錯,每一位都是9的時候!這里的操作數是3,所以我們取3個9減去134。
從一串9中減去一個數,稱為對9求補數
那么現在,原式變成了這樣
因為200-102是個整數,再加上999就進位了。所以我們不妨把減999變成減1000,這樣做減法的時候好算一點
這樣,我們就回避了借位。在十進制中是取對9的補數,那么在二進制中就是使用1了,上面的例子可化為:
第一步,我們用11111111(十進制中為255)減去減數:
在二進制中,對1求補數可以不用減法,因為1減去1為0,1減去0為1,只需要按位取反即可。所以對1求補數,也可以稱為相反數或者反碼
。
第二步,把減數對1的補數與被減數相加
第三步,將所得結果加1
第四步,將所得結果減去100000000(十進制中的256):
結果001000010
相當於十進制的66
有符號數的減法
在計算機中,我們只有0和1,可沒有負號告訴我們這個數是負數。那么如何來表示負數呢?最簡單的當然是用一個二進制數表示負號,當這一位為0時表示正數,當為1時表示負數。不過,根據我們上面的方法,我們用求補數的辦法規定正負數,還能輕松的將正負數相加。不過這種方法也不是十全十美的,缺點就是你得提前知道可能遇到的所有數字的位數。
如果你的花唄額度是500,並且你的余額不超過500,那么你的額度應該在-500到499之間,那我們就可以把:
寫成
這種機制在二進制中稱為2的補數。(求2的補數就是先求1的補數再加1)通俗點就是將0到1000分成兩半,前一半為正,后一半為負。對應到二進制就是,1開頭的為負數,0開頭的為正數。跟一開始的用特定二進制位表示正負數從這里來看,沒有什么區別。01嘛,二進制。
現在134-200
就相當於134加上-200:
10111110是1000010(66)對2的補數,又110111110首位是1代表是負的,所以結果是-66