不用加減乘除,實(shí)現(xiàn)兩數(shù)相減

今天在刷到這道題,《劍指offer》上實(shí)現(xiàn)了兩數(shù)相加,想了一下兩數(shù)相減的思路

設(shè)被減數(shù)x=10,減數(shù)y=7,那么一次異或后:

? 1010

^ 0111

? ?1101

兩數(shù)相減,0^0=0,0^1=1,1^0=1,1^1=0,可以發(fā)現(xiàn)只有0-1的時(shí)候,我們需要向高位借位,但是當(dāng)前為答案也是0^1的結(jié)果。

那么我們下步目標(biāo),應(yīng)該求出那些位置是需要向高位借位的。其實(shí)一次異或后的結(jié)果&減數(shù),位置為1的都是需要借位的。因?yàn)橄鄳?yīng)的位置可以反推出被減數(shù)是0,減數(shù)是1。

所以就有類(lèi)似于兩數(shù)相加的思路:


兩數(shù)相減代碼

然后,我就在思考,那么8-10會(huì)得出正確的答案么,事實(shí)上也是正確的。

因?yàn)閍<b,所以b會(huì)不斷得向高位借位,導(dǎo)致b溢出,變成了-2147483648(2^-31),負(fù)數(shù)和正數(shù)異或時(shí),也是需要變成補(bǔ)碼后,再操作,最后再變回源碼。

ps:b變成-2147483648過(guò)程:b會(huì)不斷左移,知道變成int能表示的最大值,2^31-1(最高位為0 ,表正數(shù)),左移1位,最高位是1,變成了int能表示的最小數(shù)了。而且-2147483648的補(bǔ)碼就是本身,因?yàn)榘凑照Hネ蒲a(bǔ)碼,答案應(yīng)該是0,但是0的源碼,反碼,補(bǔ)碼都是0,這樣會(huì)形成沖突,所以,我們規(guī)定了-2147483648補(bǔ)碼是本身。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容