今天在刷到這道題,《劍指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ù)相加的思路:
然后,我就在思考,那么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ǔ)碼是本身。