日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

你真的搞懂了Java中的<<、>>、>>>運(yùn)算符嘛?

 新進(jìn)小設(shè)計(jì) 2021-04-24

在搞懂<<、>>、>>>之前,我們需要先了解二進(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)算案例

  1. 正數(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

  1. 正數(shù)相減:

例如:1 - 2,在計(jì)算機(jī)中運(yùn)算如下:

在計(jì)算機(jī)中減運(yùn)算其實(shí)是作為加運(yùn)算來操作的,所以,1-2 = 1 + ( -2 )

  • 第一步:獲取1的補(bǔ)碼 00000000 00000000 00000000 00000001

  • 第二步:獲取-2的補(bǔ)碼

-2的原碼:10000000 00000000 00000000 00000010

-2的反碼:11111111 11111111 11111111 11111101

-2的補(bǔ)碼: 11111111 11111111 11111111 11111110

  • 第三步:1的補(bǔ)碼與-2的補(bǔ)碼相加:

00000000 00000000 00000000 00000001

+ 11111111 11111111 11111111 11111110

= 11111111 11111111 11111111 11111111

  • 第四步:將計(jì)算結(jié)果的補(bǔ)碼轉(zhuǎn)換為原碼,反其道而行之即可(如果想將二進(jìn)制轉(zhuǎn)換為十進(jìn)制,必須得到二進(jìn)制的原碼)

補(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即可

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多