你真的搞懂了Java中的<<、>>、>>>運算符嘛?


在搞懂<<、>>、>>>之前,我們需要先了解二進制中的源碼、反碼、補碼...

二進制中的原碼、反碼、補碼

有符號數:

對於有符號數而言,符號的正、負機器是無法識別的,但由於“正、負”恰好是兩種截然不同的狀態,如果用“0”表示“正”,用“1”表示“負”,這樣符號也被數字化了,並且規定將它放在有效數字的前面,即組成了有符號數。所以,在二進制中使用最高位(第一位)來表示符號,最高位是0,表示正數;最高位是1,表示負數。

100000000000000001111100

無符號數:

無符號數是針對二進制來講的,無符號數的表數范圍是非負數。全部二進制均代表數值(所有位都用於表示數的大小),沒有符號位。即第一個"0"或"1"不表示正負

000000000000000001111100

對於有符號數而言的性質:

(1)二進制的最高位是符號位:0表示正數,1表示負數

(2)正數的原碼、反碼、補碼都一樣

(3)負數的反碼 = 它的原碼符號位不變,其他位取反(0 ->1 ; 1->0 )

(4)負數的補碼 = 它的反碼 +1

(5)0的反碼、補碼都是0

(6)在計算機運算的時候,都是以補碼的方式來運算的

有符號數運算案例

  1. 正數相加:

​ 例如:1+1 ,在計算機中運算如下:

​ 1的原碼為: 00000000 00000000 00000000 00000001

​ 反碼: 00000000 00000000 00000000 00000001

​ 補碼: 00000000 00000000 00000000 00000001

​ 兩數的補碼相加: 00000000 00000000 00000000 00000010( 轉換為10進制) = 2

  1. 正數相減:

​ 例如:1 - 2,在計算機中運算如下:

​ 在計算機中減運算其實是作為加運算來操作的,所以,1-2 = 1 + ( -2 )

  • 第一步:獲取1的補碼 00000000 00000000 00000000 00000001

  • 第二步:獲取-2的補碼

​ -2的原碼:10000000 00000000 00000000 00000010

​ -2的反碼:11111111 11111111 11111111 11111101

​ -2的補碼: 11111111 11111111 11111111 11111110

  • 第三步:1的補碼與-2的補碼相加:

00000000 00000000 00000000 00000001

​ + 11111111 11111111 11111111 11111110

​ = 11111111 11111111 11111111 11111111

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

​ 補碼:11111111 11111111 11111111 11111111

​ =

​ 反碼:11111111 11111111 11111111 11111110

​ =

​ 原碼:10000000 00000000 00000000 00000001

​ 第五步:將計算結果的二進制原碼 轉換 為十進制

​ 二進制原碼:10000000 00000000 00000000 00000001 = -1

<< 、>>、>>> 位移運算符

<< 左移運算符

左移一位

​ 左移一位后的數值經過計算可以發現剛好值位移前數值的兩倍,等價於乘2操作,在很多情況下可以當做乘2使用,但是並不代表真正的乘2,在一些特殊情況下並不等價

左移18位

​ 此時二進制首位為1,此時數值為 -1058799616,同理,如果左位移20位,則值為 59768832 又變成了正數

注意:所以根據這個規則,如果任意一個十進制的數左位移32位,右邊補位32個0,十進制豈不是都是0了?當然不是!!! 當int 類型的數據進行左移的時候,當左移的位數大於等於32位的時候,位數會先求余數,然后用該余數進行左移,也就是說,如果真的左移32位的時候,會先進行位數求余數,即為左移32位相當於左移0位 ,所以左移 33 的值和左移一位1 是一樣的

>> 右移運算符

100 帶符號右移

​ 100 源碼補碼均為:00000000 00000000 00000000 01100100

​ 右移四位: 00000000 00000000 00000000 00000110

結果為:6

-100 帶符號右移

​ -100原碼: 10000000 00000000 00000000 01100100

​ -100補碼: 保證符號位不變,其余位置取反並加1

11111111 11111111 11111111 10011100

​ 右移4位 : 在高位補1

11111111 11111111 11111111 11111001

​ 補碼形式的移位完成后,結果不是移位后的結果,還需要進行變換才行。其方法如下:

​ 保留符號位,然后按位取反: 10000000 00000000 00000000 00000110

​ 然后加1,即為所求數的原碼: 10000000 00000000 00000000 00000111

結果為:-7

>>> 無符號右移運算符

無符號右移運算符和右移運算符是一樣的,不過無符號右移運算符在右移的時候是補0的,而右移運算符是補符號位的

100 無符號右移 4 位

​ 100 源碼補碼均為:00000000 00000000 00000000 01100100

​ 右移四位: 00000000 00000000 00000000 00000110

結果為:6

-100無符號右移4位

​ -100原碼: 10000000 00000000 00000000 01100100

​ -100補碼: 保證符號位不變,其余位置取反並加1

11111111 11111111 11111111 10011100

​ 無符號右移4位 : 在高位補0

00001111 11111111 11111111 11111001

結果為:268435449

總結:正數的左移與右移、無符號右移、負數的無符號右移,就是相應的補碼移位所得,在高位補0即可

​ 負數的右移,就是補碼高位補1,然后按位取反加1即可

此文章為視頻筆記,視頻講解地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM