在搞懂<<、>>、>>>之前,我們需要先了解二進(jìn)制中的源碼、反碼、補(bǔ)碼... 二進(jìn)制中的原碼、反碼、補(bǔ)碼有符號數(shù): 對于有符號數(shù)而言,符號的正、負(fù)機(jī)器是無法識別的,但由于“正、負(fù)”恰好是兩種截然不同的狀態(tài),如果用“0”表示“正”,用“1”表示“負(fù)”,這樣符號也被數(shù)字化了,并且規(guī)定將它放在有效數(shù)字的前面,即組成了有符號數(shù)。所以,在二進(jìn)制中使用最高位(第一位)來表示符號,最高位是0,表示正數(shù);最高位是1,表示負(fù)數(shù)。
100000000000000001111100
無符號數(shù): 無符號數(shù)是針對二進(jìn)制來講的,無符號數(shù)的表數(shù)范圍是非負(fù)數(shù)。全部二進(jìn)制均代表數(shù)值(所有位都用于表示數(shù)的大?。瑳]有符號位。即第一個(gè)"0"或"1"不表示正負(fù)
000000000000000001111100
對于有符號數(shù)而言的性質(zhì): (1)二進(jìn)制的最高位是符號位:0表示正數(shù),1表示負(fù)數(shù) (2)正數(shù)的原碼、反碼、補(bǔ)碼都一樣 (3)負(fù)數(shù)的反碼 = 它的原碼符號位不變,其他位取反(0 ->1 ; 1->0 ) (4)負(fù)數(shù)的補(bǔ)碼 = 它的反碼 +1 (5)0的反碼、補(bǔ)碼都是0 (6)在計(jì)算機(jī)運(yùn)算的時(shí)候,都是以補(bǔ)碼的方式來運(yùn)算的
有符號數(shù)運(yùn)算案例 正數(shù)相加:
例如:1+1 ,在計(jì)算機(jī)中運(yùn)算如下: 1的原碼為: 00000000 00000000 00000000 00000001 反碼:00000000 00000000 00000000 00000001 補(bǔ)碼: 00000000 00000000 00000000 00000001 兩數(shù)的補(bǔ)碼相加: 00000000 00000000 00000000 00000010 ( 轉(zhuǎn)換為10進(jìn)制) = 2 正數(shù)相減:
例如:1 - 2,在計(jì)算機(jī)中運(yùn)算如下: 在計(jì)算機(jī)中減運(yùn)算其實(shí)是作為加運(yùn)算來操作的,所以,1-2 = 1 + ( -2 ) -2的原碼:10000000 00000000 00000000 00000010 -2的反碼:11111111 11111111 11111111 11111101 -2的補(bǔ)碼: 11111111 11111111 11111111 11111110 00000000 00000000 00000000 00000001
+ 11111111 11111111 11111111 11111110 = 11111111 11111111 11111111 11111111 補(bǔ)碼:11111111 11111111 11111111 11111111 = 反碼:11111111 11111111 11111111 11111110 = 原碼:10000000 00000000 00000000 00000001 第五步:將計(jì)算結(jié)果的二進(jìn)制原碼 轉(zhuǎn)換 為十進(jìn)制 二進(jìn)制原碼:10000000 00000000 00000000 00000001 = -1 << 、>>、>>> 位移運(yùn)算符<< 左移運(yùn)算符左移一位 
左移一位后的數(shù)值經(jīng)過計(jì)算可以發(fā)現(xiàn)剛好值位移前數(shù)值的兩倍,等價(jià)于乘2操作,在很多情況下可以當(dāng)做乘2使用,但是并不代表真正的乘2,在一些特殊情況下并不等價(jià) 左移18位 
此時(shí)二進(jìn)制首位為1,此時(shí)數(shù)值為 -1058799616,同理,如果左位移20位,則值為 59768832 又變成了正數(shù) 注意:所以根據(jù)這個(gè)規(guī)則,如果任意一個(gè)十進(jìn)制的數(shù)左位移32位,右邊補(bǔ)位32個(gè)0,十進(jìn)制豈不是都是0了?當(dāng)然不是!?。?當(dāng)int 類型的數(shù)據(jù)進(jìn)行左移的時(shí)候,當(dāng)左移的位數(shù)大于等于32位的時(shí)候,位數(shù)會(huì)先求余數(shù),然后用該余數(shù)進(jìn)行左移,也就是說,如果真的左移32位的時(shí)候,會(huì)先進(jìn)行位數(shù)求余數(shù),即為左移32位相當(dāng)于左移0位 ,所以左移 33 的值和左移一位1 是一樣的
>> 右移運(yùn)算符100 帶符號右移100 源碼補(bǔ)碼均為:00000000 00000000 00000000 01100100 右移四位: 00000000 00000000 00000000 00000110 結(jié)果為:6 -100 帶符號右移-100原碼: 10000000 00000000 00000000 01100100 -100補(bǔ)碼: 保證符號位不變,其余位置取反并加1 11111111 11111111 11111111 10011100
右移4位 : 在高位補(bǔ)1 11111111 11111111 11111111 11111001
補(bǔ)碼形式的移位完成后,結(jié)果不是移位后的結(jié)果,還需要進(jìn)行變換才行。其方法如下: 保留符號位,然后按位取反: 10000000 00000000 00000000 00000110 然后加1,即為所求數(shù)的原碼: 10000000 00000000 00000000 00000111 結(jié)果為:-7 >>> 無符號右移運(yùn)算符無符號右移運(yùn)算符和右移運(yùn)算符是一樣的,不過無符號右移運(yùn)算符在右移的時(shí)候是補(bǔ)0的,而右移運(yùn)算符是補(bǔ)符號位的 100 無符號右移 4 位100 源碼補(bǔ)碼均為:00000000 00000000 00000000 01100100 右移四位: 00000000 00000000 00000000 00000110 結(jié)果為:6 -100無符號右移4位-100原碼: 10000000 00000000 00000000 01100100 -100補(bǔ)碼: 保證符號位不變,其余位置取反并加1 11111111 11111111 11111111 10011100
無符號右移4位 : 在高位補(bǔ)0 00001111 11111111 11111111 11111001
結(jié)果為:268435449 總結(jié):正數(shù)的左移與右移、無符號右移、負(fù)數(shù)的無符號右移,就是相應(yīng)的補(bǔ)碼移位所得,在高位補(bǔ)0即可 負(fù)數(shù)的右移,就是補(bǔ)碼高位補(bǔ)1,然后按位取反加1即可
|