十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問題一站解決
取一個(gè)數(shù)的相反數(shù),可以用數(shù)學(xué)運(yùn)算來實(shí)現(xiàn):-1 * x的結(jié)果就是x的相反數(shù)。
創(chuàng)新互聯(lián)建站總部坐落于成都市區(qū),致力網(wǎng)站建設(shè)服務(wù)有成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè)、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)絡(luò)營(yíng)銷策劃、網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站維護(hù)、公眾號(hào)搭建、重慶小程序開發(fā)、軟件開發(fā)等為企業(yè)提供一整套的信息化建設(shè)解決方案。創(chuàng)造真正意義上的網(wǎng)站建設(shè),為互聯(lián)網(wǎng)品牌在互動(dòng)行銷領(lǐng)域創(chuàng)造價(jià)值而不懈努力!
很多語(yǔ)言都是采用 ~ 作為按位取反運(yùn)算符,Go 里面采用的是 ^ 。
如果作為二元運(yùn)算符,^ 表示按位異或,即:對(duì)應(yīng)位相同為 0,相異為 1。
操作符 ^,按位置零,例如:z = x ^ y,表示如果 y 中的 bit 位為 1,則 z 對(duì)應(yīng) bit 位為 0,否則 z 對(duì)應(yīng) bit 位等于 x 中相應(yīng)的 bit 位的值。
對(duì)于有符號(hào)的整數(shù)來說,是按照補(bǔ)碼進(jìn)行取反操作的(快速計(jì)算方法:對(duì)數(shù) a 取反,結(jié)果為 -(a+1) ),對(duì)于無(wú)符號(hào)整數(shù)來說就是按位取反
計(jì)算過程
以3為例? 3在內(nèi)存中補(bǔ)碼為 0*** 0011
取反? ? ? ? ? ? 1*** 1100
-1操作? ? ? ? ? 1*** 1011
除符號(hào)位取反? ? 1*** 0100 結(jié)果為-4
-------------------------------------------
以9為例 9在內(nèi)存中補(bǔ)碼為 0*** 1001
取反? ? ? ? ? ? 1*** 0110
-1操作? ? ? ? ? 1*** 0101
除符號(hào)位取反? ? 1*** 1010 結(jié)果為-10
-------------------------------------------
以-5為例 -5在內(nèi)存中為的補(bǔ)碼為 1*** 1011
為什么呢
-5源碼? ? ? ? ? 1*** 0101
除符號(hào)取反? ? ? 1*** 1010
+1操作? ? ? ? ? 1*** 1011
-------------------------------------------
那么-5取反怎么算
補(bǔ)碼 1***1011取反為 0***0100
因?yàn)榉?hào)位為0,所以是正數(shù)了,正數(shù)的補(bǔ)碼反碼源碼都是一個(gè),所以是4
===================================
再看-1
-1源碼? ? ? ? ? 1*** 0001
除符號(hào)取反? ? ? 1*** 1110
+1操作? ? ? ? ? 1*** 1111
補(bǔ)碼 1*** 1111 取反為 0*** 0000
因?yàn)榉?hào)位為0,所以是正數(shù)了,正數(shù)的補(bǔ)碼反碼源碼都是一個(gè),所以是0
go語(yǔ)言取反輸出的例子看這里
想要知道取反計(jì)算過程,首先搞懂? “原碼“,“反碼”,“補(bǔ)碼”,“取反”。
0變1,1變0
原碼是計(jì)算機(jī)機(jī)器數(shù)中最簡(jiǎn)單的一種形式,數(shù)值位就是真值的絕對(duì)值。原碼表示法在最高位為符號(hào):正數(shù)該位為0,負(fù)數(shù)該位為1,原碼又稱帶符號(hào)的絕對(duì)值。看整數(shù)9及-9的原碼如下:
9的原碼:0000 1001
-9的原碼: 1000 1001
重點(diǎn):對(duì)于源碼,絕對(duì)值相等的正數(shù)和負(fù)數(shù)只有符號(hào)位不同。
反碼通常是用來由原碼求補(bǔ)碼或者由補(bǔ)碼求原碼的過渡碼。正數(shù)的反碼就是其原碼,負(fù)數(shù)的反碼就是將原碼除符號(hào)位以外每位取反(0變1,1變0)。例如:
9的反碼:0000 1001
-9的反碼:1111 0110
在計(jì)算機(jī)系統(tǒng)中,數(shù)值一律用補(bǔ)碼來表示和存儲(chǔ)。正數(shù)的原碼就是其補(bǔ)碼。負(fù)數(shù)的補(bǔ)碼是其反碼+1.例如:
9的補(bǔ)碼:0000 1001
-9的補(bǔ)碼:1111 0111
正整數(shù)的原碼、反碼、補(bǔ)碼都是一樣的。負(fù)數(shù)的反碼是除符號(hào)位其他每一位取反,負(fù)數(shù)的補(bǔ)碼是其反碼+1
首先明確一個(gè)概念,由于在計(jì)算機(jī)中二進(jìn)制都是以其補(bǔ)碼形式存放在內(nèi)存中的。所以要知道 ^9 就是對(duì) 9 的補(bǔ)碼取反,也就是說無(wú)論是整數(shù)還是負(fù)數(shù)對(duì)其取反都是對(duì)其補(bǔ)碼取反。
正數(shù)9:
原碼為: 0000 1001
反碼為: 0000 1001
補(bǔ)碼為: 0000 1001
1. 取反結(jié)果=負(fù)數(shù)補(bǔ)碼 :0000 1001 --- (取反) 1111 0110?
注:由于 ^ 位取反操作符,對(duì)于符號(hào)位也會(huì)取反 所以這里得到一個(gè)負(fù)數(shù)的補(bǔ)碼,想要計(jì)算其真實(shí)的值。還需要將其轉(zhuǎn)換成原碼。
2. 得反碼:1111 0110? -? 1? =??1111 0101
補(bǔ)碼 = 反碼 + 1 (反推) 反碼?= 補(bǔ)碼 - 1
3. 得原碼?1111 0101 -- 1111 1010 = -10
原碼? =? 反碼取反
負(fù)數(shù)-9:
原碼為: 1111 1001
反碼為: 1111 0110
補(bǔ)碼為: 1111 0111
1. 取反結(jié)果=正數(shù)補(bǔ)碼?1111 0111 ----?0000 1000
2. 正數(shù)原碼 = 反碼 = 補(bǔ)碼 =?0000 1000 = 8